diff --git a/awx/ui/client/src/templates/workflows/workflow-chart/workflow-chart.block.less b/awx/ui/client/src/templates/workflows/workflow-chart/workflow-chart.block.less index 0d5130a418..830a02dcd1 100644 --- a/awx/ui/client/src/templates/workflows/workflow-chart/workflow-chart.block.less +++ b/awx/ui/client/src/templates/workflows/workflow-chart/workflow-chart.block.less @@ -186,16 +186,8 @@ margin: auto; } -.WorkflowChart-tooltipArrow--right { - width: 0; - height: 0; - border-top: 10px solid transparent; - border-bottom: 10px solid transparent; - border-left: 10px solid @default-interface-txt; - margin: auto; - position: relative; - right: -55px; - top: -34px; +.WorkflowChart-tooltipArrow { + fill: @default-interface-txt; } .WorkflowChart-dashedNode { diff --git a/awx/ui/client/src/templates/workflows/workflow-chart/workflow-chart.directive.js b/awx/ui/client/src/templates/workflows/workflow-chart/workflow-chart.directive.js index 6d6520a1fa..4ec4f2495e 100644 --- a/awx/ui/client/src/templates/workflows/workflow-chart/workflow-chart.directive.js +++ b/awx/ui/client/src/templates/workflows/workflow-chart/workflow-chart.directive.js @@ -240,6 +240,81 @@ export default ['$state','moment', '$timeout', '$window', '$filter', 'Rest', 'Ge function update() { if(scope.dimensionsSet) { + const buildLinkTooltip = (d) => { + let sourceNode = d3.select(`#node-${d.source.id}`); + const sourceNodeX = d3.transform(sourceNode.attr("transform")).translate[0]; + const sourceNodeY = d3.transform(sourceNode.attr("transform")).translate[1]; + let targetNode = d3.select(`#node-${d.target.id}`); + const targetNodeX = d3.transform(targetNode.attr("transform")).translate[0]; + const targetNodeY = d3.transform(targetNode.attr("transform")).translate[1]; + let xPos, yPos, arrowPoints; + if (nodePositionMap[d.source.id].y === nodePositionMap[d.target.id].y) { + xPos = (sourceNodeX + nodeW + targetNodeX)/2 - 50; + yPos = (sourceNodeY + nodeH + targetNodeY)/2 - 70; + arrowPoints = { + pt1: { + x: xPos + 40, + y: yPos + 47 + }, + pt2: { + x: xPos + 60, + y: yPos + 47 + }, + pt3: { + x: xPos + 50, + y: yPos + 57 + } + }; + } else { + xPos = (sourceNodeX + nodeW + targetNodeX)/2 - 120; + yPos = (sourceNodeY + nodeH + targetNodeY)/2 - 30; + arrowPoints = { + pt1: { + x: xPos + 100, + y: yPos + 17 + }, + pt2: { + x: xPos + 100, + y: yPos + 33 + }, + pt3: { + x: xPos + 110, + y: yPos + 25 + } + }; + } + let edgeTypeLabel; + switch(d.edgeType) { + case "always": + edgeTypeLabel = TemplatesStrings.get('workflow_maker.ALWAYS'); + break; + case "success": + edgeTypeLabel = TemplatesStrings.get('workflow_maker.ON_SUCCESS'); + break; + case "failure": + edgeTypeLabel = TemplatesStrings.get('workflow_maker.ON_FAILURE'); + break; + } + let linkInstructionText = !scope.readOnly ? TemplatesStrings.get('workflow_maker.EDIT_LINK_TOOLTIP') : TemplatesStrings.get('workflow_maker.VIEW_LINK_TOOLTIP'); + let linkTooltip = svgGroup.append("g") + .attr("class", "WorkflowChart-tooltip"); + linkTooltip.append("foreignObject") + .attr("transform", `translate(${xPos},${yPos})`) + .attr("width", 100) + .attr("height", 50) + .html(function(){ + return `