Commit a55bafb3 authored by Jose Ivan Vargas's avatar Jose Ivan Vargas

Merge branch '276949-pre-graph-refactor' into 'master'

Pipeline Graph Structural Update: Pre Refactor I

See merge request gitlab-org/gitlab!47772
parents 4932154c 5bd4461a
export const DOWNSTREAM = 'downstream';
export const MAIN = 'main';
export const UPSTREAM = 'upstream';
...@@ -5,6 +5,7 @@ import StageColumnComponent from './stage_column_component.vue'; ...@@ -5,6 +5,7 @@ import StageColumnComponent from './stage_column_component.vue';
import GraphWidthMixin from '../../mixins/graph_width_mixin'; import GraphWidthMixin from '../../mixins/graph_width_mixin';
import LinkedPipelinesColumn from './linked_pipelines_column.vue'; import LinkedPipelinesColumn from './linked_pipelines_column.vue';
import GraphBundleMixin from '../../mixins/graph_pipeline_bundle_mixin'; import GraphBundleMixin from '../../mixins/graph_pipeline_bundle_mixin';
import { UPSTREAM, DOWNSTREAM, MAIN } from './constants';
export default { export default {
name: 'PipelineGraph', name: 'PipelineGraph',
...@@ -35,11 +36,11 @@ export default { ...@@ -35,11 +36,11 @@ export default {
type: { type: {
type: String, type: String,
required: false, required: false,
default: 'main', default: MAIN,
}, },
}, },
upstream: 'upstream', upstream: UPSTREAM,
downstream: 'downstream', downstream: DOWNSTREAM,
data() { data() {
return { return {
downstreamMarginTop: null, downstreamMarginTop: null,
...@@ -54,41 +55,41 @@ export default { ...@@ -54,41 +55,41 @@ export default {
graph() { graph() {
return this.pipeline.details?.stages; return this.pipeline.details?.stages;
}, },
hasTriggeredBy() { hasUpstream() {
return ( return (
this.type !== this.$options.downstream && this.type !== this.$options.downstream &&
this.triggeredByPipelines && this.upstreamPipelines &&
this.pipeline.triggered_by !== null this.pipeline.triggered_by !== null
); );
}, },
triggeredByPipelines() { upstreamPipelines() {
return this.pipeline.triggered_by; return this.pipeline.triggered_by;
}, },
hasTriggered() { hasDownstream() {
return ( return (
this.type !== this.$options.upstream && this.type !== this.$options.upstream &&
this.triggeredPipelines && this.downstreamPipelines &&
this.pipeline.triggered.length > 0 this.pipeline.triggered.length > 0
); );
}, },
triggeredPipelines() { downstreamPipelines() {
return this.pipeline.triggered; return this.pipeline.triggered;
}, },
expandedTriggeredBy() { expandedUpstream() {
return ( return (
this.pipeline.triggered_by && this.pipeline.triggered_by &&
Array.isArray(this.pipeline.triggered_by) && Array.isArray(this.pipeline.triggered_by) &&
this.pipeline.triggered_by.find(el => el.isExpanded) this.pipeline.triggered_by.find(el => el.isExpanded)
); );
}, },
expandedTriggered() { expandedDownstream() {
return this.pipeline.triggered && this.pipeline.triggered.find(el => el.isExpanded); return this.pipeline.triggered && this.pipeline.triggered.find(el => el.isExpanded);
}, },
pipelineTypeUpstream() { pipelineTypeUpstream() {
return this.type !== this.$options.downstream && this.expandedTriggeredBy; return this.type !== this.$options.downstream && this.expandedUpstream;
}, },
pipelineTypeDownstream() { pipelineTypeDownstream() {
return this.type !== this.$options.upstream && this.expandedTriggered; return this.type !== this.$options.upstream && this.expandedDownstream;
}, },
pipelineProjectId() { pipelineProjectId() {
return this.pipeline.project.id; return this.pipeline.project.id;
...@@ -142,11 +143,11 @@ export default { ...@@ -142,11 +143,11 @@ export default {
* and we want to reset the pipeline store. Triggering the reset without * and we want to reset the pipeline store. Triggering the reset without
* this condition would mean not allowing downstreams of downstreams to expand * this condition would mean not allowing downstreams of downstreams to expand
*/ */
if (this.expandedTriggered?.id !== pipeline.id) { if (this.expandedDownstream?.id !== pipeline.id) {
this.$emit('onResetTriggered', this.pipeline, pipeline); this.$emit('onResetDownstream', this.pipeline, pipeline);
} }
this.$emit('onClickTriggered', pipeline); this.$emit('onClickDownstreamPipeline', pipeline);
}, },
calculateMarginTop(downstreamNode, pixelDiff) { calculateMarginTop(downstreamNode, pixelDiff) {
return `${downstreamNode.offsetTop - downstreamNode.offsetParent.offsetTop - pixelDiff}px`; return `${downstreamNode.offsetTop - downstreamNode.offsetParent.offsetTop - pixelDiff}px`;
...@@ -154,8 +155,8 @@ export default { ...@@ -154,8 +155,8 @@ export default {
hasOnlyOneJob(stage) { hasOnlyOneJob(stage) {
return stage.groups.length === 1; return stage.groups.length === 1;
}, },
hasUpstream(index) { hasUpstreamColumn(index) {
return index === 0 && this.hasTriggeredBy; return index === 0 && this.hasUpstream;
}, },
setJob(jobName) { setJob(jobName) {
this.jobName = jobName; this.jobName = jobName;
...@@ -192,30 +193,30 @@ export default { ...@@ -192,30 +193,30 @@ export default {
<pipeline-graph <pipeline-graph
v-if="pipelineTypeUpstream" v-if="pipelineTypeUpstream"
type="upstream" :type="$options.upstream"
class="d-inline-block upstream-pipeline" class="d-inline-block upstream-pipeline"
:class="`js-upstream-pipeline-${expandedTriggeredBy.id}`" :class="`js-upstream-pipeline-${expandedUpstream.id}`"
:is-loading="false" :is-loading="false"
:pipeline="expandedTriggeredBy" :pipeline="expandedUpstream"
:is-linked-pipeline="true" :is-linked-pipeline="true"
:mediator="mediator" :mediator="mediator"
@onClickTriggeredBy="clickTriggeredByPipeline" @onClickUpstreamPipeline="clickUpstreamPipeline"
@refreshPipelineGraph="requestRefreshPipelineGraph" @refreshPipelineGraph="requestRefreshPipelineGraph"
/> />
<linked-pipelines-column <linked-pipelines-column
v-if="hasTriggeredBy" v-if="hasUpstream"
:linked-pipelines="triggeredByPipelines" :type="$options.upstream"
:linked-pipelines="upstreamPipelines"
:column-title="__('Upstream')" :column-title="__('Upstream')"
:project-id="pipelineProjectId" :project-id="pipelineProjectId"
graph-position="left" @linkedPipelineClick="$emit('onClickUpstreamPipeline', $event)"
@linkedPipelineClick="$emit('onClickTriggeredBy', $event)"
/> />
<ul <ul
v-if="!isLoading" v-if="!isLoading"
:class="{ :class="{
'inline js-has-linked-pipelines': hasTriggered || hasTriggeredBy, 'inline js-has-linked-pipelines': hasDownstream || hasUpstream,
}" }"
class="stage-column-list align-top" class="stage-column-list align-top"
> >
...@@ -223,7 +224,7 @@ export default { ...@@ -223,7 +224,7 @@ export default {
v-for="(stage, index) in graph" v-for="(stage, index) in graph"
:key="stage.name" :key="stage.name"
:class="{ :class="{
'has-upstream gl-ml-11': hasUpstream(index), 'has-upstream gl-ml-11': hasUpstreamColumn(index),
'has-only-one-job': hasOnlyOneJob(stage), 'has-only-one-job': hasOnlyOneJob(stage),
'gl-mr-26': shouldAddRightMargin(index), 'gl-mr-26': shouldAddRightMargin(index),
}" }"
...@@ -231,7 +232,7 @@ export default { ...@@ -231,7 +232,7 @@ export default {
:groups="stage.groups" :groups="stage.groups"
:stage-connector-class="stageConnectorClass(index, stage)" :stage-connector-class="stageConnectorClass(index, stage)"
:is-first-column="isFirstColumn(index)" :is-first-column="isFirstColumn(index)"
:has-triggered-by="hasTriggeredBy" :has-upstream="hasUpstream"
:action="stage.status.action" :action="stage.status.action"
:job-hovered="jobName" :job-hovered="jobName"
:pipeline-expanded="pipelineExpanded" :pipeline-expanded="pipelineExpanded"
...@@ -240,11 +241,11 @@ export default { ...@@ -240,11 +241,11 @@ export default {
</ul> </ul>
<linked-pipelines-column <linked-pipelines-column
v-if="hasTriggered" v-if="hasDownstream"
:linked-pipelines="triggeredPipelines" :type="$options.downstream"
:linked-pipelines="downstreamPipelines"
:column-title="__('Downstream')" :column-title="__('Downstream')"
:project-id="pipelineProjectId" :project-id="pipelineProjectId"
graph-position="right"
@linkedPipelineClick="handleClickedDownstream" @linkedPipelineClick="handleClickedDownstream"
@downstreamHovered="setJob" @downstreamHovered="setJob"
@pipelineExpandToggle="setPipelineExpanded" @pipelineExpandToggle="setPipelineExpanded"
...@@ -252,15 +253,15 @@ export default { ...@@ -252,15 +253,15 @@ export default {
<pipeline-graph <pipeline-graph
v-if="pipelineTypeDownstream" v-if="pipelineTypeDownstream"
type="downstream" :type="$options.downstream"
class="d-inline-block" class="d-inline-block"
:class="`js-downstream-pipeline-${expandedTriggered.id}`" :class="`js-downstream-pipeline-${expandedDownstream.id}`"
:is-loading="false" :is-loading="false"
:pipeline="expandedTriggered" :pipeline="expandedDownstream"
:is-linked-pipeline="true" :is-linked-pipeline="true"
:style="{ 'margin-top': downstreamMarginTop }" :style="{ 'margin-top': downstreamMarginTop }"
:mediator="mediator" :mediator="mediator"
@onClickTriggered="clickTriggeredPipeline" @onClickDownstreamPipeline="clickDownstreamPipeline"
@refreshPipelineGraph="requestRefreshPipelineGraph" @refreshPipelineGraph="requestRefreshPipelineGraph"
/> />
</div> </div>
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
import { GlTooltipDirective, GlButton, GlLink, GlLoadingIcon } from '@gitlab/ui'; import { GlTooltipDirective, GlButton, GlLink, GlLoadingIcon } from '@gitlab/ui';
import CiStatus from '~/vue_shared/components/ci_icon.vue'; import CiStatus from '~/vue_shared/components/ci_icon.vue';
import { __, sprintf } from '~/locale'; import { __, sprintf } from '~/locale';
import { UPSTREAM, DOWNSTREAM } from './constants';
export default { export default {
directives: { directives: {
...@@ -14,6 +15,10 @@ export default { ...@@ -14,6 +15,10 @@ export default {
GlLoadingIcon, GlLoadingIcon,
}, },
props: { props: {
columnTitle: {
type: String,
required: true,
},
pipeline: { pipeline: {
type: Object, type: Object,
required: true, required: true,
...@@ -22,7 +27,7 @@ export default { ...@@ -22,7 +27,7 @@ export default {
type: Number, type: Number,
required: true, required: true,
}, },
columnTitle: { type: {
type: String, type: String,
required: true, required: true,
}, },
...@@ -50,12 +55,10 @@ export default { ...@@ -50,12 +55,10 @@ export default {
return this.childPipeline ? __('child-pipeline') : this.pipeline.project.name; return this.childPipeline ? __('child-pipeline') : this.pipeline.project.name;
}, },
parentPipeline() { parentPipeline() {
// Refactor string match when BE returns Upstream/Downstream indicators return this.isUpstream && this.isSameProject;
return this.projectId === this.pipeline.project.id && this.columnTitle === __('Upstream');
}, },
childPipeline() { childPipeline() {
// Refactor string match when BE returns Upstream/Downstream indicators return this.isDownstream && this.isSameProject;
return this.projectId === this.pipeline.project.id && this.isDownstream;
}, },
label() { label() {
if (this.parentPipeline) { if (this.parentPipeline) {
...@@ -66,7 +69,13 @@ export default { ...@@ -66,7 +69,13 @@ export default {
return __('Multi-project'); return __('Multi-project');
}, },
isDownstream() { isDownstream() {
return this.columnTitle === __('Downstream'); return this.type === DOWNSTREAM;
},
isUpstream() {
return this.type === UPSTREAM;
},
isSameProject() {
return this.projectId === this.pipeline.project.id;
}, },
sourceJobInfo() { sourceJobInfo() {
return this.isDownstream return this.isDownstream
...@@ -74,13 +83,13 @@ export default { ...@@ -74,13 +83,13 @@ export default {
: ''; : '';
}, },
expandedIcon() { expandedIcon() {
if (this.parentPipeline) { if (this.isUpstream) {
return this.expanded ? 'angle-right' : 'angle-left'; return this.expanded ? 'angle-right' : 'angle-left';
} }
return this.expanded ? 'angle-left' : 'angle-right'; return this.expanded ? 'angle-left' : 'angle-right';
}, },
expandButtonPosition() { expandButtonPosition() {
return this.parentPipeline ? 'gl-left-0 gl-border-r-1!' : 'gl-right-0 gl-border-l-1!'; return this.isUpstream ? 'gl-left-0 gl-border-r-1!' : 'gl-right-0 gl-border-l-1!';
}, },
}, },
methods: { methods: {
...@@ -116,7 +125,7 @@ export default { ...@@ -116,7 +125,7 @@ export default {
> >
<div <div
class="gl-relative gl-bg-white gl-p-3 gl-border-solid gl-border-gray-100 gl-border-1" class="gl-relative gl-bg-white gl-p-3 gl-border-solid gl-border-gray-100 gl-border-1"
:class="{ 'gl-pl-9': parentPipeline }" :class="{ 'gl-pl-9': isUpstream }"
> >
<div class="gl-display-flex"> <div class="gl-display-flex">
<ci-status <ci-status
......
<script> <script>
import LinkedPipeline from './linked_pipeline.vue'; import LinkedPipeline from './linked_pipeline.vue';
import { __ } from '~/locale'; import { UPSTREAM } from './constants';
export default { export default {
components: { components: {
...@@ -15,7 +15,7 @@ export default { ...@@ -15,7 +15,7 @@ export default {
type: Array, type: Array,
required: true, required: true,
}, },
graphPosition: { type: {
type: String, type: String,
required: true, required: true,
}, },
...@@ -32,9 +32,12 @@ export default { ...@@ -32,9 +32,12 @@ export default {
}; };
return `graph-position-${this.graphPosition} ${positionValues[this.graphPosition]}`; return `graph-position-${this.graphPosition} ${positionValues[this.graphPosition]}`;
}, },
graphPosition() {
return this.isUpstream ? 'left' : 'right';
},
// Refactor string match when BE returns Upstream/Downstream indicators // Refactor string match when BE returns Upstream/Downstream indicators
isUpstream() { isUpstream() {
return this.columnTitle === __('Upstream'); return this.type === UPSTREAM;
}, },
}, },
methods: { methods: {
...@@ -45,6 +48,11 @@ export default { ...@@ -45,6 +48,11 @@ export default {
this.$emit('downstreamHovered', jobName); this.$emit('downstreamHovered', jobName);
}, },
onPipelineExpandToggle(jobName, expanded) { onPipelineExpandToggle(jobName, expanded) {
// Highlighting only applies to downstream pipelines
if (this.isUpstream) {
return;
}
this.$emit('pipelineExpandToggle', jobName, expanded); this.$emit('pipelineExpandToggle', jobName, expanded);
}, },
}, },
...@@ -66,6 +74,7 @@ export default { ...@@ -66,6 +74,7 @@ export default {
:pipeline="pipeline" :pipeline="pipeline"
:column-title="columnTitle" :column-title="columnTitle"
:project-id="projectId" :project-id="projectId"
:type="type"
@pipelineClicked="onPipelineClick($event, pipeline, index)" @pipelineClicked="onPipelineClick($event, pipeline, index)"
@downstreamHovered="onDownstreamHovered" @downstreamHovered="onDownstreamHovered"
@pipelineExpandToggle="onPipelineExpandToggle" @pipelineExpandToggle="onPipelineExpandToggle"
......
...@@ -41,13 +41,13 @@ export default { ...@@ -41,13 +41,13 @@ export default {
this.mediator.poll.enable({ data: this.mediator.getExpandedParameters() }); this.mediator.poll.enable({ data: this.mediator.getExpandedParameters() });
} }
}, },
resetTriggeredPipelines(parentPipeline, pipeline) { resetDownstreamPipelines(parentPipeline, pipeline) {
this.mediator.store.resetTriggeredPipelines(parentPipeline, pipeline); this.mediator.store.resetTriggeredPipelines(parentPipeline, pipeline);
}, },
clickTriggeredByPipeline(pipeline) { clickUpstreamPipeline(pipeline) {
this.clickPipeline(pipeline, 'openPipeline', 'closePipeline'); this.clickPipeline(pipeline, 'openPipeline', 'closePipeline');
}, },
clickTriggeredPipeline(pipeline) { clickDownstreamPipeline(pipeline) {
this.clickPipeline(pipeline, 'openPipeline', 'closePipeline'); this.clickPipeline(pipeline, 'openPipeline', 'closePipeline');
}, },
requestRefreshPipelineGraph() { requestRefreshPipelineGraph() {
......
export default { export default {
props: { props: {
hasTriggeredBy: { hasUpstream: {
type: Boolean, type: Boolean,
required: false, required: false,
default: false, default: false,
...@@ -8,7 +8,7 @@ export default { ...@@ -8,7 +8,7 @@ export default {
}, },
methods: { methods: {
buildConnnectorClass(index) { buildConnnectorClass(index) {
return index === 0 && (!this.isFirstColumn || this.hasTriggeredBy) ? 'left-connector' : ''; return index === 0 && (!this.isFirstColumn || this.hasUpstream) ? 'left-connector' : '';
}, },
}, },
}; };
...@@ -45,10 +45,10 @@ const createLegacyPipelinesDetailApp = mediator => { ...@@ -45,10 +45,10 @@ const createLegacyPipelinesDetailApp = mediator => {
}, },
on: { on: {
refreshPipelineGraph: this.requestRefreshPipelineGraph, refreshPipelineGraph: this.requestRefreshPipelineGraph,
onResetTriggered: (parentPipeline, pipeline) => onResetDownstream: (parentPipeline, pipeline) =>
this.resetTriggeredPipelines(parentPipeline, pipeline), this.resetDownstreamPipelines(parentPipeline, pipeline),
onClickTriggeredBy: pipeline => this.clickTriggeredByPipeline(pipeline), onClickUpstreamPipeline: pipeline => this.clickUpstreamPipeline(pipeline),
onClickTriggered: pipeline => this.clickTriggeredPipeline(pipeline), onClickDownstreamPipeline: pipeline => this.clickDownstreamPipeline(pipeline),
}, },
}); });
}, },
......
...@@ -6,11 +6,8 @@ import { GlIcon } from '@gitlab/ui'; ...@@ -6,11 +6,8 @@ import { GlIcon } from '@gitlab/ui';
* *
* Receives status object containing: * Receives status object containing:
* status: { * status: {
* details_path: "/gitlab-org/gitlab-foss/pipelines/8150156" // url
* group:"running" // used for CSS class * group:"running" // used for CSS class
* icon: "icon_status_running" // used to render the icon * icon: "icon_status_running" // used to render the icon
* label:"running" // used for potential tooltip
* text:"running" // text rendered
* } * }
* *
* Used in: * Used in:
......
...@@ -159,13 +159,13 @@ describe('graph component', () => { ...@@ -159,13 +159,13 @@ describe('graph component', () => {
describe('triggered by', () => { describe('triggered by', () => {
describe('on click', () => { describe('on click', () => {
it('should emit `onClickTriggeredBy` when triggered by linked pipeline is clicked', () => { it('should emit `onClickUpstreamPipeline` when triggered by linked pipeline is clicked', () => {
const btnWrapper = findExpandPipelineBtn(); const btnWrapper = findExpandPipelineBtn();
btnWrapper.trigger('click'); btnWrapper.trigger('click');
btnWrapper.vm.$nextTick(() => { btnWrapper.vm.$nextTick(() => {
expect(wrapper.emitted().onClickTriggeredBy).toEqual([ expect(wrapper.emitted().onClickUpstreamPipeline).toEqual([
store.state.pipeline.triggered_by, store.state.pipeline.triggered_by,
]); ]);
}); });
......
...@@ -2,11 +2,10 @@ import { mount } from '@vue/test-utils'; ...@@ -2,11 +2,10 @@ import { mount } from '@vue/test-utils';
import { GlButton, GlLoadingIcon } from '@gitlab/ui'; import { GlButton, GlLoadingIcon } from '@gitlab/ui';
import LinkedPipelineComponent from '~/pipelines/components/graph/linked_pipeline.vue'; import LinkedPipelineComponent from '~/pipelines/components/graph/linked_pipeline.vue';
import CiStatus from '~/vue_shared/components/ci_icon.vue'; import CiStatus from '~/vue_shared/components/ci_icon.vue';
import mockData from './linked_pipelines_mock_data'; import mockData from './linked_pipelines_mock_data';
import { UPSTREAM, DOWNSTREAM } from '~/pipelines/components/graph/constants';
const mockPipeline = mockData.triggered[0]; const mockPipeline = mockData.triggered[0];
const validTriggeredPipelineId = mockPipeline.project.id; const validTriggeredPipelineId = mockPipeline.project.id;
const invalidTriggeredPipelineId = mockPipeline.project.id + 5; const invalidTriggeredPipelineId = mockPipeline.project.id + 5;
...@@ -40,6 +39,7 @@ describe('Linked pipeline', () => { ...@@ -40,6 +39,7 @@ describe('Linked pipeline', () => {
pipeline: mockPipeline, pipeline: mockPipeline,
projectId: invalidTriggeredPipelineId, projectId: invalidTriggeredPipelineId,
columnTitle: 'Downstream', columnTitle: 'Downstream',
type: DOWNSTREAM,
}; };
beforeEach(() => { beforeEach(() => {
...@@ -104,11 +104,13 @@ describe('Linked pipeline', () => { ...@@ -104,11 +104,13 @@ describe('Linked pipeline', () => {
pipeline: mockPipeline, pipeline: mockPipeline,
projectId: validTriggeredPipelineId, projectId: validTriggeredPipelineId,
columnTitle: 'Downstream', columnTitle: 'Downstream',
type: DOWNSTREAM,
}; };
const upstreamProps = { const upstreamProps = {
...downstreamProps, ...downstreamProps,
columnTitle: 'Upstream', columnTitle: 'Upstream',
type: UPSTREAM,
}; };
it('parent/child label container should exist', () => { it('parent/child label container should exist', () => {
...@@ -182,6 +184,7 @@ describe('Linked pipeline', () => { ...@@ -182,6 +184,7 @@ describe('Linked pipeline', () => {
pipeline: { ...mockPipeline, isLoading: true }, pipeline: { ...mockPipeline, isLoading: true },
projectId: invalidTriggeredPipelineId, projectId: invalidTriggeredPipelineId,
columnTitle: 'Downstream', columnTitle: 'Downstream',
type: DOWNSTREAM,
}; };
beforeEach(() => { beforeEach(() => {
...@@ -198,6 +201,7 @@ describe('Linked pipeline', () => { ...@@ -198,6 +201,7 @@ describe('Linked pipeline', () => {
pipeline: mockPipeline, pipeline: mockPipeline,
projectId: validTriggeredPipelineId, projectId: validTriggeredPipelineId,
columnTitle: 'Downstream', columnTitle: 'Downstream',
type: DOWNSTREAM,
}; };
beforeEach(() => { beforeEach(() => {
......
import { shallowMount } from '@vue/test-utils'; import { shallowMount } from '@vue/test-utils';
import LinkedPipelinesColumn from '~/pipelines/components/graph/linked_pipelines_column.vue'; import LinkedPipelinesColumn from '~/pipelines/components/graph/linked_pipelines_column.vue';
import LinkedPipeline from '~/pipelines/components/graph/linked_pipeline.vue'; import LinkedPipeline from '~/pipelines/components/graph/linked_pipeline.vue';
import { UPSTREAM } from '~/pipelines/components/graph/constants';
import mockData from './linked_pipelines_mock_data'; import mockData from './linked_pipelines_mock_data';
describe('Linked Pipelines Column', () => { describe('Linked Pipelines Column', () => {
...@@ -9,6 +10,7 @@ describe('Linked Pipelines Column', () => { ...@@ -9,6 +10,7 @@ describe('Linked Pipelines Column', () => {
linkedPipelines: mockData.triggered, linkedPipelines: mockData.triggered,
graphPosition: 'right', graphPosition: 'right',
projectId: 19, projectId: 19,
type: UPSTREAM,
}; };
let wrapper; let wrapper;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment