mirror of
https://github.com/haidaraM/ansible-playbook-grapher
synced 2024-11-10 14:14:19 +00:00
fix: Refactor the JS part and fix issue when selecting/unselecting nodes
This commit is contained in:
parent
53da4b2a48
commit
b57097e89b
2 changed files with 94 additions and 38 deletions
|
@ -1,10 +1,16 @@
|
||||||
|
/**
|
||||||
|
Hover on nodes, edges, path and polygon
|
||||||
|
*/
|
||||||
.node:hover, .edge:hover, path:hover, path + polygon:hover {
|
.node:hover, .edge:hover, path:hover, path + polygon:hover {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
stroke-width: 3;
|
stroke-width: 3;
|
||||||
font-weight: bolder;
|
font-weight: bolder;
|
||||||
}
|
}
|
||||||
|
|
||||||
.my_hover {
|
/**
|
||||||
|
Manually added class by the script highlight-hover.js when hovering on plays and roles
|
||||||
|
*/
|
||||||
|
.highlight {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
stroke-width: 3;
|
stroke-width: 3;
|
||||||
font-weight: bolder;
|
font-weight: bolder;
|
||||||
|
|
|
@ -1,58 +1,108 @@
|
||||||
const HOVER_CLASS = "my_hover";
|
/**
|
||||||
|
* This file contains the functions responsible to highlight the plays, roles and tasks when rendering the SVG file in a browser
|
||||||
|
* or any SVG reader that support Javascript.
|
||||||
|
*/
|
||||||
|
|
||||||
var selectedElement = null;
|
/**
|
||||||
|
* The name of the CSS class for highlighted elements
|
||||||
|
* @type {string}
|
||||||
|
*/
|
||||||
|
const HIGHLIGHT_CLASS = "highlight";
|
||||||
|
|
||||||
function addClass(rootElement) {
|
/**
|
||||||
|
* The current selected element on the graph
|
||||||
|
* @type {null}
|
||||||
|
*/
|
||||||
|
let currentSelectedElement = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Highlight the linked nodes of the given root element
|
||||||
|
* @param rootElement
|
||||||
|
*/
|
||||||
|
function highlightLinkedNodes(rootElement) {
|
||||||
$(rootElement).find('link').each(function (index, element) {
|
$(rootElement).find('link').each(function (index, element) {
|
||||||
var target = $(element).attr('target');
|
let target = $(element).attr('target');
|
||||||
var currentElement = $('#' + target);
|
let currentElement = $('#' + target);
|
||||||
currentElement.addClass(HOVER_CLASS);
|
currentElement.addClass(HIGHLIGHT_CLASS);
|
||||||
|
|
||||||
addClass(currentElement);
|
// Recursively highlight
|
||||||
|
highlightLinkedNodes(currentElement);
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function removeClass(rootElement, hover) {
|
|
||||||
$(rootElement).find('link').each(function (index, element) {
|
|
||||||
if ($(rootElement).attr('id') !== $(selectedElement).attr('id') || !hover) {
|
|
||||||
var target = $(element).attr('target');
|
|
||||||
var currentElement = $('#' + target);
|
|
||||||
currentElement.removeClass(HOVER_CLASS);
|
|
||||||
|
|
||||||
removeClass(currentElement);
|
/**
|
||||||
}
|
* Unhighlight the linked nodes of the given root element
|
||||||
|
* @param {Element} rootElement
|
||||||
|
* @param {boolean} isHover True when we are coming from a mouseleave event. In that case, we should not unhighlight if
|
||||||
|
* the rootElement is the current selected element
|
||||||
|
*/
|
||||||
|
function unHighlightLinkedNodes(rootElement, isHover) {
|
||||||
|
|
||||||
})
|
// Do not unhighlight the current current selected element
|
||||||
}
|
if ($(rootElement).attr('id') !== $(currentSelectedElement).attr('id') || !isHover) {
|
||||||
|
|
||||||
function hoverIn(event) {
|
$(rootElement).find('link').each(function (index, element) {
|
||||||
addClass(event.currentTarget);
|
let target = $(element).attr('target');
|
||||||
}
|
let currentElement = $('#' + target);
|
||||||
|
currentElement.removeClass(HIGHLIGHT_CLASS);
|
||||||
|
|
||||||
function hoverOut(event) {
|
// Recursively unhighlight
|
||||||
removeClass(event.currentTarget, true);
|
unHighlightLinkedNodes(currentElement, isHover);
|
||||||
}
|
})
|
||||||
|
|
||||||
function clickOnElement(event) {
|
|
||||||
var newElement = event.currentTarget;
|
|
||||||
|
|
||||||
if ($(newElement).attr('id') === $(selectedElement).attr('id')) {
|
|
||||||
removeClass(selectedElement, false);
|
|
||||||
} else {
|
|
||||||
removeClass(selectedElement);
|
|
||||||
addClass(newElement)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
selectedElement = newElement;
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hover handler for mouseenter event
|
||||||
|
* @param event
|
||||||
|
*/
|
||||||
|
function hoverMouseEnter(event) {
|
||||||
|
highlightLinkedNodes(event.currentTarget);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hover handler for mouseleave event
|
||||||
|
* @param event
|
||||||
|
*/
|
||||||
|
function hoverMouseLeave(event) {
|
||||||
|
unHighlightLinkedNodes(event.currentTarget, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler when clicking on some elements
|
||||||
|
* @param event
|
||||||
|
*/
|
||||||
|
function clickOnElement(event) {
|
||||||
|
let newClickedElement = $(event.currentTarget);
|
||||||
|
|
||||||
|
if (newClickedElement.attr('id') === $(currentSelectedElement).attr('id')) { // clicking again on the same element
|
||||||
|
newClickedElement.removeClass(HIGHLIGHT_CLASS);
|
||||||
|
unHighlightLinkedNodes(currentSelectedElement, false);
|
||||||
|
currentSelectedElement = null;
|
||||||
|
} else { // clicking on a different node
|
||||||
|
|
||||||
|
// Remove highlight from all the nodes linked the current selected node
|
||||||
|
unHighlightLinkedNodes(currentSelectedElement, false);
|
||||||
|
|
||||||
|
newClickedElement.addClass(HIGHLIGHT_CLASS);
|
||||||
|
highlightLinkedNodes(newClickedElement);
|
||||||
|
currentSelectedElement = newClickedElement;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$("#svg").ready(function () {
|
$("#svg").ready(function () {
|
||||||
|
let plays = $("g[id^=play_]");
|
||||||
|
let roles = $("g[id^=role_]");
|
||||||
|
|
||||||
$("g[id^=play_]").hover(hoverIn, hoverOut);
|
// Set hover and click events on the plays
|
||||||
$("g[id^=role_]").hover(hoverIn, hoverOut);
|
plays.hover(hoverMouseEnter, hoverMouseLeave);
|
||||||
|
plays.click(clickOnElement);
|
||||||
|
|
||||||
$("g[id^=play_]").click(clickOnElement);
|
// Set hover and click events on the roles
|
||||||
$("g[id^=role_]").click(clickOnElement);
|
roles.hover(hoverMouseEnter, hoverMouseLeave);
|
||||||
|
roles.click(clickOnElement);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue