mirror of
https://github.com/Icinga/icingaweb2.git
synced 2025-07-29 08:44:10 +02:00
Add stub for javascript behaviors
This commit is contained in:
parent
ea63dad087
commit
d99d50b3c4
@ -22,6 +22,7 @@ class JavaScript
|
|||||||
'js/icinga/history.js',
|
'js/icinga/history.js',
|
||||||
'js/icinga/module.js',
|
'js/icinga/module.js',
|
||||||
'js/icinga/timezone.js',
|
'js/icinga/timezone.js',
|
||||||
|
'js/icinga/behavior/tooltip.js'
|
||||||
);
|
);
|
||||||
|
|
||||||
protected static $vendorFiles = array(
|
protected static $vendorFiles = array(
|
||||||
|
@ -60,6 +60,11 @@
|
|||||||
*/
|
*/
|
||||||
this.utils = null;
|
this.utils = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Additional site behavior
|
||||||
|
*/
|
||||||
|
this.behaviors = {};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loaded modules
|
* Loaded modules
|
||||||
*/
|
*/
|
||||||
@ -90,6 +95,10 @@
|
|||||||
this.loader = new Icinga.Loader(this);
|
this.loader = new Icinga.Loader(this);
|
||||||
this.events = new Icinga.Events(this);
|
this.events = new Icinga.Events(this);
|
||||||
this.history = new Icinga.History(this);
|
this.history = new Icinga.History(this);
|
||||||
|
var self = this;
|
||||||
|
$.each(Icinga.Behaviors, function(name, Behavior) {
|
||||||
|
self.behaviors[name.toLowerCase()] = new Behavior();
|
||||||
|
});
|
||||||
|
|
||||||
this.timezone.initialize();
|
this.timezone.initialize();
|
||||||
this.timer.initialize();
|
this.timer.initialize();
|
||||||
@ -97,6 +106,7 @@
|
|||||||
this.history.initialize();
|
this.history.initialize();
|
||||||
this.ui.initialize();
|
this.ui.initialize();
|
||||||
this.loader.initialize();
|
this.loader.initialize();
|
||||||
|
|
||||||
this.logger.info('Icinga is ready, running on jQuery ', $().jquery);
|
this.logger.info('Icinga is ready, running on jQuery ', $().jquery);
|
||||||
this.initialized = true;
|
this.initialized = true;
|
||||||
},
|
},
|
||||||
|
70
public/js/icinga/behavior.js
Normal file
70
public/js/icinga/behavior.js
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
// {{{ICINGA_LICENSE_HEADER}}}
|
||||||
|
// {{{ICINGA_LICENSE_HEADER}}}
|
||||||
|
|
||||||
|
(function(Icinga) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to define a set of functionality that can be applied
|
||||||
|
* on a subtree of the site's DOM
|
||||||
|
*
|
||||||
|
* Behaviors
|
||||||
|
*
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
|
Icinga.Behavior = function () {
|
||||||
|
this.handler = {
|
||||||
|
apply: [],
|
||||||
|
bind: [],
|
||||||
|
unbind: []
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
Icinga.Behavior.prototype.on = function(evt, fn) {
|
||||||
|
this.handler[evt].push(fn);
|
||||||
|
};
|
||||||
|
|
||||||
|
Icinga.Behavior.prototype.off = function(evt, fn) {
|
||||||
|
this.handler[evt].remove(fn);
|
||||||
|
};
|
||||||
|
|
||||||
|
Icinga.Behavior.prototype.trigger = function(evt, el) {
|
||||||
|
var handler = this.handler[evt];
|
||||||
|
for (var i = 0; i < handler.length; i++) {
|
||||||
|
if (typeof handler[i] === 'function') {
|
||||||
|
handler[i](el);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Icinga.Behavior.prototype.onApply = function(fn) {
|
||||||
|
this.on('apply', fn);
|
||||||
|
};
|
||||||
|
|
||||||
|
Icinga.Behavior.prototype.onBind = function(fn) {
|
||||||
|
this.on('bind', fn);
|
||||||
|
};
|
||||||
|
|
||||||
|
Icinga.Behavior.prototype.onUnbind = function(fn) {
|
||||||
|
this.on('unbind', fn);
|
||||||
|
};
|
||||||
|
|
||||||
|
Icinga.Behavior.prototype.apply = function(el) {
|
||||||
|
this.trigger ('apply', el);
|
||||||
|
};
|
||||||
|
|
||||||
|
Icinga.Behavior.prototype.bind = function(el) {
|
||||||
|
this.trigger ('bind', el);
|
||||||
|
};
|
||||||
|
|
||||||
|
Icinga.Behavior.prototype.unbind = function(el) {
|
||||||
|
this.trigger ('apply', el);
|
||||||
|
};
|
||||||
|
|
||||||
|
Icinga.Behavior.prototype.off = function() {
|
||||||
|
this.handler = {
|
||||||
|
apply: [],
|
||||||
|
bind: [],
|
||||||
|
unbind: []
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}) (Icinga);
|
66
public/js/icinga/behavior/tooltip.js
Normal file
66
public/js/icinga/behavior/tooltip.js
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
// {{{ICINGA_LICENSE_HEADER}}}
|
||||||
|
// {{{ICINGA_LICENSE_HEADER}}}
|
||||||
|
|
||||||
|
(function(Icinga, $) {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
Icinga.Behaviors = Icinga.Behaviors || {};
|
||||||
|
|
||||||
|
var Tooltip = function () {
|
||||||
|
this.mouseX = 0;
|
||||||
|
this.mouseY = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
Tooltip.prototype.apply = function(el) {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
$('[title]').each(function () {
|
||||||
|
var $el = $(this);
|
||||||
|
$el.attr('title', $el.data('title-rich') || $el.attr('title'));
|
||||||
|
});
|
||||||
|
$('svg rect.chart-data[title]', el).tipsy({ gravity: 'se', html: true });
|
||||||
|
$('.historycolorgrid a[title]', el).tipsy({ gravity: 's', offset: 2 });
|
||||||
|
$('img.icon[title]', el).tipsy({ gravity: $.fn.tipsy.autoNS, offset: 2 });
|
||||||
|
$('[title]', el).tipsy({ gravity: $.fn.tipsy.autoNS, delayIn: 500 });
|
||||||
|
|
||||||
|
// migrate or remove all orphaned tooltips
|
||||||
|
$('.tipsy').each(function () {
|
||||||
|
var arrow = $('.tipsy-arrow', this)[0];
|
||||||
|
if (!Icinga.utils.elementsOverlap(arrow, $('#main')[0])) {
|
||||||
|
$(this).remove();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!Icinga.utils.elementsOverlap(arrow, el)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var title = $(this).find('.tipsy-inner').html();
|
||||||
|
var atMouse = document.elementFromPoint(self.mouseX, self.mouseY);
|
||||||
|
var nearestTip = $(atMouse).closest('[original-title="' + title + '"]')[0];
|
||||||
|
if (nearestTip) {
|
||||||
|
var tipsy = $.data(nearestTip, 'tipsy');
|
||||||
|
tipsy.$tip = $(this);
|
||||||
|
$.data(this, 'tipsy-pointee', nearestTip);
|
||||||
|
} else {
|
||||||
|
// doesn't match delete
|
||||||
|
$(this).remove();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
Tooltip.prototype.bind = function() {
|
||||||
|
var self = this;
|
||||||
|
$(document).on('mousemove', function (event) {
|
||||||
|
self.mouseX = event.pageX;
|
||||||
|
self.mouseY = event.pageY;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
Tooltip.prototype.unbind = function() {
|
||||||
|
$(document).off('mousemove');
|
||||||
|
};
|
||||||
|
|
||||||
|
// Export
|
||||||
|
Icinga.Behaviors.Tooltip = Tooltip;
|
||||||
|
|
||||||
|
}) (Icinga, jQuery);
|
@ -12,8 +12,6 @@
|
|||||||
|
|
||||||
var activeMenuId;
|
var activeMenuId;
|
||||||
|
|
||||||
var mouseX, mouseY;
|
|
||||||
|
|
||||||
Icinga.Events = function (icinga) {
|
Icinga.Events = function (icinga) {
|
||||||
this.icinga = icinga;
|
this.icinga = icinga;
|
||||||
|
|
||||||
@ -34,7 +32,22 @@
|
|||||||
initialize: function () {
|
initialize: function () {
|
||||||
this.applyGlobalDefaults();
|
this.applyGlobalDefaults();
|
||||||
this.applyHandlers($('#layout'));
|
this.applyHandlers($('#layout'));
|
||||||
this.icinga.ui.prepareContainers();
|
var self = this;
|
||||||
|
|
||||||
|
// define global site behavior
|
||||||
|
$.each(self.icinga.behaviors, function (name, behavior) {
|
||||||
|
behavior.bind();
|
||||||
|
});
|
||||||
|
|
||||||
|
// prepare container html
|
||||||
|
$('.container').each(function(idx, el) {
|
||||||
|
// apply event handlers
|
||||||
|
icinga.events.applyHandlers($(el));
|
||||||
|
icinga.ui.initializeControls($(el));
|
||||||
|
$.each(self.icinga.behaviors, function (name, behavior) {
|
||||||
|
behavior.apply(el);
|
||||||
|
});
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
// TODO: What's this?
|
// TODO: What's this?
|
||||||
@ -116,39 +129,6 @@
|
|||||||
this.searchValue = searchField.val();
|
this.searchValue = searchField.val();
|
||||||
}
|
}
|
||||||
|
|
||||||
$('[title]').each(function () {
|
|
||||||
var $el = $(this);
|
|
||||||
$el.attr('title', $el.data('title-rich') || $el.attr('title'));
|
|
||||||
});
|
|
||||||
$('svg rect.chart-data[title]', el).tipsy({ gravity: 'se', html: true });
|
|
||||||
$('.historycolorgrid a[title]', el).tipsy({ gravity: 's', offset: 2 });
|
|
||||||
$('img.icon[title]', el).tipsy({ gravity: $.fn.tipsy.autoNS, offset: 2 });
|
|
||||||
$('[title]', el).tipsy({ gravity: $.fn.tipsy.autoNS, delayIn: 500 });
|
|
||||||
|
|
||||||
// migrate or remove all orphaned tooltips
|
|
||||||
$('.tipsy').each(function () {
|
|
||||||
var arrow = $('.tipsy-arrow', this)[0];
|
|
||||||
if (!icinga.utils.elementsOverlap(arrow, $('#main')[0])) {
|
|
||||||
$(this).remove();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!icinga.utils.elementsOverlap(arrow, el)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var title = $(this).find('.tipsy-inner').html();
|
|
||||||
var atMouse = document.elementFromPoint(mouseX, mouseY);
|
|
||||||
var nearestTip = $(atMouse)
|
|
||||||
.closest('[original-title="' + title + '"]')[0];
|
|
||||||
if (nearestTip) {
|
|
||||||
var tipsy = $.data(nearestTip, 'tipsy');
|
|
||||||
tipsy.$tip = $(this);
|
|
||||||
$.data(this, 'tipsy-pointee', nearestTip);
|
|
||||||
} else {
|
|
||||||
// doesn't match delete
|
|
||||||
$(this).remove();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// restore menu state
|
// restore menu state
|
||||||
if (activeMenuId) {
|
if (activeMenuId) {
|
||||||
$('[role="navigation"] li.active', el).removeClass('active');
|
$('[role="navigation"] li.active', el).removeClass('active');
|
||||||
@ -220,10 +200,6 @@
|
|||||||
// $(document).on('change', 'form.auto input', this.formChanged);
|
// $(document).on('change', 'form.auto input', this.formChanged);
|
||||||
// $(document).on('change', 'form.auto select', this.submitForm);
|
// $(document).on('change', 'form.auto select', this.submitForm);
|
||||||
|
|
||||||
$(document).on('mousemove', function (event) {
|
|
||||||
mouseX = event.pageX;
|
|
||||||
mouseY = event.pageY;
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
menuTitleHovered: function (event) {
|
menuTitleHovered: function (event) {
|
||||||
@ -713,7 +689,6 @@
|
|||||||
$(document).off('mouseenter', 'li.dropdown', this.dropdownHover);
|
$(document).off('mouseenter', 'li.dropdown', this.dropdownHover);
|
||||||
$(document).off('mouseleave', 'li.dropdown', this.dropdownLeave);
|
$(document).off('mouseleave', 'li.dropdown', this.dropdownLeave);
|
||||||
$(document).off('click', 'div.tristate .tristate-dummy', this.clickTriState);
|
$(document).off('click', 'div.tristate .tristate-dummy', this.clickTriState);
|
||||||
$(document).off('mousemove');
|
|
||||||
},
|
},
|
||||||
|
|
||||||
destroy: function() {
|
destroy: function() {
|
||||||
|
@ -282,20 +282,6 @@
|
|||||||
return $('#main > .container').length;
|
return $('#main > .container').length;
|
||||||
},
|
},
|
||||||
|
|
||||||
prepareContainers: function () {
|
|
||||||
var icinga = this.icinga;
|
|
||||||
$('.container').each(function(idx, el) {
|
|
||||||
icinga.events.applyHandlers($(el));
|
|
||||||
icinga.ui.initializeControls($(el));
|
|
||||||
});
|
|
||||||
/*
|
|
||||||
$('#icinga-main').attr(
|
|
||||||
'icingaurl',
|
|
||||||
window.location.pathname + window.location.search
|
|
||||||
);
|
|
||||||
*/
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add the given table-row to the selection of the closest
|
* Add the given table-row to the selection of the closest
|
||||||
* table and deselect all other rows of the closest table.
|
* table and deselect all other rows of the closest table.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user