diff --git a/src/main/frontend/multi-pipeline-graph-view/multi-pipeline-graph/main/SingleRun.tsx b/src/main/frontend/multi-pipeline-graph-view/multi-pipeline-graph/main/SingleRun.tsx
index 68c4847b1..fdeccebc8 100644
--- a/src/main/frontend/multi-pipeline-graph-view/multi-pipeline-graph/main/SingleRun.tsx
+++ b/src/main/frontend/multi-pipeline-graph-view/multi-pipeline-graph/main/SingleRun.tsx
@@ -25,14 +25,6 @@ export const SingleRun: (data: Props) => JSX.Element = ({ run }) => {
singleRunPage = `${run.id}/pipeline-graph/`;
}
- const handleNodeClick = (nodeName: string, id: number) => {
- console.log(nodeName, id);
- let redirect = `../${run.id}/pipeline-console?selected-node=${id}`;
- if (onJobView) {
- redirect = `${run.id}/pipeline-console?selected-node=${id}`;
- }
- window.location.href = redirect;
- };
return (
|
@@ -47,7 +39,6 @@ export const SingleRun: (data: Props) => JSX.Element = ({ run }) => {
diff --git a/src/main/frontend/pipeline-console-view/pipeline-console/main/PipelineConsoleModel.tsx b/src/main/frontend/pipeline-console-view/pipeline-console/main/PipelineConsoleModel.tsx
index 2623ca975..1082bada2 100644
--- a/src/main/frontend/pipeline-console-view/pipeline-console/main/PipelineConsoleModel.tsx
+++ b/src/main/frontend/pipeline-console-view/pipeline-console/main/PipelineConsoleModel.tsx
@@ -12,7 +12,7 @@ export type {
} from "../../../pipeline-graph-view/pipeline-graph/main/PipelineGraphModel";
export { default as startPollingPipelineStatus } from "../../../pipeline-graph-view/pipeline-graph/main/support/startPollingPipelineStatus";
export { pollUntilComplete } from "../../../common/Poller";
-export { getGroupForResult } from "../../../pipeline-graph-view/pipeline-graph/main/support/StatusIcons";
+export { getSymbolForResult } from "../../../pipeline-graph-view/pipeline-graph/main/support/StatusIcons";
export * from "../../../common/RestClient";
export const LOG_FETCH_SIZE = 150 * 1024;
diff --git a/src/main/frontend/pipeline-console-view/pipeline-console/main/TestData.tsx b/src/main/frontend/pipeline-console-view/pipeline-console/main/TestData.tsx
index bc301deb6..520c7dbda 100644
--- a/src/main/frontend/pipeline-console-view/pipeline-console/main/TestData.tsx
+++ b/src/main/frontend/pipeline-console-view/pipeline-console/main/TestData.tsx
@@ -12,6 +12,7 @@ export const defaultStagesList: StageInfo[] = [
startTimeMillis: "",
totalDurationMillis: "",
agent: "built-in",
+ url: "?selected-node=0",
},
{
name: "Stage B",
@@ -25,6 +26,7 @@ export const defaultStagesList: StageInfo[] = [
startTimeMillis: "",
totalDurationMillis: "",
agent: "not-built-in",
+ url: "?selected-node=1",
},
{
name: "Parent C",
@@ -46,12 +48,14 @@ export const defaultStagesList: StageInfo[] = [
startTimeMillis: "",
totalDurationMillis: "",
agent: "not-built-in",
+ url: "?selected-node=3",
},
],
pauseDurationMillis: "",
startTimeMillis: "",
totalDurationMillis: "",
agent: "built-in",
+ url: "?selected-node=2",
},
];
diff --git a/src/main/frontend/pipeline-console-view/pipeline-console/main/pipeline-console.scss b/src/main/frontend/pipeline-console-view/pipeline-console/main/pipeline-console.scss
index a92cc74c6..cf23c0370 100644
--- a/src/main/frontend/pipeline-console-view/pipeline-console/main/pipeline-console.scss
+++ b/src/main/frontend/pipeline-console-view/pipeline-console/main/pipeline-console.scss
@@ -220,12 +220,6 @@ g.build-status-icon__outer {
padding: unset;
}
-.jenkins-button svg {
- width: 20px !important;
- height: 20px !important;
- color: currentColor !important;
-}
-
.svg-icon {
// Force rotating icons to rotate about their center.
transform-origin: center;
diff --git a/src/main/frontend/pipeline-graph-view/app.scss b/src/main/frontend/pipeline-graph-view/app.scss
index 6a558ef60..0cd5f2209 100644
--- a/src/main/frontend/pipeline-graph-view/app.scss
+++ b/src/main/frontend/pipeline-graph-view/app.scss
@@ -40,12 +40,6 @@
}
}
-.jenkins-button svg {
- width: 20px !important;
- height: 20px !important;
- color: currentColor !important;
-}
-
.app-details__prev_next {
color: inherit !important;
text-decoration: none !important;
diff --git a/src/main/frontend/pipeline-graph-view/app.tsx b/src/main/frontend/pipeline-graph-view/app.tsx
index a18405264..c820c0a66 100644
--- a/src/main/frontend/pipeline-graph-view/app.tsx
+++ b/src/main/frontend/pipeline-graph-view/app.tsx
@@ -6,24 +6,10 @@ import { PipelineGraph } from "./pipeline-graph/main";
import "./app.scss";
import "./pipeline-graph/styles/main.scss";
-function handleNodeClick(nodeName: string, id: number) {
- let location = `../pipeline-console?selected-node=${id}`;
- const url = new URL(window.location.href);
- if (!url.pathname.endsWith("pipeline-graph/")) {
- location = `pipeline-console?selected-node=${id}`;
- }
-
- window.location.href = location;
-}
-
const App: FunctionComponent = () => {
return (
);
};
diff --git a/src/main/frontend/pipeline-graph-view/pipeline-graph/main/PipelineGraph.tsx b/src/main/frontend/pipeline-graph-view/pipeline-graph/main/PipelineGraph.tsx
index 8c3a79925..c066d0a0f 100644
--- a/src/main/frontend/pipeline-graph-view/pipeline-graph/main/PipelineGraph.tsx
+++ b/src/main/frontend/pipeline-graph-view/pipeline-graph/main/PipelineGraph.tsx
@@ -7,7 +7,6 @@ import {
NodeLabelInfo,
LayoutInfo,
NodeColumn,
- NodeInfo,
StageInfo,
} from "./PipelineGraphModel";
import { layoutGraph } from "./PipelineGraphLayout";
@@ -24,7 +23,6 @@ interface Props {
stages: Array;
layout?: Partial;
setStages?: (stages: Array) => void;
- onNodeClick?: (nodeName: string, id: number) => void;
selectedStage?: StageInfo;
path?: string;
collapsed?: boolean;
@@ -145,20 +143,6 @@ export class PipelineGraph extends React.Component {
return (selectedStage && stage && selectedStage.id === stage.id) || false;
};
- private handleNodeClick = (node: NodeInfo) => {
- if (node.isPlaceholder === false && node.stage.state !== "skipped") {
- const stage = node.stage;
- const listener = this.props.onNodeClick;
-
- if (listener) {
- listener(stage.name, stage.id);
- }
-
- // Update selection
- this.setState({ selectedStage: stage });
- }
- };
-
render() {
const {
nodeColumns,
@@ -194,15 +178,6 @@ export class PipelineGraph extends React.Component {
layout={this.state.layout}
/>
- {nodes.map((node) => (
-
- ))}
+ {nodes.map((node) => (
+
+ ))}
{bigLabels.map((label) => (
{
startTimeMillis: "",
totalDurationMillis: "",
agent: "built-in",
+ url: "?selected-node=0",
};
const makeStage = (
diff --git a/src/main/frontend/pipeline-graph-view/pipeline-graph/main/PipelineGraphModel.tsx b/src/main/frontend/pipeline-graph-view/pipeline-graph/main/PipelineGraphModel.tsx
index 7ae5b288b..bc170a27e 100644
--- a/src/main/frontend/pipeline-graph-view/pipeline-graph/main/PipelineGraphModel.tsx
+++ b/src/main/frontend/pipeline-graph-view/pipeline-graph/main/PipelineGraphModel.tsx
@@ -63,6 +63,7 @@ export interface StageInfo {
startTimeMillis: string;
totalDurationMillis: string;
agent: string;
+ url: string;
}
interface BaseNodeInfo {
diff --git a/src/main/frontend/pipeline-graph-view/pipeline-graph/main/support/StatusIcons.tsx b/src/main/frontend/pipeline-graph-view/pipeline-graph/main/support/StatusIcons.tsx
index 3a15b265c..40c1117fa 100644
--- a/src/main/frontend/pipeline-graph-view/pipeline-graph/main/support/StatusIcons.tsx
+++ b/src/main/frontend/pipeline-graph-view/pipeline-graph/main/support/StatusIcons.tsx
@@ -1,76 +1,114 @@
import * as React from "react";
import { Result } from "../PipelineGraphModel";
-import { SvgStatus } from "./SvgStatus";
export const nodeStrokeWidth = 3.5; // px.
-// Returns the correct element for the result / progress percent.
-export function getGroupForResult(
- result: Result,
- percentage: number,
- radius: number,
- centerX: number,
- centerY: number,
- outerStyle: React.CSSProperties,
-): React.ReactElement {
+function mapResultToCore(result: Result): string {
switch (result) {
- case Result.running:
- case Result.queued:
- case Result.not_built:
- case Result.skipped:
case Result.success:
+ return "blue";
+ case Result.running:
+ return "nobuilt-anime";
case Result.failure:
- case Result.paused:
+ return "red";
case Result.unstable:
+ return "yellow";
case Result.aborted:
- case Result.unknown:
- return (
-
- );
+ return "aborted";
+ case Result.not_built:
+ return "nobuilt";
default:
- badResult(result);
- return (
-
- );
+ throw new Error(`Unhandled result: ${result}`);
}
}
-function badResult(x: never) {
- console.error("Unexpected Result value", x);
-}
+export function getSymbolForResult(result: Result): React.ReactElement {
+ // Handle non-core symbols
+ if (result === Result.paused) {
+ return (
+
+ );
+ }
-export const getClassForResult = (result: Result) => {
- // These come from the themes icons.less
- switch (result) {
- case Result.aborted:
- return "icon-aborted";
- case Result.unstable:
- return "icon-yellow";
- case Result.failure:
- return "icon-red";
- case Result.success:
- return "icon-blue";
- case Result.running:
- case Result.queued:
- return "icon-grey";
- case Result.skipped:
- return "icon-skipped";
- case Result.not_built:
- case Result.paused:
- case Result.unknown:
- default:
- return "icon-nobuilt";
+ if (result === Result.unknown) {
+ return (
+
+ );
}
-};
+
+ if (result === Result.skipped) {
+ return (
+
+ );
+ }
+
+ // Map the result to retrieve the appropriate symbol from core
+ const symbols = document.querySelector(
+ "#pgv-build-status-icons",
+ );
+ const mappedResult = mapResultToCore(result);
+
+ return (
+ `,
+ }}
+ />
+ );
+}
diff --git a/src/main/frontend/pipeline-graph-view/pipeline-graph/main/support/SvgStatus.tsx b/src/main/frontend/pipeline-graph-view/pipeline-graph/main/support/SvgStatus.tsx
deleted file mode 100644
index ee446358f..000000000
--- a/src/main/frontend/pipeline-graph-view/pipeline-graph/main/support/SvgStatus.tsx
+++ /dev/null
@@ -1,216 +0,0 @@
-import * as React from "react";
-import { Result } from "../PipelineGraphModel";
-import { getClassForResult } from "./StatusIcons";
-
-// These were mostly taken from SVG and pre-translated
-const questionMarkPath =
- "M-0.672,4.29 L0.753,4.29 L0.753,5.78 L-0.672,5.78 L-0.672,4.29 Z M-2.21,-3.94 " +
- "C-1.63,-4.57 -0.830,-4.88 0.187,-4.88 C1.13,-4.88 1.88,-4.61 2.45,-4.07 C3.01,-3.54 3.30,-2.85 3.30,-2.01 " +
- "C3.30,-1.51 3.19,-1.10 2.99,-0.782 C2.78,-0.467 2.36,-0.00346 1.73,0.608 C1.27,1.05 0.972,1.43 0.836,1.74 " +
- "C0.700,2.04 0.632,2.50 0.632,3.10 L-0.644,3.10 C-0.644,2.42 -0.562,1.87 -0.400,1.45 " +
- "C-0.238,1.03 0.118,0.553 0.668,0.0133 L1.24,-0.553 C1.41,-0.715 1.55,-0.885 1.66,-1.06 " +
- "C1.85,-1.37 1.94,-1.69 1.94,-2.03 C1.94,-2.50 1.80,-2.90 1.52,-3.25 C1.24,-3.59 0.782,-3.76 0.137,-3.76 " +
- "C-0.660,-3.76 -1.21,-3.47 -1.52,-2.87 C-1.69,-2.54 -1.79,-2.07 -1.81,-1.45 L-3.09,-1.45 " +
- "C-3.09,-2.48 -2.80,-3.31 -2.21,-3.94 L-2.21,-3.94 Z";
-
-interface Props {
- result: Result;
- radius: number;
- outerStyle?: React.CSSProperties;
- centerX?: number;
- centerY?: number;
-}
-
-const imagesPath = document.head.dataset.imagesurl;
-
-export class SvgStatus extends React.PureComponent {
- render() {
- const baseWrapperClasses = "build-status-icon__wrapper icon-md";
- const {
- result,
- radius = 12,
- centerX = -radius,
- centerY = -radius,
- } = this.props;
- const outerStyle = this.props.outerStyle;
- const diameter = radius * 2;
- const iconOuterClassName =
- result === Result.running ? "in-progress" : "static";
- const iconSuffix = result === Result.running ? "-anime" : "";
- const style = { width: diameter, height: diameter };
- return (
-
-
-
-
- {getGlyphFor(result, radius, style, centerX, centerY)}
-
- );
- }
-}
-
-/**
- Returns a glyph (as ) for specified result type. Centered at centerX,centerY, scaled for 24px icons.
- */
-function getGlyphFor(
- result: Result,
- radius: number,
- style: React.CSSProperties,
- centerX?: number,
- centerY?: number,
-) {
- // NB: If we start resizing these things, we'll need to use radius/12 to
- // generate a "scale" transform for the group
- const diameter = radius * 2;
- switch (result) {
- case Result.aborted:
- return (
-
- );
- case Result.paused:
- // "||"
- // 8px 9.3px
- return (
-
- );
- case Result.unstable:
- // "!"
- return (
-
- );
- case Result.success:
- // check-mark
- return (
-
- );
- case Result.failure:
- // "X"
- return (
-
- );
- case Result.not_built:
- case Result.running:
- return (
-
- );
- case Result.skipped:
- case Result.queued:
- return null;
- case Result.unknown:
- break; // Continue on to the "unknown render"
-
- default:
- badResult(result); // Compile-time exhaustiveness check as well as runtime error logging, then continue to "unknown" icon
- }
- // "?" for Result.unknown or for bad input
- return (
-
- );
-}
-
-function badResult(x: never) {
- console.error("Unexpected Result value", x);
-}
diff --git a/src/main/frontend/pipeline-graph-view/pipeline-graph/main/support/nodes.tsx b/src/main/frontend/pipeline-graph-view/pipeline-graph/main/support/nodes.tsx
index b2d82f5a2..54be3c40f 100644
--- a/src/main/frontend/pipeline-graph-view/pipeline-graph/main/support/nodes.tsx
+++ b/src/main/frontend/pipeline-graph-view/pipeline-graph/main/support/nodes.tsx
@@ -1,81 +1,71 @@
import * as React from "react";
-import { getGroupForResult } from "../support/StatusIcons";
+import { getSymbolForResult } from "./StatusIcons";
import {
decodeResultValue,
LayoutInfo,
NodeColumn,
NodeInfo,
StageInfo,
+ StageNodeInfo,
} from "../PipelineGraphModel";
type SVGChildren = Array; // Fixme: Maybe refine this? Not sure what should go here, we have working code I can't make typecheck
interface NodeProps {
node: NodeInfo;
- layout: LayoutInfo;
- isStageSelected: (stage: StageInfo) => boolean;
- onClick: (node: NodeInfo) => void;
}
/**
* Generate the SVG elements to represent a node.
*/
-export function Node({ node, layout, isStageSelected, onClick }: NodeProps) {
- let nodeIsSelected = false;
- const { nodeRadius, connectorStrokeWidth, terminalRadius } = layout;
+export function Node({ node }: NodeProps) {
const key = node.key;
-
const groupChildren: SVGChildren = [];
if (node.isPlaceholder) {
- groupChildren.push(
- ,
- );
- } else {
- const { completePercent = 0, title, state } = node.stage;
- const resultClean = decodeResultValue(state);
-
- groupChildren.push(
- getGroupForResult(resultClean, completePercent, nodeRadius),
- );
-
- if (title) {
- groupChildren.push({title});
- }
-
- nodeIsSelected = isStageSelected(node.stage);
+ groupChildren.push();
+ const groupProps = {
+ key,
+ style: {
+ position: "absolute",
+ top: node.y,
+ left: node.x,
+ translate: "-50% -50%",
+ },
+ className: "PWGx-pipeline-node",
+ };
+ return React.createElement("div", groupProps, ...groupChildren);
}
- // Set click listener and link cursor only for nodes we want to be clickable
- const clickableProps: React.SVGProps = {};
+ const { title, state, url } = node.stage ?? {};
+ const resultClean = decodeResultValue(state);
+
+ groupChildren.push(getSymbolForResult(resultClean));
- if (node.isPlaceholder === false && node.stage.state !== "skipped") {
- clickableProps.cursor = "pointer";
- clickableProps.onClick = () => onClick(node);
+ if (title) {
+ groupChildren.push({title});
}
- // Add an invisible click/touch/mouseover target, because the nodes are small and (more importantly)
- // many are hollow.
- groupChildren.push(
- ,
- );
+ const clickable = !node.isPlaceholder && node.stage?.state !== "skipped";
// Most of the nodes are in shared code, so they're rendered at 0,0. We transform with a to position them
const groupProps = {
key,
- transform: `translate(${node.x},${node.y})`,
- className: nodeIsSelected
- ? "PWGx-pipeline-node-selected"
- : "PWGx-pipeline-node",
+ href: clickable ? document.head.dataset.rooturl + url : null,
+ style: {
+ position: "absolute",
+ top: node.y,
+ left: node.x,
+ translate: "-50% -50%",
+ },
+ className: "PWGx-pipeline-node PWGx-pipeline-node--" + resultClean,
};
- return React.createElement("g", groupProps, ...groupChildren);
+ return React.createElement(
+ clickable ? "a" : "div",
+ groupProps,
+ ...groupChildren,
+ );
}
interface SelectionHighlightProps {
diff --git a/src/main/frontend/pipeline-graph-view/pipeline-graph/styles/PipelineGraphWidget.scss b/src/main/frontend/pipeline-graph-view/pipeline-graph/styles/PipelineGraphWidget.scss
index 998997dd8..5745df6a3 100644
--- a/src/main/frontend/pipeline-graph-view/pipeline-graph/styles/PipelineGraphWidget.scss
+++ b/src/main/frontend/pipeline-graph-view/pipeline-graph/styles/PipelineGraphWidget.scss
@@ -140,8 +140,28 @@ circle.halo {
stroke: $graph-connector-grey;
}
+.PWGx-pipeline-node {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 24px;
+ height: 24px;
+
+ & > div {
+ display: contents;
+ }
+
+ svg {
+ width: 24px;
+ height: 24px;
+ }
+}
+
.PWGx-pipeline-node-terminal {
- fill: $graph-connector-grey;
+ width: 10px;
+ height: 10px;
+ background: $graph-connector-grey;
+ border-radius: 10px;
}
.PWGx-pipeline-connector-skipped {
diff --git a/src/main/frontend/step-status/StepStatus.tsx b/src/main/frontend/step-status/StepStatus.tsx
index a71a68815..20f785b6c 100644
--- a/src/main/frontend/step-status/StepStatus.tsx
+++ b/src/main/frontend/step-status/StepStatus.tsx
@@ -1,9 +1,8 @@
-import { CSSProperties, FunctionComponent } from "react";
+import { FunctionComponent } from "react";
import * as React from "react";
import { Result } from "../pipeline-graph-view/pipeline-graph/main";
import { decodeResultValue } from "../pipeline-graph-view/pipeline-graph/main/PipelineGraphModel";
-import { getGroupForResult } from "../pipeline-graph-view/pipeline-graph/main/support/StatusIcons";
-import { height } from "@mui/system";
+import { getSymbolForResult } from "../pipeline-graph-view/pipeline-graph/main/support/StatusIcons";
interface Props {
status: Result;
@@ -29,31 +28,16 @@ export function getStepStatus(
complete?: number,
radius?: number,
) {
- const icon = getGroupForResult(
- decodeResultValue(status),
- complete ?? 100,
- radius ?? 12,
- 0,
- 0,
- {},
- );
- const diameter = radius ? radius * 2 : 24;
+ const icon = getSymbolForResult(decodeResultValue(status));
return (
-
+ {icon}
);
}
diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineGraphApi.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineGraphApi.java
index 7f2539e09..c16647e7c 100644
--- a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineGraphApi.java
+++ b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineGraphApi.java
@@ -76,12 +76,12 @@ private List getPipelineNodes(PipelineGraphBuilderApi bui
private Function mapper(
Map stageMap, Map> stageToChildrenMap) {
-
+ String runUrl = run.getUrl();
return id -> {
List orDefault = stageToChildrenMap.getOrDefault(id, emptyList());
List children =
orDefault.stream().map(mapper(stageMap, stageToChildrenMap)).collect(Collectors.toList());
- return stageMap.get(id).toPipelineStage(children);
+ return stageMap.get(id).toPipelineStage(children, runUrl);
};
}
@@ -117,6 +117,7 @@ private PipelineGraph createTree(PipelineGraphBuilderApi builder) {
stageToChildrenMap.put(stage.getParents().get(0), parentChildren);
}
});
+ String runUrl = run.getUrl();
List stageResults = stageMap.values().stream()
.map(pipelineStageInternal -> {
List children =
@@ -124,7 +125,7 @@ private PipelineGraph createTree(PipelineGraphBuilderApi builder) {
.map(mapper(stageMap, stageToChildrenMap))
.collect(Collectors.toList());
- return pipelineStageInternal.toPipelineStage(children);
+ return pipelineStageInternal.toPipelineStage(children, runUrl);
})
.filter(stage -> !childNodes.contains(stage.getId()))
.collect(Collectors.toList());
@@ -205,6 +206,7 @@ private PipelineGraph createShallowTree(PipelineGraphBuilderApi builder) {
}
});
+ String runUrl = run.getUrl();
List stageResults = stageMap.values().stream()
.map(pipelineStageInternal -> {
List children =
@@ -212,7 +214,7 @@ private PipelineGraph createShallowTree(PipelineGraphBuilderApi builder) {
.map(mapper(stageMap, stageToChildrenMap))
.collect(Collectors.toList());
- return pipelineStageInternal.toPipelineStage(children);
+ return pipelineStageInternal.toPipelineStage(children, runUrl);
})
.filter(stage -> topLevelStageIds.contains(stage.getId()))
.collect(Collectors.toList());
diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStage.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStage.java
index 743850b7c..a13dc4541 100644
--- a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStage.java
+++ b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStage.java
@@ -11,6 +11,7 @@ public class PipelineStage extends AbstractPipelineNode {
private boolean sequential;
private boolean synthetic;
private String agent;
+ private String url;
public PipelineStage(
String id,
@@ -25,7 +26,8 @@ public PipelineStage(
boolean sequential,
boolean synthetic,
TimingInfo timingInfo,
- String agent) {
+ String agent,
+ String runUrl) {
super(id, name, state, completePercent, type, title, timingInfo);
this.children = children;
this.seqContainerName = seqContainerName;
@@ -33,6 +35,7 @@ public PipelineStage(
this.sequential = sequential;
this.synthetic = synthetic;
this.agent = agent;
+ this.url = "/" + runUrl + "pipeline-console?selected-node=" + id;
}
public PipelineStage getNextSibling() {
@@ -60,4 +63,8 @@ public boolean isSynthetic() {
public String getAgent() {
return agent;
}
+
+ public String getUrl() {
+ return url;
+ }
}
diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStageInternal.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStageInternal.java
index 99ba5f185..58ada4246 100644
--- a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStageInternal.java
+++ b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStageInternal.java
@@ -132,7 +132,7 @@ public void setAgent(String aAgent) {
this.agent = aAgent;
}
- public PipelineStage toPipelineStage(List children) {
+ public PipelineStage toPipelineStage(List children, String runUrl) {
return new PipelineStage(
id,
name,
@@ -142,10 +142,11 @@ public PipelineStage toPipelineStage(List children) {
type,
title,
seqContainerName,
- nextSibling != null ? nextSibling.toPipelineStage(Collections.emptyList()) : null,
+ nextSibling != null ? nextSibling.toPipelineStage(Collections.emptyList(), runUrl) : null,
sequential,
synthetic,
timingInfo,
- agent);
+ agent,
+ runUrl);
}
}
diff --git a/src/main/resources/io/jenkins/plugins/pipelinegraphview/PipelineGraphViewAction/index.jelly b/src/main/resources/io/jenkins/plugins/pipelinegraphview/PipelineGraphViewAction/index.jelly
index 318b042fd..6509933d4 100644
--- a/src/main/resources/io/jenkins/plugins/pipelinegraphview/PipelineGraphViewAction/index.jelly
+++ b/src/main/resources/io/jenkins/plugins/pipelinegraphview/PipelineGraphViewAction/index.jelly
@@ -4,6 +4,8 @@
+
+
diff --git a/src/main/resources/io/jenkins/plugins/pipelinegraphview/PipelineGraphViewAction/summary.jelly b/src/main/resources/io/jenkins/plugins/pipelinegraphview/PipelineGraphViewAction/summary.jelly
index b52f5742a..d63b6c389 100644
--- a/src/main/resources/io/jenkins/plugins/pipelinegraphview/PipelineGraphViewAction/summary.jelly
+++ b/src/main/resources/io/jenkins/plugins/pipelinegraphview/PipelineGraphViewAction/summary.jelly
@@ -1,7 +1,8 @@
-
+
+
diff --git a/src/main/resources/io/jenkins/plugins/pipelinegraphview/consoleview/PipelineConsoleViewAction/index.jelly b/src/main/resources/io/jenkins/plugins/pipelinegraphview/consoleview/PipelineConsoleViewAction/index.jelly
index 12a6f0542..b8790995c 100644
--- a/src/main/resources/io/jenkins/plugins/pipelinegraphview/consoleview/PipelineConsoleViewAction/index.jelly
+++ b/src/main/resources/io/jenkins/plugins/pipelinegraphview/consoleview/PipelineConsoleViewAction/index.jelly
@@ -1,9 +1,11 @@
-
+
+
+
diff --git a/src/main/resources/io/jenkins/plugins/pipelinegraphview/multipipelinegraphview/MultiPipelineGraphViewAction/index.jelly b/src/main/resources/io/jenkins/plugins/pipelinegraphview/multipipelinegraphview/MultiPipelineGraphViewAction/index.jelly
index 9edebd74b..9ba590cfc 100644
--- a/src/main/resources/io/jenkins/plugins/pipelinegraphview/multipipelinegraphview/MultiPipelineGraphViewAction/index.jelly
+++ b/src/main/resources/io/jenkins/plugins/pipelinegraphview/multipipelinegraphview/MultiPipelineGraphViewAction/index.jelly
@@ -1,7 +1,7 @@
-
+
@@ -23,6 +23,7 @@
+
diff --git a/src/main/resources/io/jenkins/plugins/pipelinegraphview/multipipelinegraphview/MultiPipelineGraphViewAction/jobMain.jelly b/src/main/resources/io/jenkins/plugins/pipelinegraphview/multipipelinegraphview/MultiPipelineGraphViewAction/jobMain.jelly
index 769e21215..9cd0afaa4 100644
--- a/src/main/resources/io/jenkins/plugins/pipelinegraphview/multipipelinegraphview/MultiPipelineGraphViewAction/jobMain.jelly
+++ b/src/main/resources/io/jenkins/plugins/pipelinegraphview/multipipelinegraphview/MultiPipelineGraphViewAction/jobMain.jelly
@@ -1,6 +1,7 @@
-
+
+
diff --git a/src/main/resources/lib/pipeline-graph-view/symbols.jelly b/src/main/resources/lib/pipeline-graph-view/symbols.jelly
new file mode 100644
index 000000000..0e8c04fd7
--- /dev/null
+++ b/src/main/resources/lib/pipeline-graph-view/symbols.jelly
@@ -0,0 +1,23 @@
+
+
+
+
+
+ Provides the Jenkins Symbols of build statuses for use in React.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
|