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} - + {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 @@ +