@versatiledatakit/data-pipelines
Version:
Data Pipelines help Data Engineers develop, deploy, run, and manage data processing workloads (called 'Data Job')
1 lines • 988 kB
Source Map (JSON)
{"version":3,"file":"versatiledatakit-data-pipelines.mjs","sources":["../../../projects/data-pipelines/src/lib/shared/directives/attribute.directive.ts","../../../projects/data-pipelines/src/lib/shared/directives/index.ts","../../../projects/data-pipelines/src/lib/shared/pipes/contacts-present.pipe.ts","../../../projects/data-pipelines/src/lib/shared/pipes/execution-success-rate.pipe.ts","../../../projects/data-pipelines/src/lib/model/config.model.ts","../../../projects/data-pipelines/src/lib/model/constants.model.ts","../../../projects/data-pipelines/src/lib/model/data-job-base.model.ts","../../../projects/data-pipelines/src/lib/model/data-job.model.ts","../../../projects/data-pipelines/src/lib/model/data-job-executions.model.ts","../../../projects/data-pipelines/src/lib/model/grid-config.model.ts","../../../projects/data-pipelines/src/lib/model/toast-definitions.model.ts","../../../projects/data-pipelines/src/lib/model/index.ts","../../../projects/data-pipelines/src/lib/shared/pipes/extract-job-status.pipe.ts","../../../projects/data-pipelines/src/lib/shared/pipes/format-delta.pipe.ts","../../../projects/data-pipelines/src/lib/shared/pipes/format-schedule.pipe.ts","../../../projects/data-pipelines/src/lib/shared/pipes/parse-epoch.pipe.ts","../../../projects/data-pipelines/src/lib/shared/pipes/parse-next-run.pipe.ts","../../../projects/data-pipelines/src/lib/shared/pipes/extract-contacts.pipe.ts","../../../projects/data-pipelines/src/lib/shared/pipes/index.ts","../../../projects/data-pipelines/src/lib/shared/model/modal-options.ts","../../../projects/data-pipelines/src/lib/shared/components/modal/modal.component.ts","../../../projects/data-pipelines/src/lib/shared/components/confirmation-dialog-modal/confirmation-dialog-modal.component.ts","../../../projects/data-pipelines/src/lib/shared/components/confirmation-dialog-modal/confirmation-dialog-modal.component.html","../../../projects/data-pipelines/src/lib/shared/components/confirmation-dialog-modal/index.ts","../../../projects/data-pipelines/src/lib/shared/model/index.ts","../../../projects/data-pipelines/src/lib/shared/components/modal/index.ts","../../../projects/data-pipelines/src/lib/shared/components/delete-modal/delete-modal.component.ts","../../../projects/data-pipelines/src/lib/shared/components/delete-modal/delete-modal.component.html","../../../projects/data-pipelines/src/lib/shared/components/delete-modal/index.ts","../../../projects/data-pipelines/src/lib/shared/components/executions-timeline/executions-timeline.component.ts","../../../projects/data-pipelines/src/lib/shared/components/executions-timeline/executions-timeline.component.html","../../../projects/data-pipelines/src/lib/shared/components/executions-timeline/index.ts","../../../projects/data-pipelines/src/lib/shared/components/quick-filters/quick-filters.component.ts","../../../projects/data-pipelines/src/lib/shared/components/quick-filters/quick-filters.component.html","../../../projects/data-pipelines/src/lib/shared/components/data-grid/grid-action/grid-action.component.ts","../../../projects/data-pipelines/src/lib/shared/components/data-grid/grid-action/grid-action.component.html","../../../projects/data-pipelines/src/lib/shared/components/data-grid/grid-action/index.ts","../../../projects/data-pipelines/src/lib/shared/components/data-grid/column-filter/column-filter.component.ts","../../../projects/data-pipelines/src/lib/shared/components/data-grid/column-filter/column-filter.component.html","../../../projects/data-pipelines/src/lib/shared/components/data-grid/column-filter/index.ts","../../../projects/data-pipelines/src/lib/shared/components/data-grid/index.ts","../../../projects/data-pipelines/src/lib/shared/components/quick-filters/model/index.ts","../../../projects/data-pipelines/src/lib/shared/components/quick-filters/index.ts","../../../projects/data-pipelines/src/lib/shared/components/status/status-panel/status-panel.component.ts","../../../projects/data-pipelines/src/lib/shared/components/status/status-panel/status-panel.component.html","../../../projects/data-pipelines/src/lib/shared/components/status/status-cell/status-cell.component.ts","../../../projects/data-pipelines/src/lib/shared/components/status/status-cell/status-cell.component.html","../../../projects/data-pipelines/src/lib/shared/components/status/index.ts","../../../projects/data-pipelines/src/lib/shared/components/widget-value/widget-value.component.ts","../../../projects/data-pipelines/src/lib/shared/components/widget-value/widget-value.component.html","../../../projects/data-pipelines/src/lib/shared/components/widget-value/index.ts","../../../projects/data-pipelines/src/lib/shared/components/empty-state/empty-state.component.ts","../../../projects/data-pipelines/src/lib/shared/components/empty-state/empty-state.component.html","../../../projects/data-pipelines/src/lib/shared/components/empty-state/index.ts","../../../projects/data-pipelines/src/lib/shared/components/index.ts","../../../projects/data-pipelines/src/lib/services/data-jobs-base.api.service.ts","../../../projects/data-pipelines/src/lib/shared/utils/cron.util.ts","../../../projects/data-pipelines/src/lib/shared/utils/data-job.util.ts","../../../projects/data-pipelines/src/lib/shared/utils/date.util.ts","../../../projects/data-pipelines/src/lib/shared/utils/error.util.ts","../../../projects/data-pipelines/src/lib/shared/utils/string.util.ts","../../../projects/data-pipelines/src/lib/shared/utils/index.ts","../../../projects/data-pipelines/src/lib/services/data-jobs-public.api.service.ts","../../../projects/data-pipelines/src/lib/services/data-jobs.api.service.ts","../../../projects/data-pipelines/src/lib/state/actions/data-jobs.actions.ts","../../../projects/data-pipelines/src/lib/state/actions/index.ts","../../../projects/data-pipelines/src/lib/services/data-jobs.service.ts","../../../projects/data-pipelines/src/lib/services/index.ts","../../../projects/data-pipelines/src/lib/state/tasks/data-job.tasks.ts","../../../projects/data-pipelines/src/lib/state/tasks/index.ts","../../../projects/data-pipelines/src/lib/state/error-codes/data-job.error-codes.ts","../../../projects/data-pipelines/src/lib/state/error-codes/index.ts","../../../projects/data-pipelines/src/lib/state/effects/data-jobs.effects.ts","../../../projects/data-pipelines/src/lib/state/effects/index.ts","../../../projects/data-pipelines/src/lib/shared/pipes/format-duration.pipe.ts","../../../projects/data-pipelines/src/lib/components/base-grid/data-jobs-base-grid.component.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-execution-status/data-job-execution-status.component.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-execution-status/data-job-execution-status.component.html","../../../projects/data-pipelines/src/lib/components/data-jobs-explore/components/grid/data-jobs-explore-grid.component.ts","../../../projects/data-pipelines/src/lib/components/data-jobs-explore/components/grid/data-jobs-explore-grid.component.html","../../../projects/data-pipelines/src/lib/components/data-jobs-explore/data-jobs-explore-page.component.ts","../../../projects/data-pipelines/src/lib/components/data-jobs-explore/data-jobs-explore-page.component.html","../../../projects/data-pipelines/src/lib/components/data-jobs-explore/index.ts","../../../projects/data-pipelines/src/lib/components/data-jobs-explore/components/grid/index.ts","../../../projects/data-pipelines/src/lib/components/data-jobs-manage/components/grid/data-jobs-manage-grid.component.ts","../../../projects/data-pipelines/src/lib/components/data-jobs-manage/components/grid/data-jobs-manage-grid.component.html","../../../projects/data-pipelines/src/lib/components/data-jobs-manage/data-jobs-manage-page.component.ts","../../../projects/data-pipelines/src/lib/components/data-jobs-manage/data-jobs-manage-page.component.html","../../../projects/data-pipelines/src/lib/components/data-jobs-manage/index.ts","../../../projects/data-pipelines/src/lib/components/data-jobs-manage/components/grid/index.ts","../../../projects/data-pipelines/src/lib/components/data-job/data-job-page.component.ts","../../../projects/data-pipelines/src/lib/components/data-job/data-job-page.component.html","../../../projects/data-pipelines/src/lib/components/data-job/index.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/details/data-job-details-page.component.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/details/data-job-details-page.component.html","../../../projects/data-pipelines/src/lib/components/data-job/pages/details/index.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-deployment-details-modal/data-job-deployment-details-modal.component.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-deployment-details-modal/data-job-deployment-details-modal.component.html","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-deployment-details-modal/index.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-execution-status/index.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-execution-status-filter/data-job-execution-status-filter.component.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-execution-status-filter/data-job-execution-status-filter.component.html","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-execution-status-filter/index.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-execution-type/data-job-execution-type.component.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-execution-type/data-job-execution-type.component.html","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-execution-type/index.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-execution-type-filter/data-job-execution-type-filter.component.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-execution-type-filter/data-job-execution-type-filter.component.html","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-execution-type-filter/index.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/model/data-job-execution.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/model/executions-filters.model.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/model/index.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-executions-grid/criteria/status/executions-status.criteria.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-executions-grid/criteria/status/index.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-executions-grid/criteria/string/executions-string.criteria.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-executions-grid/criteria/string/index.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-executions-grid/criteria/type/executions-type.criteria.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-executions-grid/criteria/type/index.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-executions-grid/criteria/index.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-executions-grid/comparators/default/execution-default.comparator.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-executions-grid/comparators/default/index.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-executions-grid/comparators/date/execution-date.comparator.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-executions-grid/comparators/date/index.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-executions-grid/comparators/duration/execution-duration.comparator.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-executions-grid/comparators/duration/index.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-executions-grid/comparators/index.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-executions-grid/data-job-executions-grid.component.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-executions-grid/data-job-executions-grid.component.html","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-executions-grid/index.ts","../../../projects/data-pipelines/src/lib/commons/filters-manager/filters-sort-manager.ts","../../../projects/data-pipelines/src/lib/commons/filters-manager/index.ts","../../../projects/data-pipelines/src/lib/commons/index.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-executions-page/criteria/time-period/executions-time-period.criteria.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-executions-page/criteria/time-period/index.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/time-period-filter/time-period-filter.component.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/time-period-filter/time-period-filter.component.html","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/execution-status-chart/execution-status-chart.component.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/execution-status-chart/execution-status-chart.component.html","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/execution-duration-chart/execution-duration-chart.component.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/execution-duration-chart/execution-duration-chart.component.html","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-executions-page/data-job-executions-page.component.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-executions-page/data-job-executions-page.component.html","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/data-job-executions-page/index.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/execution-duration-chart/index.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/execution-status-chart/index.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/time-period-filter/index.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/index.ts","../../../projects/data-pipelines/src/lib/components/widgets/data-jobs-widget-one.component.ts","../../../projects/data-pipelines/src/lib/components/widgets/data-jobs-widget-one.component.html","../../../projects/data-pipelines/src/lib/components/widgets/data-jobs-executions-widget/data-jobs-executions-widget.component.ts","../../../projects/data-pipelines/src/lib/components/widgets/data-jobs-executions-widget/data-jobs-executions-widget.component.html","../../../projects/data-pipelines/src/lib/components/widgets/data-jobs-executions-widget/index.ts","../../../projects/data-pipelines/src/lib/components/widgets/data-jobs-failed-widget/data-jobs-failed-widget.component.ts","../../../projects/data-pipelines/src/lib/components/widgets/data-jobs-failed-widget/data-jobs-failed-widget.component.html","../../../projects/data-pipelines/src/lib/components/widgets/data-jobs-failed-widget/index.ts","../../../projects/data-pipelines/src/lib/components/widgets/widget-execution-status-gauge/widget-execution-status-gauge.component.ts","../../../projects/data-pipelines/src/lib/components/widgets/widget-execution-status-gauge/widget-execution-status-gauge.component.html","../../../projects/data-pipelines/src/lib/components/widgets/data-jobs-health-panel/data-jobs-health-panel.component.ts","../../../projects/data-pipelines/src/lib/components/widgets/data-jobs-health-panel/data-jobs-health-panel.component.html","../../../projects/data-pipelines/src/lib/components/widgets/data-jobs-health-panel/index.ts","../../../projects/data-pipelines/src/lib/components/widgets/widget-execution-status-gauge/index.ts","../../../projects/data-pipelines/src/lib/components/widgets/index.ts","../../../projects/data-pipelines/src/lib/vdk-data-pipelines.module.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/details/public-api.ts","../../../projects/data-pipelines/src/lib/components/data-job/pages/executions/public-api.ts","../../../projects/data-pipelines/src/lib/components/data-job/public-api.ts","../../../projects/data-pipelines/src/lib/components/data-jobs-explore/public-api.ts","../../../projects/data-pipelines/src/lib/components/data-jobs-manage/public-api.ts","../../../projects/data-pipelines/src/lib/components/widgets/public-api.ts","../../../projects/data-pipelines/src/lib/components/public-api.ts","../../../projects/data-pipelines/src/lib/services/public-api.ts","../../../projects/data-pipelines/src/lib/model/public-api.ts","../../../projects/data-pipelines/src/public-api.ts","../../../projects/data-pipelines/src/versatiledatakit-data-pipelines.ts"],"sourcesContent":["/*\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Directive, ElementRef, Input, OnChanges, OnInit, Renderer2, SimpleChanges } from '@angular/core';\n\nimport { CollectionsUtil, PrimitivesNil, TaurusObject } from '@versatiledatakit/shared';\n\nexport interface Attributes {\n [attribute: string]: PrimitivesNil;\n}\n\n/**\n * ** Directive that set provided object as Element attributes.\n *\n * @author gorankokin\n */\n@Directive({\n selector: '[libSetAttributes]'\n})\nexport class AttributesDirective extends TaurusObject implements OnInit, OnChanges {\n /**\n * ** Input attributes that should be applied to host element.\n */\n @Input() attributes: Attributes;\n\n private _attributesCopy: Attributes;\n\n /**\n * ** Constructor.\n */\n constructor(\n private readonly el: ElementRef,\n private readonly renderer: Renderer2\n ) {\n super();\n }\n\n /**\n * @inheritDoc\n */\n ngOnChanges(_changes: SimpleChanges) {\n this._transformAttributes();\n }\n\n /**\n * @inheritDoc\n */\n ngOnInit() {\n this._transformAttributes();\n }\n\n private _transformAttributes(): void {\n if (CollectionsUtil.isEqual(this.attributes, this._attributesCopy)) {\n return;\n }\n\n if (CollectionsUtil.isNil(this.attributes)) {\n if (CollectionsUtil.isNil(this._attributesCopy)) {\n return;\n }\n\n CollectionsUtil.iterateObject(this._attributesCopy, (_attributeValue, attributeName) => {\n this._removeAttribute(attributeName);\n });\n\n return;\n }\n\n if (!CollectionsUtil.isLiteralObject(this.attributes)) {\n return;\n }\n\n this._attributesCopy = CollectionsUtil.cloneDeep(this.attributes);\n\n CollectionsUtil.iterateObject(this._attributesCopy, (attributeValue, attributeName) => {\n this._setOrRemoveAttribute(attributeName, attributeValue);\n });\n }\n\n private _setOrRemoveAttribute(attributeName: string, attributeValue: unknown): void {\n if (AttributesDirective._isTruthy(attributeValue)) {\n this._setAttribute(attributeName, attributeValue);\n } else {\n this._removeAttribute(attributeName);\n }\n }\n\n private _setAttribute(attributeName: string, attributeValue: unknown): void {\n this.renderer.setAttribute(this.el.nativeElement, attributeName, attributeValue as string);\n }\n\n private _removeAttribute(attributeName: string): void {\n this.renderer.removeAttribute(this.el.nativeElement, attributeName);\n }\n\n // eslint-disable-next-line @typescript-eslint/member-ordering,@typescript-eslint/no-explicit-any\n private static _isTruthy(value: any): boolean {\n return AttributesDirective._valueNotIn(value, [undefined, false, null, 'delete', 'false', '']);\n }\n\n // eslint-disable-next-line @typescript-eslint/member-ordering,@typescript-eslint/no-explicit-any\n private static _valueNotIn(value: any, forbiddenValues: any[]): boolean {\n return forbiddenValues.every((prop) => value !== prop);\n }\n}\n","/*\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport * from './attribute.directive';\n","/*\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Pipe, PipeTransform } from '@angular/core';\n\nimport { CollectionsUtil } from '@versatiledatakit/shared';\n\nimport { DataJobContacts } from '../../model';\n\n@Pipe({\n name: 'contactsPresent'\n})\nexport class ContactsPresentPipe implements PipeTransform {\n /**\n * @inheritDoc\n */\n transform(contacts: DataJobContacts): boolean {\n return (\n CollectionsUtil.isDefined(contacts) &&\n (ContactsPresentPipe.contactIsPresent(contacts.notifiedOnJobSuccess) ||\n ContactsPresentPipe.contactIsPresent(contacts.notifiedOnJobDeploy) ||\n ContactsPresentPipe.contactIsPresent(contacts.notifiedOnJobFailureUserError) ||\n ContactsPresentPipe.contactIsPresent(contacts.notifiedOnJobFailurePlatformError))\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n private static contactIsPresent(contacts: string[]): boolean {\n return CollectionsUtil.isArray(contacts) && contacts.length > 0;\n }\n}\n","/*\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Inject, LOCALE_ID, Pipe, PipeTransform } from '@angular/core';\nimport { PercentPipe } from '@angular/common';\n\nimport { CollectionsUtil } from '@versatiledatakit/shared';\n\nimport { DataJobDeployment } from '../../model';\n\n@Pipe({\n name: 'executionSuccessRate'\n})\nexport class ExecutionSuccessRatePipe implements PipeTransform {\n private readonly _percentPipe: PercentPipe;\n\n /**\n * ** Constructor.\n */\n constructor(@Inject(LOCALE_ID) readonly localeId: string) {\n this._percentPipe = new PercentPipe(localeId);\n }\n\n /**\n * @inheritDoc\n */\n transform(deployments: DataJobDeployment[]): string {\n let result = '';\n\n if (CollectionsUtil.isArrayEmpty(deployments)) {\n return result;\n }\n\n const firstDeployment = deployments[0];\n const allExecutions = firstDeployment.successfulExecutions + firstDeployment.failedExecutions;\n\n if (allExecutions === 0) {\n return result;\n }\n\n result += this._percentPipe.transform(firstDeployment.successfulExecutions / allExecutions, '1.2-2');\n\n if (firstDeployment.failedExecutions > 0) {\n result += ` (${firstDeployment.failedExecutions} failed)`;\n }\n\n return result;\n }\n}\n","/*\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Type } from '@angular/core';\n\nimport { Observable } from 'rxjs';\n\nimport { DisplayMode } from './grid-config.model';\n\nexport const MISSING_DEFAULT_TEAM_MESSAGE = 'The defaultOwnerTeamName property need to be set for the DATA_PIPELINES_CONFIGS';\n\nexport const RESERVED_DEFAULT_TEAM_NAME_MESSAGE = `The 'default' value is reserved, and can not be used for defaultOwnerTeamName property`;\n\n/**\n * ** Configuration map for Data Pipelines library.\n */\nexport interface DataPipelinesConfig {\n resourceServer?: {\n getUrl?: () => string;\n };\n\n defaultOwnerTeamName: string;\n ownerTeamNamesObservable?: Observable<string[]>;\n /**\n * @deprecated\n */\n showLogsInsightUrl?: boolean;\n\n /**\n * @deprecated\n */\n showExecutionsPage?: boolean;\n /**\n * ** Flag instruction to show or hide tab for lineage page.\n */\n showLineagePage?: boolean;\n\n /**\n * ** Documentation url for Data Pipelines.\n */\n dataPipelinesDocumentationUrl?: string;\n\n // health status url configured by a segment after hostname, including slash with {0} for the id param,\n healthStatusUrl?: string; // eg: /dev-center/health-status?dataJob={0}\n\n /**\n * ** Data Job change history configuration.\n */\n changeHistory?: {\n /**\n * ** Url template to external/internal system.\n */\n urlTemplate: string;\n /**\n * ** Confirmation title if url template is to external system.\n */\n confirmationTitle: string;\n /**\n * ** Confirmation message component if url template is to external system.\n */\n confirmationMessageComponent: Type<any>;\n };\n\n /**\n * ** Reference to Explore Data Job(s) configuration map.\n */\n exploreConfig?: ExploreConfig;\n /**\n ** Reference to Manage Data Job(s) configuration map.\n */\n manageConfig?: ManageConfig;\n\n /**\n * ** Integration providers from Host application.\n */\n integrationProviders?: {\n /**\n * ** Users related.\n */\n users?: {\n /**\n * ** Get logged User email.\n */\n getEmail?: () => string;\n /**\n * ** Get logged User username.\n */\n getUsername?: () => string;\n };\n /**\n * ** Teams related.\n */\n teams?: {\n /**\n * ** Ensure User membership in early access program identified by its name.\n */\n ensureMembershipEarlyAccessProgram?: (key: string) => boolean;\n };\n };\n}\n\n/**\n * ** Configuration map for Explore Data Job(s).\n */\nexport interface ExploreConfig {\n /**\n * ** Shot Teams column in Explore Data Jobs list.\n */\n showTeamsColumn?: boolean;\n /**\n * ** Show Teams section in Explore Data Job details.\n */\n showTeamSectionInJobDetails?: boolean;\n /**\n * ** Show Change history section in Explore Data Job details.\n */\n showChangeHistorySectionInJobDetails?: boolean;\n}\n\n/**\n * ** Configuration map for Manage Data Job(s).\n */\nexport interface ManageConfig {\n /**\n * ** Shot Teams column in Manage Data Jobs list.\n */\n showTeamsColumn?: boolean;\n /**\n * ** Show Teams section in Manage Data Job details.\n */\n showTeamSectionInJobDetails?: boolean;\n /**\n * ** Show Change history section in Manage Data Job details.\n */\n showChangeHistorySectionInJobDetails?: boolean;\n selectedTeamNameObservable?: Observable<string>;\n filterByTeamName?: boolean;\n displayMode?: DisplayMode;\n /**\n * ** Allow keytab download in Manage Data Job details.\n */\n allowKeyTabDownloads?: boolean;\n}\n","/*\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { InjectionToken } from '@angular/core';\n\nimport { DataPipelinesConfig } from './config.model';\n\n/**\n * ** Injection Token for Data pipelines config.\n */\nexport const DATA_PIPELINES_CONFIGS = new InjectionToken<DataPipelinesConfig>('DataPipelinesConfig');\n\n/**\n * ** DateTime format pattern provided to Angular DateTime directives/pipes, etc...\n */\nexport const DATA_PIPELINES_DATE_TIME_FORMAT = 'MMM d, y, hh:mm:ss a';\n\n/**\n * ** Team name constant used as key identifier in {@link ComponentState.requestParams}.\n */\nexport const TEAM_NAME_REQ_PARAM = 'team-name-req-param';\n\n/**\n * ** Data Job name constant used as key identifier in {@link ComponentState.requestParams}.\n */\nexport const JOB_NAME_REQ_PARAM = 'job-name-req-param';\n\n/**\n * ** Data Job deployment ID constant used as key identifier in {@link ComponentState.requestParams}.\n */\nexport const JOB_DEPLOYMENT_ID_REQ_PARAM = 'job-deployment-id-req-param';\n\n/**\n * ** Data Job status constant used as key identifier in {@link ComponentState.requestParams}.\n */\nexport const JOB_STATUS_REQ_PARAM = 'job-status-req-param';\n\n/**\n * ** Filter constant used as key identifier in {@link ComponentState.requestParams}.\n */\nexport const FILTER_REQ_PARAM = 'filter-req-param';\n\n/**\n * ** Order constant used as key identifier in {@link ComponentState.requestParams}.\n */\nexport const ORDER_REQ_PARAM = 'order-req-param';\n\n/**\n * ** Data Job details constant used as key identifier in {@link ComponentState.requestParams}.\n */\nexport const JOB_DETAILS_REQ_PARAM = 'job-details-req-param';\n\n/**\n * ** Data Job state constant used as key identifier in {@link ComponentState.requestParams}.\n */\nexport const JOB_STATE_REQ_PARAM = 'job-state-req-param';\n\n/**\n * ** Data Job state constant used as key identifier in {@link ComponentState.data}\n */\nexport const JOB_STATE_DATA_KEY = 'job-state-data-key';\n\n/**\n * ** Data Jobs states constant used as key identifier in {@link ComponentState.data}\n */\nexport const JOBS_DATA_KEY = 'jobs-data-key';\n\n/**\n * ** Data Job details constant used as key identifier in {@link ComponentState.data}\n */\nexport const JOB_DETAILS_DATA_KEY = 'job-details-data-key';\n\n/**\n * ** Data Job Executions constant used as key identifier in {@link ComponentState.data}\n */\nexport const JOB_EXECUTIONS_DATA_KEY = 'job-executions-data-key';\n","/*\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* eslint-disable @typescript-eslint/naming-convention */\n\nexport interface StatusDetails {\n enabled: boolean;\n}\n\nexport interface GraphQLResponsePage<T> {\n content?: T[];\n totalItems?: number;\n totalPages?: number;\n}\n\n// Deployment\n\nexport interface BaseDataJobDeployment<E extends DataJobExecution = DataJobExecution> extends StatusDetails {\n id: string;\n contacts?: DataJobContacts;\n jobVersion?: string;\n deployedDate?: string;\n deployedBy?: string;\n mode?: string;\n resources?: DataJobResources;\n schedule?: DataJobSchedule;\n vdkVersion?: string;\n jobPythonVersion?: string;\n status?: DataJobDeploymentStatus;\n executions?: E[];\n}\n\nexport enum DataJobDeploymentStatus {\n NONE = 'NONE',\n SUCCESS = 'SUCCESS',\n PLATFORM_ERROR = 'PLATFORM_ERROR',\n USER_ERROR = 'USER_ERROR'\n}\n\nexport interface DataJobContacts {\n notifiedOnJobFailureUserError: string[];\n notifiedOnJobFailurePlatformError: string[];\n notifiedOnJobSuccess: string[];\n notifiedOnJobDeploy: string[];\n}\n\nexport interface DataJobSchedule {\n scheduleCron?: string;\n nextRunEpochSeconds?: number;\n}\n\nexport interface DataJobResources {\n cpuLimit: number;\n cpuRequest: number;\n memoryLimit: number;\n memoryRequest: number;\n ephemeralStorageLimit?: number;\n ephemeralStorageRequest?: number;\n netBandwidthLimit?: number;\n}\n\n// Execution\n\nexport interface DataJobExecution {\n id: string;\n type?: DataJobExecutionType;\n jobName?: string;\n status?: DataJobExecutionStatus;\n startTime?: string;\n endTime?: string;\n startedBy?: string;\n message?: string;\n opId?: string;\n logsUrl?: string;\n deployment?: BaseDataJobDeployment;\n}\n\nexport enum DataJobExecutionType {\n MANUAL = 'MANUAL',\n SCHEDULED = 'SCHEDULED'\n}\n\n/**\n * ** Execution Status.\n */\nexport enum DataJobExecutionStatus {\n SUBMITTED = 'SUBMITTED',\n RUNNING = 'RUNNING',\n FINISHED = 'FINISHED', // Keep for backward compatibility\n SUCCEEDED = 'SUCCEEDED',\n CANCELLED = 'CANCELLED',\n SKIPPED = 'SKIPPED',\n FAILED = 'FAILED', // Keep for backward compatibility\n USER_ERROR = 'USER_ERROR',\n PLATFORM_ERROR = 'PLATFORM_ERROR'\n}\n","/*\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* eslint-disable @typescript-eslint/naming-convention */\n\nimport { ApiPredicate } from '@versatiledatakit/shared';\n\nimport { DataJobContacts, DataJobSchedule, GraphQLResponsePage } from './data-job-base.model';\n\nimport { DataJobDeployment } from './data-job-deployments.model';\n\nexport type DataJobPage = GraphQLResponsePage<DataJob>;\n\nexport interface DataJob {\n jobName?: string;\n config?: DataJobConfig;\n deployments?: DataJobDeployment[];\n}\n\nexport interface DataJobConfig {\n team?: string;\n description?: string;\n generateKeytab?: boolean;\n sourceUrl?: string;\n logsUrl?: string;\n schedule?: DataJobSchedule;\n contacts?: DataJobContacts;\n}\n\n/**\n * ** Request variables for DataJobs jobsQuery GraphQL API.\n */\nexport interface DataJobReqVariables {\n pageNumber?: number;\n pageSize?: number;\n filter?: ApiPredicate[];\n search?: string;\n}\n\nexport enum DataJobStatus {\n ENABLED = 'Enabled',\n DISABLED = 'Disabled',\n NOT_DEPLOYED = 'Not Deployed'\n}\n\nexport interface IPcsOAuthDto {\n teamName: string;\n clientId: string;\n}\n","/*\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* eslint-disable @typescript-eslint/naming-convention */\n\nimport { DirectionType } from '@versatiledatakit/shared';\n\nimport { DataJobExecution, DataJobExecutionStatus, GraphQLResponsePage } from './data-job-base.model';\n\nexport type DataJobExecutions = DataJobExecution[];\n\n/**\n * ** Execution status.\n *\n * @deprecated\n */\n// eslint-disable-next-line no-shadow\nexport enum DataJobExecutionStatusDeprecated {\n SUBMITTED = 'submitted',\n RUNNING = 'running',\n FINISHED = 'finished', // Keep for backward compatibility\n SUCCEEDED = 'succeeded',\n CANCELLED = 'cancelled',\n SKIPPED = 'skipped',\n FAILED = 'failed', // Keep for backward compatibility\n USER_ERROR = 'user_error',\n PLATFORM_ERROR = 'platform_error'\n}\n\n/**\n * ** Request variables fro DataJobs Executions jobsQuery GraphQL API.\n */\nexport interface DataJobExecutionsReqVariables {\n pageNumber?: number;\n pageSize?: number;\n filter?: DataJobExecutionFilter;\n order?: DataJobExecutionOrder;\n}\n\nexport interface DataJobExecutionFilter {\n statusIn?: DataJobExecutionStatus[];\n jobNameIn?: string[];\n teamNameIn?: string[];\n startTimeGte?: string | Date;\n endTimeGte?: string | Date;\n startTimeLte?: string | Date;\n endTimeLte?: string | Date;\n}\n\nexport interface DataJobExecutionOrder {\n property: keyof DataJobExecution;\n direction: DirectionType;\n}\n\nexport type DataJobExecutionsPage = GraphQLResponsePage<DataJobExecution>;\n","/*\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport enum DisplayMode {\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\n COMPACT = 'compact',\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\n STANDARD = 'standard'\n}\n\nexport interface GridFilters {\n jobName?: string;\n teamName?: string;\n description?: string;\n deploymentStatus?: string;\n deploymentLastExecutionStatus?: string;\n jobPythonVersion?: string;\n}\n","/*\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Toast, VmwToastType } from '@versatiledatakit/shared';\n\nexport class ToastDefinitions {\n static successfullyRanJob(jobName: string): Toast {\n return {\n type: VmwToastType.INFO,\n title: `Data job Queued for execution`,\n description: `Data job \"${jobName}\" successfully queued for execution.`\n };\n }\n}\n","/*\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport * from './config.model';\nexport * from './constants.model';\nexport * from './data-job-base.model';\nexport * from './data-job.model';\nexport * from './data-job-deployments.model';\nexport * from './data-job-details.model';\nexport * from './data-job-executions.model';\nexport * from './grid-config.model';\nexport * from './route.model';\nexport * from './toast-definitions.model';\n","/*\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Pipe, PipeTransform } from '@angular/core';\n\nimport { DataJobStatus, StatusDetails } from '../../model';\n\n@Pipe({\n name: 'extractJobStatus',\n pure: false\n})\nexport class ExtractJobStatusPipe implements PipeTransform {\n /**\n * ** Extract Job Status from Details.\n *\n * - This method should be equal to instance method.\n * - Methods: {@link ExtractJobStatusPipe.transform}\n */\n static transform(jobDeployments: StatusDetails[]): DataJobStatus {\n if (!jobDeployments?.length) {\n return DataJobStatus.NOT_DEPLOYED;\n }\n\n if (jobDeployments[jobDeployments.length - 1].enabled) {\n return DataJobStatus.ENABLED;\n }\n\n return DataJobStatus.DISABLED;\n }\n\n /**\n * @inheritDoc\n *\n * - This method should be equal to instance method.\n * - Methods: {@link ExtractJobStatusPipe.transform}\n */\n transform(jobDeployments: StatusDetails[]): DataJobStatus {\n return ExtractJobStatusPipe.transform(jobDeployments);\n }\n}\n","/*\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Pipe, PipeTransform } from '@angular/core';\n\nimport { CollectionsUtil } from '@versatiledatakit/shared';\n\nimport { DataJobExecution } from '../../model';\n\n/**\n * Format Delta Pipe formats the delta of the execution start and end Time.\n * The format is dynamic and contains generaly the last two leading fragment of the duration.\n *\n * For example:\n *\n * 1: If the duration is less than 1 min, the format is `${seconds}s`\n *\n * 2: If the duration is between 1 min and 59 mins, the format is `${minutes}m ${seconds}s`\n *\n * 3: If the duration is between 1 hour and 1 day, the format is `${hours}h ${minutes}m`\n *\n * 4: If the duration is more than 1 day, the format is `${days}d ${hours}h`\n */\n@Pipe({\n name: 'formatDelta'\n})\nexport class FormatDeltaPipe implements PipeTransform {\n static formatDelta(delta: number): string {\n if (delta < 0) {\n return 'N/A';\n } else if (delta < 60) {\n return `${Math.ceil(delta)}s`;\n } else if (delta < 3600) {\n const minute = Math.floor((delta / 60) % 60);\n const seconds = Math.floor(delta % 60);\n\n return `${minute}m ${seconds}s`;\n } else if (delta < 86400) {\n const hours = Math.floor((delta / (60 * 60)) % 24);\n const minutes = Math.floor((delta / 60) % 60);\n\n return `${hours}h ${minutes}m`;\n } else {\n const days = Math.floor(delta / (60 * 60 * 24));\n const hours = Math.floor((delta / (60 * 60)) % 24);\n\n return `${days}d ${hours}h`;\n }\n }\n\n /**\n * @inheritDoc\n */\n transform(execution: DataJobExecution): string {\n if (CollectionsUtil.isNil(execution.startTime)) {\n return '';\n }\n\n const delta = (FormatDeltaPipe._getEndTime(execution) - FormatDeltaPipe._getStartTime(execution)) / 1000;\n\n return FormatDeltaPipe.formatDelta(delta);\n }\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n private static _getStartTime(execution: DataJobExecution): number {\n if (CollectionsUtil.isDefined(execution.startTime)) {\n return new Date(execution.startTime).getTime();\n }\n\n return Date.now();\n }\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n private static _getEndTime(execution: DataJobExecution): number {\n if (CollectionsUtil.isDefined(execution.endTime)) {\n return new Date(execution.endTime).getTime();\n }\n\n return Date.now();\n }\n}\n","/*\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* eslint-disable no-underscore-dangle */\n\nimport { Pipe, PipeTransform } from '@angular/core';\n\nimport cronstrue from 'cronstrue';\n\nimport { CollectionsUtil } from '@versatiledatakit/shared';\n\n@Pipe({\n name: 'formatSchedule'\n})\nexport class FormatSchedulePipe implements PipeTransform {\n private static _fallbackTransformNonStandardCron(cron: string): string {\n const match = `${cron}`.trim().match(/^@hourly|@daily|@midnight|@weekly|@monthly|@yearly|@annually$/);\n\n if (CollectionsUtil.isNil(match)) {\n throw new Error('Cron expression cannot be null or undefined.');\n }\n\n switch (match.input) {\n case '@hourly':\n return 'Run once an hour at the beginning of the hour';\n case '@daily':\n case '@midnight':\n return 'Run once a day at midnight';\n case '@weekly':\n return 'Run once a week at midnight on Sunday morning';\n case '@monthly':\n return 'Run once a month at midnight of the first day of the month';\n case '@yearly':\n case '@annually':\n return 'Run once a year at midnight of 1 January';\n default:\n throw new Error('Cron expression is NOT nonstandard predefined scheduling definition.');\n }\n }\n\n /**\n * @inheritDoc\n *\n * - Cron schedule default format from kubernetes https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/\n * - Time in UTC\n */\n transform(cronSchedule: string, defaultResult?: string): string {\n try {\n const defaultValue = defaultResult ?? '';\n\n if (!cronSchedule) {\n return defaultValue;\n }\n\n //TODO : https://github.com/bradymholt/cRonstrue/issues/94\n // cronstrue doesn't support timezones. Need to use another library\n return cronstrue.toString(cronSchedule, {\n monthStartIndexZero: false,\n dayOfWeekStartIndexZero: true\n });\n } catch (e) {\n try {\n return FormatSchedulePipe._fallbackTransformNonStandardCron(cronSchedule);\n } catch (_e) {\n console.error(`Parsing error. Cron expression \"${cronSchedule}\"`);\n\n return `Invalid Cron expression \"${cronSchedule}\"`;\n }\n }\n }\n}\n","/*\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'parseEpoch'\n})\nexport class ParseEpochPipe implements PipeTransform {\n /**\n * ** Transform to Epoch time.\n *\n * - This method should be equal to instance method.\n * - Methods: {@link ParseEpochPipe.transform}\n */\n static transform(nextRunEpochSeconds: number): Date {\n if (nextRunEpochSeconds < 0) {\n return null;\n }\n\n return new Date(nextRunEpochSeconds * 1000);\n }\n\n /**\n * @inheritDoc\n *\n * - This method should be equal to instance method.\n * - Methods: {@link ParseEpochPipe.transform}\n */\n transform(nextRunEpochSeconds: number): Date {\n return ParseEpochPipe.transform(nextRunEpochSeconds);\n }\n}\n","/*\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Pipe, PipeTransform } from '@angular/core';\n\nimport * as parser from 'cron-parser';\n\n@Pipe({\n name: 'parseNextRun'\n})\nexport class ParseNextRunPipe implements PipeTransform {\n /**\n * @inheritDoc\n */\n transform(cron: string, nextExecution?: number): Date {\n if (!cron) {\n return null;\n }\n\n if (!nextExecution) {\n nextExecution = 1;\n }\n\n let result: Date;\n try {\n const parsedDate = parser.parseExpression(cron, { utc: true });\n for (let i = 0; i < nextExecution; i++) {\n result = parsedDate.next().toDate();\n }\n } catch (e) {\n result = null;\n console.error('Error parsing next run', e);\n }\n return result;\n }\n}\n","/*\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'extractContacts'\n})\nexport class ExtractContactsPipe implements PipeTransform {\n static transform(contacts: string[]): string[] {\n if (Array.isArray(contacts) && contacts.length) {\n return contacts;\n } else {\n return [];\n }\n }\n\n transform(contacts: string[]): string[] {\n return ExtractContactsPipe.transform(contacts);\n }\n}\n","/*\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport * from './contacts-present.pipe';\nexport * from './execution-success-rate.pipe';\nexport * from './extract-job-status.pipe';\nexport * from './format-delta.pipe';\nexport * from './format-schedule.pipe';\nexport * from './parse-epoch.pipe';\nexport * from './parse-next-run.pipe';\nexport * from './extract-contacts.pipe';\n","/*\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport interface ModalOptions {\n opened: boolean;\n title: string;\n message: string;\n cancelBtn: string;\n showCancelBtn: boolean;\n okBtn: string;\n showOkBtn: boolean;\n showCloseX: boolean;\n\n infoText?: string;\n warningText?: string;\n}\n\nexport class DeleteModalOptions implements ModalOptions {\n opened: boolean;\n title: string;\n message: string;\n cancelBtn: string;\n showCancelBtn: boolean;\n okBtn: string;\n showOkBtn: boolean;\n showCloseX: boolean;\n\n constructor() {\n this.opened = false;\n this.title = 'Delete';\n this.message = 'Are you sure you want to permanently delete this item?';\n this.cancelBtn = 'Cancel';\n this.showCancelBtn = true;\n this.okBtn = 'Delete';\n this.showOkBtn = true;\n this.showCloseX = true;\n }\n}\n\nexport class EditModalOptions implements ModalOptions {\n opened: boolean;\n title: string;\n message: string;\n cancelBtn: string;\n showCancelBtn: boolean;\n okBtn: string;\n showOkBtn: boolean;\n showCloseX: boolean;\n\n constructor() {\n this.opened = false;\n this.title = 'Edit';\n this.message = '';\n this.cancelBtn = 'Cancel';\n this.showCancelBtn = true;\n this.okBtn = 'Edit';\n this.showOkBtn = true;\n this.showCloseX = true;\n }\n}\n\nexport class ConfirmationModalOptions implements ModalOptions {\n opened: boolean;\n title: string;\n message: string;\n cancelBtn: string;\n showCancelBtn: boolean;\n okBtn: string;\n showOkBtn: boolean;\n showCloseX: boolean;\n\n constructor() {\n this.opened = false;\n this.title = 'Confirm';\n this.message = 'Are you sure?';\n this.cancelBtn = 'Cancel';\n this.showCancelBtn = true;\n this.okBtn = 'Confirm';\n this.showOkBtn = true;\n this.showCloseX = true;\n }\n}\n","/*\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Directive, EventEmitter, Input, Output } from '@angular/core';\n\nimport { TaurusObject } from '@versatiledatakit/shared';\n\nimport { ModalOptions } from '../../model';\n\n@Directive()\nexport abstract class ModalComponentDirective extends TaurusObject {\n @Input() options: ModalOptions;\n\n @Output() optionsChange: EventEmitter<ModalOptions> = new EventEmitter<ModalOptions>();\n\n @Output() cancelAction: EventEmitter<undefined> = new EventEmitter<undefined>();\n\n constructor() {\n super();\n }\n\n confirm() {\n this.close();\n }\n\n /**\n * close the modal\n */\n close(): void {\n if (!this._isNull(this.options)) {\n this.options.opened = false;\n this.optionsChange.emit(this.options);\n }\n }\n\n cancel() {\n this.cancelAction.emit();\n this.close();\n }\n\n private _isNull(value: ModalOptions): boolean {\n return value === null || value === undefined;\n }\n}\n","/*\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { ConfirmationModalOptions } from '../../model/modal-options';\nimport { ModalComponentDirective } from '../modal/modal.component';\n\n@Component({\n selector: 'lib-confirmation-dialog-modal',\n templateUrl: './confirmation-dialog-modal.component.html',\n styleUrls: ['./confirmation-dialog-modal.component.scss']\n})\nexport class ConfirmationDialogModalComponent extends ModalComponentDirective {\n @