mirror of
https://github.com/Icinga/icingaweb2.git
synced 2025-07-28 16:24:04 +02:00
Remove old module loader
Remove old (now-unusable) module loader and components and corresponding unit tests. Give the component loader and the component registry more meaningful names. refs #4456
This commit is contained in:
parent
52c66893ab
commit
5e663846a5
@ -4,13 +4,13 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A module to load, manage and query frontend components
|
* A module to load and manage frontend components
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
define(['jquery', 'logging', 'icinga/registry'], function ($, log, registry) {
|
define(['jquery', 'logging', 'icinga/componentRegistry'], function ($, log, registry) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var Manager = function() {
|
var ComponentLoader = function() {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load the component with the given type and attach it to the target
|
* Load the component with the given type and attach it to the target
|
||||||
@ -50,7 +50,7 @@ define(['jquery', 'logging', 'icinga/registry'], function ($, log, registry) {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Load all new components and remove components that were removed from
|
* Load all new components and remove components that were removed from
|
||||||
* the DOM
|
* the DOM from the internal registry
|
||||||
*
|
*
|
||||||
* @param {function} fin Called when the loading is completed
|
* @param {function} fin Called when the loading is completed
|
||||||
*/
|
*/
|
||||||
@ -138,5 +138,5 @@ define(['jquery', 'logging', 'icinga/registry'], function ($, log, registry) {
|
|||||||
return registry.getComponents();
|
return registry.getComponents();
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
return new Manager();
|
return new ComponentLoader();
|
||||||
});
|
});
|
@ -11,7 +11,7 @@
|
|||||||
define(['jquery'], function($) {
|
define(['jquery'], function($) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var Registry = function() {
|
var ComponentRegistry = function() {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -133,5 +133,5 @@ define(['jquery'], function($) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
return new Registry();
|
return new ComponentRegistry();
|
||||||
});
|
});
|
@ -1,118 +0,0 @@
|
|||||||
/*global Icinga:false, document: false, define:false require:false base_url:false console:false */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ActionTable behaviour as described in
|
|
||||||
* https://wiki.icinga.org/display/cranberry/Frontend+Components#FrontendComponents-ActionTable
|
|
||||||
*
|
|
||||||
* @TODO: Row selection
|
|
||||||
*/
|
|
||||||
define(['jquery','logging','icinga/util/async'],function($,log,async) {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
var ActionTableBehaviour = function() {
|
|
||||||
var onTableHeaderClick;
|
|
||||||
|
|
||||||
var TABLE_BASE_MATCHER = '.icinga-container table.action';
|
|
||||||
var linksInActionTable = TABLE_BASE_MATCHER+" tbody tr > a";
|
|
||||||
var actionTableRow = TABLE_BASE_MATCHER+" tbody tr";
|
|
||||||
var headerRow = TABLE_BASE_MATCHER+" > th a";
|
|
||||||
var searchField = ".icinga-container .actiontable.controls input[type=search]";
|
|
||||||
|
|
||||||
|
|
||||||
onTableHeaderClick = function (ev) {
|
|
||||||
var target = ev.currentTarget,
|
|
||||||
href = $(target).attr('href'),
|
|
||||||
destination;
|
|
||||||
if ($(target).parents('.layout-main-detail').length) {
|
|
||||||
if ($(target).parents("#icinga-main").length) {
|
|
||||||
destination = 'icinga-main';
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
destination = 'icinga-detail';
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
destination = 'icinga-main';
|
|
||||||
}
|
|
||||||
async.loadToTarget(destination, href);
|
|
||||||
ev.preventDefault();
|
|
||||||
ev.stopImmediatePropagation();
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
var onLinkTagClick = function(ev) {
|
|
||||||
|
|
||||||
var target = ev.currentTarget,
|
|
||||||
href = $(target).attr('href'),
|
|
||||||
destination;
|
|
||||||
if ($(target).parents('.layout-main-detail').length) {
|
|
||||||
destination = 'icinga-detail';
|
|
||||||
} else {
|
|
||||||
destination = 'icinga-main';
|
|
||||||
}
|
|
||||||
async.loadToTarget(destination,href);
|
|
||||||
ev.preventDefault();
|
|
||||||
ev.stopImmediatePropagation();
|
|
||||||
return false;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
var onTableRowClick = function(ev) {
|
|
||||||
ev.stopImmediatePropagation();
|
|
||||||
|
|
||||||
var target = $(ev.currentTarget),
|
|
||||||
href = target.attr('href'),
|
|
||||||
destination;
|
|
||||||
$('tr.active',target.parent('tbody').first()).removeClass("active");
|
|
||||||
target.addClass('active');
|
|
||||||
|
|
||||||
// When the tr has a href, act like it is a link
|
|
||||||
if(href) {
|
|
||||||
ev.currentTarget = target.first();
|
|
||||||
return onLinkTagClick(ev);
|
|
||||||
}
|
|
||||||
// Try to find a designated row action
|
|
||||||
var links = $("a.row-action",target);
|
|
||||||
if(links.length) {
|
|
||||||
ev.currentTarget = links.first();
|
|
||||||
return onLinkTagClick(ev);
|
|
||||||
}
|
|
||||||
|
|
||||||
// otherwise use the first anchor tag
|
|
||||||
links = $("a",target);
|
|
||||||
if(links.length) {
|
|
||||||
ev.currentTarget = links.first();
|
|
||||||
return onLinkTagClick(ev);
|
|
||||||
}
|
|
||||||
|
|
||||||
log.debug("No target for this table row found");
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
var onSearchInput = function(ev) {
|
|
||||||
ev.stopImmediatePropagation();
|
|
||||||
var txt = $(this).val();
|
|
||||||
};
|
|
||||||
|
|
||||||
this.eventHandler = {};
|
|
||||||
this.eventHandler[linksInActionTable] = {
|
|
||||||
'click' : onLinkTagClick
|
|
||||||
};
|
|
||||||
this.eventHandler[actionTableRow] = {
|
|
||||||
'click' : onTableRowClick
|
|
||||||
};
|
|
||||||
this.eventHandler[headerRow] = {
|
|
||||||
'click' : onTableHeaderClick
|
|
||||||
};
|
|
||||||
this.eventHandler[searchField] = {
|
|
||||||
'keyup' : onSearchInput
|
|
||||||
};
|
|
||||||
|
|
||||||
this.enable = function() {
|
|
||||||
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
return new ActionTableBehaviour();
|
|
||||||
|
|
||||||
});
|
|
@ -1,113 +0,0 @@
|
|||||||
/*global Icinga:false, document: false, define:false require:false base_url:false console:false */
|
|
||||||
(function() {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
var containerMgrInstance = null;
|
|
||||||
var async;
|
|
||||||
|
|
||||||
var ContainerMgr = function($,log,Widgets,SubTable) {
|
|
||||||
|
|
||||||
|
|
||||||
var enhanceDetachLinks = function() {
|
|
||||||
$('a[target=_blank]',this).each(function() {
|
|
||||||
$(this).attr("target","popup");
|
|
||||||
});
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* Loading Async directly via AMD would result in a circular dependency and return null
|
|
||||||
* @param asyncMgr
|
|
||||||
*/
|
|
||||||
this.registerAsyncMgr = function(asyncMgr) {
|
|
||||||
async = asyncMgr;
|
|
||||||
};
|
|
||||||
|
|
||||||
this.updateContainer = function(id,content,req) {
|
|
||||||
var target = id;
|
|
||||||
if (typeof id === "string") {
|
|
||||||
target = this.getContainer(id);
|
|
||||||
}
|
|
||||||
var ctrl = $('.container-controls',target);
|
|
||||||
target.html(content);
|
|
||||||
if(ctrl.length) {
|
|
||||||
this.updateControlTargets(ctrl,req);
|
|
||||||
target.append(ctrl.first());
|
|
||||||
}
|
|
||||||
target.focus();
|
|
||||||
this.initializeContainers(target);
|
|
||||||
};
|
|
||||||
|
|
||||||
this.updateControlTargets = function(ctrl, req) {
|
|
||||||
$('a',ctrl).each(function() {
|
|
||||||
$(this).attr("href",req.url);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
this.initControlBehaviour = function(root) {
|
|
||||||
$('div[container-id] .container-controls',root).each(function() {
|
|
||||||
enhanceDetachLinks.apply(this);
|
|
||||||
});
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
this.initExpandables = function(root) {
|
|
||||||
$('div[container-id] .expandable',root).each(function() {
|
|
||||||
var ctr = this;
|
|
||||||
$('.expand-link',this).on("click",function() {
|
|
||||||
$(ctr).removeClass('collapsed');
|
|
||||||
});
|
|
||||||
$('.collapse-link',this).on("click",function() {
|
|
||||||
$(ctr).addClass('collapsed');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
this.drawImplicitWidgets = function(root) {
|
|
||||||
$('.icinga-widget[type="icinga/subTable"]',root).each(function() {
|
|
||||||
new SubTable(this);
|
|
||||||
});
|
|
||||||
$('div[container-id] .inlinepie',root).each(function() {
|
|
||||||
new Widgets.inlinePie(this,32,32);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
this.loadAsyncContainers = function(root) {
|
|
||||||
$('.icinga-container[icingaurl]',root).each(function() {
|
|
||||||
var el = $(this);
|
|
||||||
var url = el.attr('icingaurl');
|
|
||||||
el.attr('loaded',true);
|
|
||||||
async.loadToTarget(el,url);
|
|
||||||
});
|
|
||||||
log.debug("Loading async");
|
|
||||||
};
|
|
||||||
|
|
||||||
this.initializeContainers = function(root) {
|
|
||||||
this.initControlBehaviour(root);
|
|
||||||
this.initExpandables(root);
|
|
||||||
this.drawImplicitWidgets(root);
|
|
||||||
this.loadAsyncContainers(root);
|
|
||||||
};
|
|
||||||
|
|
||||||
this.createPopupContainer = function(content,req) {
|
|
||||||
var closeButton = $('<button type="button" class="close" data-dismiss="modal" >×</button>');
|
|
||||||
var container = $('<div>').addClass('modal').attr('container-id','popup-'+req.url).attr("role","dialog")
|
|
||||||
.append($("<div>").addClass('modal-header').text('Header').append(closeButton))
|
|
||||||
.append($("<div>").addClass('modal-body').html(content)).appendTo(document.body);
|
|
||||||
|
|
||||||
closeButton.on("click",function() {container.remove();});
|
|
||||||
};
|
|
||||||
|
|
||||||
this.getContainer = function(id) {
|
|
||||||
if(id == 'body') {
|
|
||||||
return $(document.body);
|
|
||||||
}
|
|
||||||
return $('div[container-id='+id+']');
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
define(['jquery','logging','icinga/widgets/checkIcons','icinga/widgets/subTable'], function($,log,widgets,subTable) {
|
|
||||||
if (containerMgrInstance === null) {
|
|
||||||
containerMgrInstance = new ContainerMgr($,log,widgets,subTable);
|
|
||||||
}
|
|
||||||
return containerMgrInstance;
|
|
||||||
});
|
|
||||||
})();
|
|
@ -2,88 +2,25 @@
|
|||||||
define([
|
define([
|
||||||
'jquery',
|
'jquery',
|
||||||
'logging',
|
'logging',
|
||||||
'icinga/module',
|
|
||||||
'icinga/util/async',
|
'icinga/util/async',
|
||||||
'icinga/container',
|
'icinga/componentLoader'
|
||||||
'modules/list',
|
], function ($, log, async,components) {
|
||||||
'icinga/component'
|
|
||||||
], function ($, log, moduleMgr, async, containerMgr, modules,components) {
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
$(document).ready(function(){
|
|
||||||
components.load();
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Icinga prototype
|
* Icinga prototype
|
||||||
*/
|
*/
|
||||||
var Icinga = function() {
|
var Icinga = function() {
|
||||||
var internalModules = ['icinga/components/actionTable',
|
|
||||||
'icinga/components/mainDetail',
|
|
||||||
'icinga/components/datetime'];
|
|
||||||
|
|
||||||
this.modules = {};
|
|
||||||
var failedModules = [];
|
|
||||||
|
|
||||||
var initialize = function () {
|
var initialize = function () {
|
||||||
registerLazyModuleLoading();
|
components.load();
|
||||||
enableInternalModules();
|
|
||||||
|
|
||||||
containerMgr.registerAsyncMgr(async);
|
|
||||||
containerMgr.initializeContainers(document);
|
|
||||||
log.debug("Initialization finished");
|
log.debug("Initialization finished");
|
||||||
|
|
||||||
enableModules();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
var registerLazyModuleLoading = function() {
|
|
||||||
async.registerHeaderListener("X-Icinga-Enable-Module", loadModuleScript, this);
|
|
||||||
};
|
|
||||||
|
|
||||||
var enableInternalModules = function() {
|
|
||||||
$.each(internalModules,function(idx,module) {
|
|
||||||
moduleMgr.enableModule(module, log.error);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
var loadModuleScript = function(name) {
|
|
||||||
moduleMgr.enableModule("modules/"+name+"/"+name, function(error) {
|
|
||||||
failedModules.push({
|
|
||||||
name: name,
|
|
||||||
errorMessage: error
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
var enableModules = function(moduleList) {
|
|
||||||
moduleList = moduleList || modules;
|
|
||||||
|
|
||||||
$.each(modules,function(idx,module) {
|
|
||||||
loadModuleScript(module.name);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
$(document).ready(initialize.bind(this));
|
$(document).ready(initialize.bind(this));
|
||||||
|
|
||||||
return {
|
return {
|
||||||
loadModule: function(blubb,bla) {
|
components: components
|
||||||
behaviour.registerBehaviour(blubb,bla);
|
|
||||||
},
|
|
||||||
|
|
||||||
loadIntoContainer: function(ctr) {
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
loadUrl: function(url, target, params) {
|
|
||||||
target = target || "icinga-main";
|
|
||||||
async.loadToTarget(target, url, params);
|
|
||||||
},
|
|
||||||
|
|
||||||
getFailedModules: function() {
|
|
||||||
return failedModules;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
return new Icinga();
|
return new Icinga();
|
||||||
|
@ -1,100 +0,0 @@
|
|||||||
/*global Icinga:false, $: false, document: false, define:false requirejs:false base_url:false console:false */
|
|
||||||
|
|
||||||
/**
|
|
||||||
This prototype encapsulates the modules registered in the module folder
|
|
||||||
**/
|
|
||||||
(function() {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
var loaded = {};
|
|
||||||
|
|
||||||
define(['logging'],function(log) {
|
|
||||||
|
|
||||||
var registerModuleFunctions = function(module) {
|
|
||||||
var enableFn = module.enable, disableFn = module.disable;
|
|
||||||
|
|
||||||
module.enable = (function(root) {
|
|
||||||
root = root || $('body');
|
|
||||||
for (var jqMatcher in this.eventHandler) {
|
|
||||||
for (var ev in this.eventHandler[jqMatcher]) {
|
|
||||||
log.debug("Registered module: ", "'"+ev+"'", jqMatcher);
|
|
||||||
$(root).on(ev,jqMatcher,this.eventHandler[jqMatcher][ev]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(enableFn) {
|
|
||||||
enableFn.apply(this,arguments);
|
|
||||||
}
|
|
||||||
}).bind(module);
|
|
||||||
|
|
||||||
module.disable = (function(root) {
|
|
||||||
root = root || $('body');
|
|
||||||
for (var jqMatcher in this.eventHandler) {
|
|
||||||
for (var ev in this.eventHandler[jqMatcher]) {
|
|
||||||
log.debug("Unregistered module: ", "'"+ev+"'", jqMatcher);
|
|
||||||
$(root).off(ev,jqMatcher,this.eventHandler[jqMatcher][ev]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (disableFn) {
|
|
||||||
disableFn.apply(this,arguments);
|
|
||||||
}
|
|
||||||
}).bind(module);
|
|
||||||
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
var CallInterface = function() {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Loads a module and calls successCallback with the module as the parameter on success, otherwise
|
|
||||||
* the errorCallback with the errorstring as the first parameter
|
|
||||||
*
|
|
||||||
* @param name
|
|
||||||
* @param errorCallback
|
|
||||||
* @param successCallback
|
|
||||||
*/
|
|
||||||
this.enableModule = function(name,errorCallback,successCallback) {
|
|
||||||
requirejs([name],function(module) {
|
|
||||||
if (typeof module === "undefined") {
|
|
||||||
return errorCallback(new Error("Unknown module: "+name));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof module.eventHandler === "object") {
|
|
||||||
registerModuleFunctions(module);
|
|
||||||
}
|
|
||||||
if (typeof module.enable === "function") {
|
|
||||||
module.enable();
|
|
||||||
}
|
|
||||||
loaded[name] = {
|
|
||||||
module: module,
|
|
||||||
active: true
|
|
||||||
};
|
|
||||||
if (typeof successCallback === "function") {
|
|
||||||
successCallback(module);
|
|
||||||
}
|
|
||||||
},function(err) {
|
|
||||||
errorCallback("Could not load module "+name+" "+err,err);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
this.disableModule = function(name) {
|
|
||||||
if(loaded[name] && loaded[name].active) {
|
|
||||||
loaded[name].module.disable();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This should *ONLY* be called in testcases
|
|
||||||
**/
|
|
||||||
this.resetHard = function() {
|
|
||||||
if (typeof describe !== "function") {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
loaded = {};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
return new CallInterface();
|
|
||||||
});
|
|
||||||
|
|
||||||
})();
|
|
@ -3,7 +3,7 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
var asyncMgrInstance = null;
|
var asyncMgrInstance = null;
|
||||||
|
|
||||||
define(['icinga/container','logging','jquery'],function(containerMgr,log,$) {
|
define(['logging','jquery'],function(log,$,containerMgr) {
|
||||||
|
|
||||||
var headerListeners = {};
|
var headerListeners = {};
|
||||||
|
|
||||||
|
@ -31,5 +31,4 @@ describe('The async module', function() {
|
|||||||
},this);
|
},this);
|
||||||
var test = async.createRequest();
|
var test = async.createRequest();
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
@ -19,11 +19,11 @@ var setUp = function(registry)
|
|||||||
{
|
{
|
||||||
rjsmock.purgeDependencies();
|
rjsmock.purgeDependencies();
|
||||||
|
|
||||||
requireNew('icinga/registry.js');
|
requireNew('icinga/componentRegistry.js');
|
||||||
registry = registry || rjsmock.getDefine();
|
registry = registry || rjsmock.getDefine();
|
||||||
|
|
||||||
rjsmock.registerDependencies({
|
rjsmock.registerDependencies({
|
||||||
'icinga/registry': registry,
|
'icinga/componentRegistry': registry,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Available components
|
* Available components
|
||||||
@ -50,7 +50,7 @@ var setUp = function(registry)
|
|||||||
|
|
||||||
$('body').empty();
|
$('body').empty();
|
||||||
|
|
||||||
requireNew('icinga/component.js');
|
requireNew('icinga/componentLoader.js');
|
||||||
component = rjsmock.getDefine();
|
component = rjsmock.getDefine();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,283 +0,0 @@
|
|||||||
/**
|
|
||||||
* Test cases for the module loading implementation
|
|
||||||
*
|
|
||||||
*
|
|
||||||
**/
|
|
||||||
|
|
||||||
|
|
||||||
// {{LICENSE_HEADER}}
|
|
||||||
// {{LICENSE_HEADER}}
|
|
||||||
var should = require("should");
|
|
||||||
var rjsmock = require("requiremock.js");
|
|
||||||
var asyncMock = require("asyncmock.js");
|
|
||||||
|
|
||||||
|
|
||||||
requireNew("icinga/module.js");
|
|
||||||
var module = rjsmock.getDefine();
|
|
||||||
GLOBAL.document = $('body');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test module that only uses eventhandlers and
|
|
||||||
* no custom logic
|
|
||||||
**/
|
|
||||||
|
|
||||||
var eventOnlyModule = function() {
|
|
||||||
var thiz = this;
|
|
||||||
this.moduleLinkClick = false;
|
|
||||||
this.formFocus = false;
|
|
||||||
|
|
||||||
var onModuleLinkClick = function() {
|
|
||||||
thiz.moduleLinkClick = true;
|
|
||||||
};
|
|
||||||
var onFormFocus = function() {
|
|
||||||
thiz.formFocus = true;
|
|
||||||
};
|
|
||||||
this.eventHandler = {
|
|
||||||
'.myModule a' : {
|
|
||||||
'click': onModuleLinkClick
|
|
||||||
},
|
|
||||||
'.myModule div.test input' : {
|
|
||||||
'focus' : onFormFocus
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* Module that defines an own enable and disable function
|
|
||||||
* that is called additionally to the eventhandler setup
|
|
||||||
*
|
|
||||||
**/
|
|
||||||
var customLogicModule = function() {
|
|
||||||
var thiz = this;
|
|
||||||
this.clicked = false;
|
|
||||||
this.customEnable = false;
|
|
||||||
this.customDisable = false;
|
|
||||||
|
|
||||||
var onClick = function() {
|
|
||||||
thiz.clicked = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
this.enable = function() {
|
|
||||||
thiz.customEnable = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
this.disable = function() {
|
|
||||||
thiz.customDisable = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
this.eventHandler = {
|
|
||||||
'.myModule a' : {
|
|
||||||
'click' : onClick
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
var setupTestDOM = function() {
|
|
||||||
tearDownTestDOM();
|
|
||||||
$('body').append($('<div class="myModule" />')
|
|
||||||
.append($('<a href="test">funkey</a>'))
|
|
||||||
.append($('<div class="test" />')
|
|
||||||
.append('<input type="button" />')));
|
|
||||||
};
|
|
||||||
|
|
||||||
var tearDownTestDOM = function() {
|
|
||||||
$('body').off();
|
|
||||||
$('body').empty();
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
describe('Module loader', function() {
|
|
||||||
var err = null;
|
|
||||||
var errorCallback = function(error) {
|
|
||||||
err = error;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
it('Should call the errorCallback when module isn\'t found', function() {
|
|
||||||
err = null;
|
|
||||||
rjsmock.purgeDependencies();
|
|
||||||
module.resetHard();
|
|
||||||
module.enableModule("testModule", errorCallback);
|
|
||||||
should.exist(err);
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
it('Should register model event handlers when an \'eventHandler\' attribute exists', function() {
|
|
||||||
rjsmock.purgeDependencies();
|
|
||||||
var testModule = new eventOnlyModule();
|
|
||||||
rjsmock.registerDependencies({
|
|
||||||
testModule: testModule
|
|
||||||
});
|
|
||||||
err = null;
|
|
||||||
var toTest = null;
|
|
||||||
|
|
||||||
// Test event handler
|
|
||||||
setupTestDOM();
|
|
||||||
|
|
||||||
// Enable the module and asser it is recognized and enabled
|
|
||||||
module.enableModule("testModule", errorCallback, function(enabled) {
|
|
||||||
toTest = enabled;
|
|
||||||
});
|
|
||||||
should.not.exist(err, "An error occured during loading: "+err);
|
|
||||||
should.exist(toTest, "The injected test module didn't work!");
|
|
||||||
should.exist(toTest.enable, "Implicit enable method wasn't created");
|
|
||||||
$('.myModule a').click();
|
|
||||||
should.equal(toTest.moduleLinkClick, true, "Click on link should trigger handler");
|
|
||||||
|
|
||||||
$('.myModule div.test input').focus();
|
|
||||||
should.equal(toTest.formFocus, true, "Form focus should trigger handler");
|
|
||||||
|
|
||||||
tearDownTestDOM();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('Should be able to deregister events handlers when disable() is called', function() {
|
|
||||||
rjsmock.purgeDependencies();
|
|
||||||
var testModule = new eventOnlyModule();
|
|
||||||
rjsmock.registerDependencies({
|
|
||||||
testModule: testModule
|
|
||||||
});
|
|
||||||
err = null;
|
|
||||||
var toTest = null;
|
|
||||||
|
|
||||||
setupTestDOM();
|
|
||||||
|
|
||||||
module.enableModule("testModule", errorCallback, function(enabled) {
|
|
||||||
toTest = enabled;
|
|
||||||
});
|
|
||||||
should.not.exist(err, "An error occured during loading: "+err);
|
|
||||||
should.exist(toTest, "The injected test module didn't work!");
|
|
||||||
should.exist(toTest.enable, "Implicit enable method wasn't created");
|
|
||||||
|
|
||||||
$('.myModule a').click();
|
|
||||||
should.equal(toTest.moduleLinkClick, true, "Click on link should trigger handler");
|
|
||||||
toTest.moduleLinkClick = false;
|
|
||||||
|
|
||||||
module.disableModule("testModule");
|
|
||||||
$('.myModule a').click();
|
|
||||||
should.equal(toTest.moduleLinkClick, false, "Click on link shouldn't trigger handler when module is disabled");
|
|
||||||
tearDownTestDOM();
|
|
||||||
$('body').unbind();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('Should additionally call custom enable and disable functions', function() {
|
|
||||||
|
|
||||||
rjsmock.purgeDependencies();
|
|
||||||
var testModule = new customLogicModule();
|
|
||||||
rjsmock.registerDependencies({
|
|
||||||
testModule: testModule
|
|
||||||
});
|
|
||||||
err = null;
|
|
||||||
var toTest = null;
|
|
||||||
|
|
||||||
// Test event handler
|
|
||||||
setupTestDOM();
|
|
||||||
|
|
||||||
module.enableModule("testModule", errorCallback, function(enabled) {
|
|
||||||
toTest = enabled;
|
|
||||||
});
|
|
||||||
should.not.exist(err, "An error occured during loading: "+err);
|
|
||||||
should.exist(toTest, "The injected test module didn't work!");
|
|
||||||
should.exist(toTest.enable, "Implicit enable method wasn't created");
|
|
||||||
should.equal(toTest.customEnable, true, "Custom enable method wasn't called");
|
|
||||||
$('.myModule a').click();
|
|
||||||
should.equal(toTest.clicked, true, "Click on link should trigger handler");
|
|
||||||
toTest.clicked = false;
|
|
||||||
|
|
||||||
module.disableModule("testModule");
|
|
||||||
should.equal(toTest.customDisable, true, "Custom disable method wasn't called");
|
|
||||||
$('.myModule a').click();
|
|
||||||
should.equal(toTest.clicked, false, "Click on link shouldn't trigger handler when module is disabled");
|
|
||||||
tearDownTestDOM();
|
|
||||||
$('body').unbind();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
describe('The icinga module bootstrap', function() {
|
|
||||||
it("Should automatically load all enabled modules", function() {
|
|
||||||
rjsmock.purgeDependencies();
|
|
||||||
var testClick = false;
|
|
||||||
rjsmock.registerDependencies({
|
|
||||||
"icinga/module": module,
|
|
||||||
"icinga/util/async" : {
|
|
||||||
registerHeaderListener: function() {}
|
|
||||||
},
|
|
||||||
"modules/test/test" : {
|
|
||||||
eventHandler: {
|
|
||||||
"a.test" : {
|
|
||||||
click : function() {
|
|
||||||
testClick = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"icinga/container" : {
|
|
||||||
registerAsyncMgr: function() {},
|
|
||||||
initializeContainers: function() {}
|
|
||||||
},
|
|
||||||
"modules/list" : [
|
|
||||||
{ name: 'test' },
|
|
||||||
{ name: 'test2'} // this one fails
|
|
||||||
]
|
|
||||||
});
|
|
||||||
tearDownTestDOM();
|
|
||||||
requireNew("icinga/icinga.js");
|
|
||||||
var icinga = rjsmock.getDefine();
|
|
||||||
$('body').append($("<a class='test'></a>"));
|
|
||||||
$('a.test').click();
|
|
||||||
should.equal(testClick, true, "Module wasn't automatically loaded!");
|
|
||||||
icinga.getFailedModules().should.have.length(1);
|
|
||||||
should.equal(icinga.getFailedModules()[0].name, "test2");
|
|
||||||
tearDownTestDOM();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("Should load modules lazily when discovering a X-Icinga-Enable-Module header", function() {
|
|
||||||
rjsmock.purgeDependencies();
|
|
||||||
|
|
||||||
requireNew("icinga/util/async.js");
|
|
||||||
var async = rjsmock.getDefine();
|
|
||||||
|
|
||||||
rjsmock.registerDependencies({
|
|
||||||
"icinga/module": module,
|
|
||||||
"icinga/util/async": async,
|
|
||||||
"modules/test/test" : {
|
|
||||||
eventHandler: {
|
|
||||||
"a.test" : {
|
|
||||||
click : function() {
|
|
||||||
testClick = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"icinga/container" : {
|
|
||||||
registerAsyncMgr: function() {},
|
|
||||||
initializeContainers: function() {}
|
|
||||||
},
|
|
||||||
"modules/list" : [
|
|
||||||
]
|
|
||||||
});
|
|
||||||
|
|
||||||
tearDownTestDOM();
|
|
||||||
|
|
||||||
requireNew("icinga/icinga.js");
|
|
||||||
var icinga = rjsmock.getDefine();
|
|
||||||
|
|
||||||
var testClick = false;
|
|
||||||
// The module shouldn't be loaded
|
|
||||||
$('body').append($("<a class='test'></a>"));
|
|
||||||
$('a.test').click();
|
|
||||||
should.equal(testClick, false, "Unregistered module was loaded");
|
|
||||||
|
|
||||||
asyncMock.setNextAsyncResult(async,"result", false, {
|
|
||||||
"X-Icinga-Enable-Module" : "test"
|
|
||||||
});
|
|
||||||
async.createRequest();
|
|
||||||
// The module shouldn't be loaded
|
|
||||||
$('body').append($("<a class='test'></a>"));
|
|
||||||
$('a.test').click();
|
|
||||||
should.equal(testClick, true, "Module wasn't automatically loaded on header!");
|
|
||||||
|
|
||||||
|
|
||||||
tearDownTestDOM();
|
|
||||||
|
|
||||||
});
|
|
||||||
});
|
|
@ -10,7 +10,7 @@ GLOBAL.document = $('body');
|
|||||||
|
|
||||||
var registry;
|
var registry;
|
||||||
var setUp = function() {
|
var setUp = function() {
|
||||||
requireNew('icinga/registry.js');
|
requireNew('icinga/componentRegistry.js');
|
||||||
registry = rjsmock.getDefine();
|
registry = rjsmock.getDefine();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user