280 lines
7.4 KiB
JavaScript
280 lines
7.4 KiB
JavaScript
/*! Icinga Web 2 | (c) 2014 Icinga Development Team | GPLv2+ */
|
|
|
|
/**
|
|
* Icinga starts here.
|
|
*
|
|
* Usage example:
|
|
*
|
|
* <code>
|
|
* var icinga = new Icinga({
|
|
* baseUrl: '/icinga',
|
|
* });
|
|
* </code>
|
|
*/
|
|
(function(window, $) {
|
|
|
|
'use strict';
|
|
|
|
var Icinga = function (config) {
|
|
|
|
this.initialized = false;
|
|
|
|
/**
|
|
* Our config object
|
|
*/
|
|
this.config = config;
|
|
|
|
/**
|
|
* Icinga.Logger
|
|
*/
|
|
this.logger = null;
|
|
|
|
/**
|
|
* Icinga.UI
|
|
*/
|
|
this.ui = null;
|
|
|
|
/**
|
|
* Icinga.Loader
|
|
*/
|
|
this.loader = null;
|
|
|
|
/**
|
|
* Icinga.Events
|
|
*/
|
|
this.events = null;
|
|
|
|
/**
|
|
* Icinga.Timer
|
|
*/
|
|
this.timer = null;
|
|
|
|
/**
|
|
* Icinga.History
|
|
*/
|
|
this.history = null;
|
|
|
|
/**
|
|
* Icinga.Utils
|
|
*/
|
|
this.utils = null;
|
|
|
|
/**
|
|
* Additional site behavior
|
|
*/
|
|
this.behaviors = {};
|
|
|
|
/**
|
|
* Loaded modules
|
|
*/
|
|
this.modules = {};
|
|
|
|
var _this = this;
|
|
$(document).ready(function () {
|
|
_this.initialize();
|
|
_this = null;
|
|
});
|
|
};
|
|
|
|
Icinga.prototype = {
|
|
|
|
/**
|
|
* Icinga startup, will be triggerd once the document is ready
|
|
*/
|
|
initialize: function () {
|
|
if (this.initialized) {
|
|
return false;
|
|
}
|
|
|
|
this.timezone = new Icinga.Timezone();
|
|
this.utils = new Icinga.Utils(this);
|
|
this.logger = new Icinga.Logger(this);
|
|
this.timer = new Icinga.Timer(this);
|
|
this.ui = new Icinga.UI(this);
|
|
this.loader = new Icinga.Loader(this);
|
|
this.events = new Icinga.Events(this);
|
|
this.history = new Icinga.History(this);
|
|
var _this = this;
|
|
$.each(Icinga.Behaviors, function(name, Behavior) {
|
|
_this.behaviors[name.toLowerCase()] = new Behavior(_this);
|
|
});
|
|
|
|
this.timezone.initialize();
|
|
this.timer.initialize();
|
|
this.events.initialize();
|
|
this.history.initialize();
|
|
this.ui.initialize();
|
|
this.loader.initialize();
|
|
|
|
this.logger.info('Icinga is ready, running on jQuery ', $().jquery);
|
|
this.initialized = true;
|
|
|
|
// Trigger our own post-init event, `onLoad` is not reliable enough
|
|
$(document).trigger('icinga-init');
|
|
},
|
|
|
|
/**
|
|
* Load a given module by name
|
|
*
|
|
* @param {string} name
|
|
*
|
|
* @return {boolean}
|
|
*/
|
|
loadModule: function (name) {
|
|
|
|
if (this.isLoadedModule(name)) {
|
|
this.logger.error('Cannot load module ' + name + ' twice');
|
|
return false;
|
|
}
|
|
|
|
if (! this.hasModule(name)) {
|
|
this.logger.error('Cannot find module ' + name);
|
|
return false;
|
|
}
|
|
|
|
this.modules[name] = new Icinga.Module(
|
|
this,
|
|
name,
|
|
Icinga.availableModules[name]
|
|
);
|
|
return true;
|
|
},
|
|
|
|
/**
|
|
* Whether a module matching the given name exists or is loaded
|
|
*
|
|
* @param {string} name
|
|
*
|
|
* @return {boolean}
|
|
*/
|
|
hasModule: function (name) {
|
|
return this.isLoadedModule(name) ||
|
|
'undefined' !== typeof Icinga.availableModules[name];
|
|
},
|
|
|
|
/**
|
|
* Return whether the given module is loaded
|
|
*
|
|
* @param {string} name The name of the module
|
|
*
|
|
* @returns {Boolean}
|
|
*/
|
|
isLoadedModule: function (name) {
|
|
return 'undefined' !== typeof this.modules[name];
|
|
},
|
|
|
|
/**
|
|
* Ensure we have loaded the javascript code for a module
|
|
*
|
|
* @param {string} moduleName
|
|
*/
|
|
ensureModule: function(moduleName) {
|
|
if (this.hasModule(moduleName) && ! this.isLoadedModule(moduleName)) {
|
|
this.loadModule(moduleName);
|
|
}
|
|
},
|
|
|
|
/**
|
|
* If a container contains sub-containers for other modules,
|
|
* make sure the javascript code for each module is loaded.
|
|
*
|
|
* Containers are identified by "data-icinga-module" which
|
|
* holds the module name.
|
|
*
|
|
* @param container
|
|
*/
|
|
ensureSubModules: function (container) {
|
|
var icinga = this;
|
|
|
|
$(container).find('[data-icinga-module]').each(function () {
|
|
var moduleName = $(this).data('icingaModule');
|
|
if (moduleName) {
|
|
icinga.ensureModule(moduleName);
|
|
}
|
|
});
|
|
},
|
|
|
|
/**
|
|
* Get a module by name
|
|
*
|
|
* @param {string} name
|
|
*
|
|
* @return {object}
|
|
*/
|
|
module: function (name) {
|
|
|
|
if (this.hasModule(name) && !this.isLoadedModule(name)) {
|
|
this.modules[name] = new Icinga.Module(
|
|
this,
|
|
name,
|
|
Icinga.availableModules[name]
|
|
);
|
|
}
|
|
|
|
return this.modules[name];
|
|
},
|
|
|
|
/**
|
|
* Clean up and unload all Icinga components
|
|
*/
|
|
destroy: function () {
|
|
|
|
$.each(this.modules, function (name, module) {
|
|
module.destroy();
|
|
});
|
|
|
|
this.timezone.destroy();
|
|
this.timer.destroy();
|
|
this.events.destroy();
|
|
this.loader.destroy();
|
|
this.ui.destroy();
|
|
this.logger.debug('Icinga has been destroyed');
|
|
this.logger.destroy();
|
|
this.utils.destroy();
|
|
|
|
this.modules = [];
|
|
this.timer = this.events = this.loader = this.ui = this.logger =
|
|
this.utils = null;
|
|
this.initialized = false;
|
|
},
|
|
|
|
reload: function () {
|
|
setTimeout(function () {
|
|
var oldjQuery = window.jQuery;
|
|
var oldConfig = window.icinga.config;
|
|
var oldIcinga = window.Icinga;
|
|
window.icinga.destroy();
|
|
window.Icinga = undefined;
|
|
window.$ = undefined;
|
|
window.jQuery = undefined;
|
|
jQuery = undefined;
|
|
$ = undefined;
|
|
|
|
oldjQuery.getScript(
|
|
oldConfig.baseUrl.replace(/\/$/, '') + '/js/icinga.min.js'
|
|
).done(function () {
|
|
var jQuery = window.jQuery;
|
|
window.icinga = new window.Icinga(oldConfig);
|
|
window.icinga.initialize();
|
|
window.icinga.ui.reloadCss();
|
|
oldjQuery = undefined;
|
|
oldConfig = undefined;
|
|
oldIcinga = undefined;
|
|
}).fail(function () {
|
|
window.jQuery = oldjQuery;
|
|
window.$ = window.jQuery;
|
|
window.Icinga = oldIcinga;
|
|
window.icinga = new Icinga(oldConfig);
|
|
window.icinga.ui.reloadCss();
|
|
});
|
|
}, 0);
|
|
}
|
|
|
|
};
|
|
|
|
window.Icinga = Icinga;
|
|
|
|
Icinga.availableModules = {};
|
|
|
|
})(window, jQuery);
|