2014-10-20 10:26:06 -04:00
|
|
|
|
|
|
|
|
(function(Icinga) {
|
|
|
|
|
|
|
|
|
|
var Bp = function(module) {
|
|
|
|
|
/**
|
|
|
|
|
* YES, we need Icinga
|
|
|
|
|
*/
|
|
|
|
|
this.module = module;
|
|
|
|
|
|
2014-11-30 04:40:37 -05:00
|
|
|
this.idCache = {};
|
|
|
|
|
|
2014-10-20 10:26:06 -04:00
|
|
|
this.initialize();
|
|
|
|
|
|
|
|
|
|
this.module.icinga.logger.debug('BP module loaded');
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Bp.prototype = {
|
|
|
|
|
|
|
|
|
|
initialize: function()
|
|
|
|
|
{
|
|
|
|
|
/**
|
|
|
|
|
* Tell Icinga about our event handlers
|
|
|
|
|
*/
|
2014-11-30 04:43:09 -05:00
|
|
|
this.module.on('beforerender', this.rememberOpenedBps);
|
2016-11-28 18:50:20 -05:00
|
|
|
this.module.on('rendered', this.onRendered);
|
2014-11-30 04:43:09 -05:00
|
|
|
|
2015-03-03 07:55:33 -05:00
|
|
|
this.module.on('click', 'table.bp.process > tbody > tr:first-child > td > a:last-child', this.processTitleClick);
|
2014-11-30 04:45:59 -05:00
|
|
|
this.module.on('click', 'table.bp > tbody > tr:first-child > th', this.processOperatorClick);
|
2016-12-08 04:16:56 -05:00
|
|
|
this.module.on('focus', 'form input, form textarea, form select', this.formElementFocus);
|
2014-10-20 10:26:06 -04:00
|
|
|
|
2014-11-30 04:45:05 -05:00
|
|
|
this.module.on('mouseenter', 'table.bp > tbody > tr > td > a', this.procMouseOver);
|
|
|
|
|
this.module.on('mouseenter', 'table.bp > tbody > tr > th', this.procMouseOver);
|
2015-03-16 04:08:00 -04:00
|
|
|
this.module.on('mouseenter', 'table.node.missing > tbody > tr > td > span', this.procMouseOver);
|
2014-11-30 04:45:05 -05:00
|
|
|
this.module.on('mouseleave', 'div.bp', this.procMouseOut);
|
|
|
|
|
|
2016-12-08 04:16:56 -05:00
|
|
|
this.module.icinga.logger.debug('BP module initialized');
|
2014-10-20 10:26:06 -04:00
|
|
|
},
|
|
|
|
|
|
2016-11-28 18:50:20 -05:00
|
|
|
onRendered: function (event) {
|
|
|
|
|
var $container = $(event.currentTarget);
|
|
|
|
|
this.fixFullscreen($container);
|
|
|
|
|
this.fixOpenedBps($container);
|
2016-12-08 04:16:56 -05:00
|
|
|
this.highlightFormErrors($container);
|
|
|
|
|
this.hideInactiveFormDescriptions($container);
|
2016-11-28 18:50:20 -05:00
|
|
|
},
|
|
|
|
|
|
2014-11-30 04:45:59 -05:00
|
|
|
processTitleClick: function (event) {
|
|
|
|
|
event.stopPropagation();
|
|
|
|
|
var $el = $(event.currentTarget).closest('table.bp');
|
|
|
|
|
$el.toggleClass('collapsed');
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
processOperatorClick: function (event) {
|
|
|
|
|
event.stopPropagation();
|
|
|
|
|
var $el = $(event.currentTarget).closest('table.bp');
|
|
|
|
|
|
|
|
|
|
// Click on arrow
|
|
|
|
|
$el.removeClass('collapsed');
|
|
|
|
|
|
|
|
|
|
var children = $el.find('> tbody > tr > td > table.bp.process');
|
|
|
|
|
if (children.length === 0) {
|
|
|
|
|
$el.toggleClass('collapsed');
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (children.filter('.collapsed').length) {
|
|
|
|
|
children.removeClass('collapsed');
|
|
|
|
|
} else {
|
|
|
|
|
children.each(function(idx, el) {
|
|
|
|
|
var $el = $(el);
|
|
|
|
|
$el.addClass('collapsed');
|
|
|
|
|
$el.find('table.bp.process').addClass('collapsed');
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
2016-12-08 04:16:56 -05:00
|
|
|
hideInactiveFormDescriptions: function($container) {
|
|
|
|
|
$container.find('dd').not('.active').find('p.description').hide();
|
|
|
|
|
},
|
|
|
|
|
|
2014-10-20 10:26:06 -04:00
|
|
|
/**
|
|
|
|
|
* Add 'hovered' class to hovered title elements
|
|
|
|
|
*
|
|
|
|
|
* TODO: Skip on tablets
|
|
|
|
|
*/
|
2014-11-30 04:45:05 -05:00
|
|
|
procMouseOver: function (event) {
|
2014-10-20 10:26:06 -04:00
|
|
|
event.stopPropagation();
|
2014-11-30 04:45:05 -05:00
|
|
|
var $hovered = $(event.currentTarget);
|
|
|
|
|
var $el = $hovered.closest('table.bp');
|
|
|
|
|
|
|
|
|
|
if ($el.is('.operator')) {
|
|
|
|
|
if (!$hovered.closest('tr').is('tr:first-child')) {
|
|
|
|
|
// Skip hovered space between cols
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$('table.bp.hovered').not($el.parents('table.bp')).removeClass('hovered'); // not self & parents
|
|
|
|
|
$el.addClass('hovered');
|
|
|
|
|
$el.parents('table.bp').addClass('hovered');
|
2014-10-20 10:26:06 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Remove 'hovered' class from hovered title elements
|
|
|
|
|
*
|
|
|
|
|
* TODO: Skip on tablets
|
|
|
|
|
*/
|
2014-11-30 04:45:05 -05:00
|
|
|
procMouseOut: function (event) {
|
|
|
|
|
$('table.bp.hovered').removeClass('hovered');
|
2014-10-20 10:26:06 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Handle clicks on operator or title element
|
|
|
|
|
*
|
|
|
|
|
* Title shows subelement, operator unfolds all subelements
|
|
|
|
|
*/
|
|
|
|
|
titleClicked: function (event) {
|
|
|
|
|
var self = this;
|
|
|
|
|
event.stopPropagation();
|
|
|
|
|
event.preventDefault();
|
|
|
|
|
var $el = $(event.currentTarget),
|
|
|
|
|
affected = []
|
|
|
|
|
$container = $el.closest('.container');
|
|
|
|
|
if ($el.hasClass('operator')) {
|
|
|
|
|
$affected = $el.closest('table').children('tbody')
|
|
|
|
|
.children('tr.children').children('td').children('table');
|
|
|
|
|
|
|
|
|
|
// Only if there are child BPs
|
|
|
|
|
if ($affected.find('th.operator').length < 1) {
|
|
|
|
|
$affected = $el.closest('table');
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
$affected = $el.closest('table');
|
|
|
|
|
}
|
|
|
|
|
$affected.each(function (key, el) {
|
|
|
|
|
var $bptable = $(el).closest('table');
|
|
|
|
|
$bptable.toggleClass('collapsed');
|
|
|
|
|
if ($bptable.hasClass('collapsed')) {
|
|
|
|
|
$bptable.find('table').addClass('collapsed');
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2014-11-30 04:41:11 -05:00
|
|
|
/*$container.data('refreshParams', {
|
2014-10-20 10:26:06 -04:00
|
|
|
opened: self.listOpenedBps($container)
|
2014-11-30 04:41:11 -05:00
|
|
|
});*/
|
2014-10-20 10:26:06 -04:00
|
|
|
},
|
|
|
|
|
|
2016-11-28 18:50:20 -05:00
|
|
|
fixFullscreen: function($container) {
|
|
|
|
|
var $controls = $container.find('div.controls');
|
|
|
|
|
var $layout = $('#layout');
|
|
|
|
|
var icinga = this.module.icinga;
|
|
|
|
|
if ($controls.hasClass('want-fullscreen')) {
|
|
|
|
|
if (!$layout.hasClass('fullscreen-layout')) {
|
|
|
|
|
|
|
|
|
|
$layout.addClass('fullscreen-layout');
|
|
|
|
|
$controls.removeAttr('style');
|
|
|
|
|
$container.find('.fake-controls').remove();
|
|
|
|
|
icinga.ui.currentLayout = 'fullscreen';
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if ($layout.hasClass('fullscreen-layout')) {
|
|
|
|
|
$layout.removeClass('fullscreen-layout');
|
|
|
|
|
icinga.ui.layoutHasBeenChanged();
|
|
|
|
|
icinga.ui.initializeControls($container);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
fixOpenedBps: function($container) {
|
|
|
|
|
var $bpDiv = $container.find('div.bp');
|
2016-11-24 03:39:44 -05:00
|
|
|
var bpName = $bpDiv.attr('id');
|
2014-11-30 04:40:37 -05:00
|
|
|
|
2016-11-24 03:39:44 -05:00
|
|
|
if (typeof this.idCache[bpName] === 'undefined') {
|
2014-10-20 10:26:06 -04:00
|
|
|
return;
|
|
|
|
|
}
|
2016-11-24 03:39:44 -05:00
|
|
|
var $procs = $bpDiv.find('table.process');
|
|
|
|
|
|
|
|
|
|
$.each(this.idCache[bpName], function(idx, id) {
|
2014-11-30 04:40:37 -05:00
|
|
|
var $el = $('#' + id);
|
|
|
|
|
$procs = $procs.not($el);
|
|
|
|
|
|
|
|
|
|
$el.parents('table.process').each(function (idx, el) {
|
|
|
|
|
$procs = $procs.not($(el));
|
2014-10-20 10:26:06 -04:00
|
|
|
});
|
|
|
|
|
});
|
2014-11-30 04:40:37 -05:00
|
|
|
|
|
|
|
|
$procs.addClass('collapsed');
|
2014-10-20 10:26:06 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Get a list of all currently opened BPs.
|
|
|
|
|
*
|
|
|
|
|
* Only get the deepest nodes to keep requests as small as possible
|
|
|
|
|
*/
|
2014-11-30 04:43:09 -05:00
|
|
|
rememberOpenedBps: function (event) {
|
2014-10-20 10:26:06 -04:00
|
|
|
var ids = [];
|
2016-11-24 03:39:44 -05:00
|
|
|
var $bpDiv = $(event.currentTarget).find('div.bp');
|
|
|
|
|
var $bpName = $bpDiv.attr('id');
|
|
|
|
|
|
|
|
|
|
$bpDiv.find('table.process')
|
2014-11-30 04:43:09 -05:00
|
|
|
.not('table.process.collapsed')
|
|
|
|
|
.not('table.process.collapsed table.process')
|
|
|
|
|
.each(function (key, el) {
|
|
|
|
|
ids.push($(el).attr('id'));
|
2014-10-20 10:26:06 -04:00
|
|
|
});
|
2014-11-30 04:43:09 -05:00
|
|
|
if (ids.length === 0) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2014-10-20 10:26:06 -04:00
|
|
|
|
2016-11-24 03:39:44 -05:00
|
|
|
this.idCache[$bpName] = ids;
|
2016-12-08 04:16:56 -05:00
|
|
|
},
|
|
|
|
|
|
|
|
|
|
/** BEGIN Form handling, borrowed from Director **/
|
|
|
|
|
formElementFocus: function(ev)
|
|
|
|
|
{
|
|
|
|
|
var $input = $(ev.currentTarget);
|
|
|
|
|
var $dd = $input.closest('dd');
|
|
|
|
|
$dd.find('p.description').show();
|
|
|
|
|
if ($dd.attr('id') && $dd.attr('id').match(/button/)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var $li = $input.closest('li');
|
|
|
|
|
var $dt = $dd.prev();
|
|
|
|
|
var $form = $dd.closest('form');
|
|
|
|
|
|
|
|
|
|
$form.find('dt, dd, li').removeClass('active');
|
|
|
|
|
$li.addClass('active');
|
|
|
|
|
$dt.addClass('active');
|
|
|
|
|
$dd.addClass('active');
|
|
|
|
|
$dd.find('p.description.fading-out')
|
|
|
|
|
.stop(true)
|
|
|
|
|
.removeClass('fading-out')
|
|
|
|
|
.fadeIn('fast');
|
|
|
|
|
|
|
|
|
|
$form.find('dd').not($dd)
|
|
|
|
|
.find('p.description')
|
|
|
|
|
.not('.fading-out')
|
|
|
|
|
.addClass('fading-out')
|
|
|
|
|
.delay(2000)
|
|
|
|
|
.fadeOut('slow', function() {
|
|
|
|
|
$(this).removeClass('fading-out').hide()
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
highlightFormErrors: function($container)
|
|
|
|
|
{
|
|
|
|
|
$container.find('dd ul.errors').each(function(idx, ul) {
|
|
|
|
|
var $ul = $(ul);
|
|
|
|
|
var $dd = $ul.closest('dd');
|
|
|
|
|
var $dt = $dd.prev();
|
|
|
|
|
|
|
|
|
|
$dt.addClass('errors');
|
|
|
|
|
$dd.addClass('errors');
|
|
|
|
|
});
|
2014-10-20 10:26:06 -04:00
|
|
|
}
|
2016-12-08 04:16:56 -05:00
|
|
|
/** END Form handling **/
|
2014-10-20 10:26:06 -04:00
|
|
|
};
|
|
|
|
|
|
2014-11-30 09:56:58 -05:00
|
|
|
Icinga.availableModules.businessprocess = Bp;
|
2014-10-20 10:26:06 -04:00
|
|
|
|
|
|
|
|
}(Icinga));
|
|
|
|
|
|