module.exports = function ( graph ){
/** variable defs **/
var warningModule = {};
var superContainer = d3.select("#WarningErrorMessages");
var _messageContainers = [];
var _messageContext = [];
var _visibleStatus = [];
var _filterHintId;
var _editorHintId;
var _messageId = -1;
superContainer.style("display", "inline-block");
var cssStyleIndex = 0;
var styleSelectorIndex = 2;
// helper for standalone webvowl in chrome
function createCSSSelector( name, rules ){
var style = document.createElement('style');
style.type = 'text/css';
document.getElementsByTagName('head')[0].appendChild(style);
if ( !(style.sheet || {}).insertRule )
(style.styleSheet || style.sheet).addRule(name, rules);
else
style.sheet.insertRule(name + "{" + rules + "}", 0);
}
function findCSS_Index(){
createCSSSelector("@keyframes msg_CollapseAnimation", " 0% { top: 0; } 100% { top: -400px;}");
console.log(document.styleSheets );
}
findCSS_Index();
warningModule.addMessageBox = function (){
// add a container;
_messageId++;
var messageContainer = d3.select("#WarningErrorMessages").append("div");
messageContainer.node().id = "messageContainerId_" + _messageId;
var messageContext = messageContainer.append("div");
messageContext.node().id = "messageContextId_" + _messageId;
messageContext.style("top", "0");
messageContainer.style("position", "relative");
messageContainer.style("width", "100%");
//save in array
_messageContainers.push(messageContainer);
_messageContext.push(messageContext);
// add animation to the container
messageContainer.node().addEventListener("animationend", _msgContainer_animationEnd);
// set visible flag that is used in end of animation
_visibleStatus[_messageId] = true;
return _messageId;
};
function _msgContainer_animationEnd(){
var containerId = this.id;
var tokens = containerId.split("_")[1];
var mContainer = d3.select("#" + containerId);
// get number of children
mContainer.classed("hidden", !_visibleStatus[tokens]);
// clean up DOM
if ( !_visibleStatus[tokens] ) {
mContainer.remove();
_messageContext[tokens] = null;
_messageContainers[tokens] = null;
}
// remove event listener
var c = d3.select(this);
// c.node().removeEventListener("animationend",_msgContainer_animationEnd);
}
warningModule.createMessageContext = function ( id ){
var warningContainer = _messageContext[id];
var moduleContainer = _messageContainers[id];
var generalHint = warningContainer.append('div');
generalHint.node().innerHTML = "";
_editorHintId = id;
/** Editing mode activated. You can now modify an existing ontology or create a new one via the ontology menu. You can save any ontology using the export menu (and exporting it as TTL file).**/
generalHint.node().innerHTML += "Editing mode activated.
" +
"You can now modify an existing ontology or create a new one via the ontology menu.
" +
"You can save any ontology using the export menu (and exporting it as TTL file).";
generalHint.style("padding", "5px");
generalHint.style("line-height", "1.2em");
generalHint.style("font-size", "1.2em");
var ul = warningContainer.append('ul');
ul.append('li').node().innerHTML = "Create a class with double click / tap on empty canvas area.";
ul.append('li').node().innerHTML = "Edit names with double click / tap on element.";
ul.append('li').node().innerHTML = "Selection of default constructors is provided in the left sidebar.";
ul.append('li').node().innerHTML = "Additional editing functionality is provided in the right sidebar.";
var gotItButton = warningContainer.append("label");
gotItButton.node().id = "killWarningErrorMessages_" + id;
gotItButton.node().innerHTML = "Got It";
gotItButton.on("click", warningModule.closeMessage);
moduleContainer.classed("hidden", false);
moduleContainer.style("-webkit-animation-name", "warn_ExpandAnimation");
moduleContainer.style("-webkit-animation-duration", "0.5s");
};
warningModule.showMessage = function ( id ){
var moduleContainer = _messageContainers[id];
moduleContainer.classed("hidden", false);
moduleContainer.style("-webkit-animation-name", "warn_ExpandAnimation");
moduleContainer.style("-webkit-animation-duration", "0.5s");
};
warningModule.closeMessage = function ( id ){
var nId;
if ( id === undefined ) {
var givenId = this.id;
nId = givenId.split("_")[1];
} else {
nId = id;
}
if ( id && id.indexOf("_") !== -1 ) {
nId = id.split("_")[1];
}
_visibleStatus[nId] = false;
// get module;
var moduleContainer = _messageContainers[nId];
moduleContainer.style("-webkit-animation-name", "warn_CollapseAnimation");
moduleContainer.style("-webkit-animation-duration", "0.5s");
var m_height = moduleContainer.node().getBoundingClientRect().height;
// find my id in the children
var pNode = moduleContainer.node().parentNode;
var followingChildren = [];
var pChild = pNode.children;
var pChild_len = pChild.length;
var containerId = moduleContainer.node().id;
var found_me = false;
for ( var i = 0; i < pChild_len; i++ ) {
if ( found_me === true ) {
followingChildren.push(pChild[i].id);
}
if ( containerId === pChild[i].id ) {
found_me = true;
}
}
for ( var fc = 0; fc < followingChildren.length; fc++ ) {
var child = d3.select("#" + followingChildren[fc]);
// get the document style and overwrite it;
var superCss = document.styleSheets[styleSelectorIndex].cssRules[cssStyleIndex];
// remove the existing 0% and 100% rules
superCss.deleteRule("0%");
superCss.deleteRule("100%");
superCss.appendRule("0% {top: 0;}");
superCss.appendRule("100% {top: -" + m_height + "px;");
child.style("-webkit-animation-name", "msg_CollapseAnimation");
child.style("-webkit-animation-duration", "0.5s");
child.node().addEventListener("animationend", _child_animationEnd);
}
};
function _child_animationEnd(){
var c = d3.select(this);
c.style("-webkit-animation-name", "");
c.style("-webkit-animation-duration", "");
c.node().removeEventListener("animationend", _child_animationEnd);
}
warningModule.closeFilterHint = function (){
if ( _messageContainers[_filterHintId] ) {
_messageContainers[_filterHintId].classed("hidden", true);
_messageContainers[_filterHintId].remove();
_messageContainers[_filterHintId] = null;
_messageContext[_filterHintId] = null;
_visibleStatus[_filterHintId] = false;
}
};
warningModule.showEditorHint = function (){
var id = warningModule.addMessageBox();
warningModule.createMessageContext(id);
};
warningModule.showExporterWarning=function (){
warningModule.showWarning("Can not export ontology", "Detected unsupported ontology axioms, (e.g. owl:Union)", "Ontology is not exported", 1, false);
};
warningModule.responseWarning = function ( header, reason, action, callback, parameterArray, forcedWarning ){
var id = warningModule.addMessageBox();
var warningContainer = _messageContext[id];
var moduleContainer = _messageContainers[id];
_visibleStatus[id] = true;
d3.select("#blockGraphInteractions").classed("hidden", false);
var graphWidth = 0.5 * graph.options().width();
if ( header.length > 0 ) {
var head = warningContainer.append("div");
head.style("padding", "5px");
var titleHeader = head.append("div");
// some classes
titleHeader.style("display", "inline-flex");
titleHeader.node().innerHTML = "Warning:";
titleHeader.style("padding-right", "3px");
var msgHeader = head.append("div");
// some classes
msgHeader.style("display", "inline-flex");
msgHeader.style("max-width", graphWidth + "px");
msgHeader.node().innerHTML = header;
}
if ( reason.length > 0 ) {
var reasonContainer = warningContainer.append("div");
reasonContainer.style("padding", "5px");
var reasonHeader = reasonContainer.append("div");
// some classes
reasonHeader.style("display", "inline-flex");
reasonHeader.style("padding-right", "3px");
reasonHeader.node().innerHTML = "Reason:";
var msgReason = reasonContainer.append("div");
// some classes
msgReason.style("display", "inline-flex");
msgReason.style("max-width", graphWidth + "px");
msgReason.node().innerHTML = reason;
}
if ( action.length > 0 ) {
var actionContainer = warningContainer.append("div");
actionContainer.style("padding", "5px");
var actionHeader = actionContainer.append("div");
// some classes
actionHeader.style("display", "inline-flex");
actionHeader.style("padding-right", "8px");
actionHeader.node().innerHTML = "Action:";
var msgAction = actionContainer.append("div");
// some classes
msgAction.style("display", "inline-flex");
msgAction.style("max-width", graphWidth + "px");
msgAction.node().innerHTML = action;
}
var gotItButton = warningContainer.append("label");
gotItButton.node().id = "killWarningErrorMessages_" + id;
gotItButton.node().innerHTML = "Continue";
gotItButton.on("click", function (){
warningModule.closeMessage(this.id);
d3.select("#blockGraphInteractions").classed("hidden", true);
callback(parameterArray[0], parameterArray[1], parameterArray[2], parameterArray[3]);
});
warningContainer.append("span").node().innerHTML = "|";
var cancelButton = warningContainer.append("label");
cancelButton.node().id = "cancelButton_" + id;
cancelButton.node().innerHTML = "Cancel";
cancelButton.on("click", function (){
warningModule.closeMessage(this.id);
d3.select("#blockGraphInteractions").classed("hidden", true);
});
moduleContainer.classed("hidden", false);
moduleContainer.style("-webkit-animation-name", "warn_ExpandAnimation");
moduleContainer.style("-webkit-animation-duration", "0.5s");
};
warningModule.showFilterHint = function (){
var id = warningModule.addMessageBox();
var warningContainer = _messageContext[id];
var moduleContainer = _messageContainers[id];
_visibleStatus[id] = true;
_filterHintId = id;
var generalHint = warningContainer.append('div');
/** Editing mode activated. You can now modify an existing ontology or create a new one via the ontology menu. You can save any ontology using the export menu (and exporting it as TTL file).**/
generalHint.node().innerHTML = "Collapsing filter activated.
" +
"The number of visualized elements has been automatically reduced.
" +
"Use the degree of collapsing slider in the filter menu to adjust the visualization.
" +
"Note: A performance decrease could be experienced with a growing amount of visual elements in the graph.";
generalHint.style("padding", "5px");
generalHint.style("line-height", "1.2em");
generalHint.style("font-size", "1.2em");
var gotItButton = warningContainer.append("label");
gotItButton.node().id = "killFilterMessages_" + id;
gotItButton.node().innerHTML = "Got It";
gotItButton.on("click", warningModule.closeMessage);
moduleContainer.classed("hidden", false);
moduleContainer.style("-webkit-animation-name", "warn_ExpandAnimation");
moduleContainer.style("-webkit-animation-duration", "0.5s");
};
warningModule.showMultiFileUploadWarning = function (){
var id = warningModule.addMessageBox();
var warningContainer = _messageContext[id];
var moduleContainer = _messageContainers[id];
_visibleStatus[id] = true;
_filterHintId = id;
var generalHint = warningContainer.append('div');
generalHint.node().innerHTML = "Uploading multiple files is not supported.
";
generalHint.style("padding", "5px");
generalHint.style("line-height", "1.2em");
generalHint.style("font-size", "1.2em");
var gotItButton = warningContainer.append("label");
gotItButton.node().id = "killFilterMessages_" + id;
gotItButton.node().innerHTML = "Got It";
gotItButton.on("click", warningModule.closeMessage);
moduleContainer.classed("hidden", false);
moduleContainer.style("-webkit-animation-name", "warn_ExpandAnimation");
moduleContainer.style("-webkit-animation-duration", "0.5s");
};
warningModule.showWarning = function ( header, reason, action, type, forcedWarning, additionalOpts ){
var id = warningModule.addMessageBox();
var warningContainer = _messageContext[id];
var moduleContainer = _messageContainers[id];
_visibleStatus[id] = true;
// add new one;
var graphWidth = 0.5 * graph.options().width();
if ( header.length > 0 ) {
var head = warningContainer.append("div");
head.style("padding", "5px");
var titleHeader = head.append("div");
// some classes
titleHeader.style("display", "inline-flex");
titleHeader.node().innerHTML = "Warning:";
titleHeader.style("padding-right", "3px");
var msgHeader = head.append("div");
// some classes
msgHeader.style("display", "inline-flex");
msgHeader.style("max-width", graphWidth + "px");
msgHeader.node().innerHTML = header;
}
if ( reason.length > 0 ) {
var reasonContainer = warningContainer.append("div");
reasonContainer.style("padding", "5px");
var reasonHeader = reasonContainer.append("div");
// some classes
reasonHeader.style("display", "inline-flex");
reasonHeader.style("padding-right", "3px");
reasonHeader.node().innerHTML = "Reason:";
var msgReason = reasonContainer.append("div");
// some classes
msgReason.style("display", "inline-flex");
msgReason.style("max-width", graphWidth + "px");
msgReason.node().innerHTML = reason;
}
if ( action.length > 0 ) {
var actionContainer = warningContainer.append("div");
actionContainer.style("padding", "5px");
var actionHeader = actionContainer.append("div");
// some classes
actionHeader.style("display", "inline-flex");
actionHeader.style("padding-right", "8px");
actionHeader.node().innerHTML = "Action:";
var msgAction = actionContainer.append("div");
// some classes
msgAction.style("display", "inline-flex");
msgAction.style("max-width", graphWidth + "px");
msgAction.node().innerHTML = action;
}
var gotItButton;
if ( type === 1 ) {
gotItButton = warningContainer.append("label");
gotItButton.node().id = "killWarningErrorMessages_" + id;
gotItButton.node().innerHTML = "Got It";
gotItButton.on("click", warningModule.closeMessage);
}
if ( type === 2 ) {
gotItButton = warningContainer.append("label");
gotItButton.node().id = "killWarningErrorMessages_" + id;
gotItButton.node().innerHTML = "Got It";
gotItButton.on("click", warningModule.closeMessage);
warningContainer.append("span").node().innerHTML = "|";
var zoomToElementButton = warningContainer.append("label");
zoomToElementButton.node().id = "zoomElementThing_" + id;
zoomToElementButton.node().innerHTML = "Zoom to element ";
zoomToElementButton.on("click", function (){
// assume the additional Element is for halo;
graph.zoomToElementInGraph(additionalOpts);
});
warningContainer.append("span").node().innerHTML = "|";
var ShowElementButton = warningContainer.append("label");
ShowElementButton.node().id = "showElementThing_" + id;
ShowElementButton.node().innerHTML = "Indicate element";
ShowElementButton.on("click", function (){
// assume the additional Element is for halo;
if ( additionalOpts.halo() === false ) {
additionalOpts.drawHalo();
graph.updatePulseIds([additionalOpts.id()]);
} else {
additionalOpts.removeHalo();
additionalOpts.drawHalo();
graph.updatePulseIds([additionalOpts.id()]);
}
});
}
moduleContainer.classed("hidden", false);
moduleContainer.style("-webkit-animation-name", "warn_ExpandAnimation");
moduleContainer.style("-webkit-animation-duration", "0.5s");
moduleContainer.classed("hidden", false);
};
return warningModule;
};