diff --git a/public/js/icinga/components/actionTable.js b/public/js/icinga/components/actionTable.js new file mode 100644 index 000000000..e8e61952b --- /dev/null +++ b/public/js/icinga/components/actionTable.js @@ -0,0 +1,118 @@ +/*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(); + +}); \ No newline at end of file diff --git a/public/js/icinga/components/mainDetail.js b/public/js/icinga/components/mainDetail.js new file mode 100755 index 000000000..368c5c5f7 --- /dev/null +++ b/public/js/icinga/components/mainDetail.js @@ -0,0 +1,99 @@ +/*global Icinga:false, document: false, define:false require:false base_url:false console:false */ + +/** + * Main-Detail layout behaviour as described in + * https://wiki.icinga.org/display/cranberry/Frontend+Components#FrontendComponents-Behaviour + * + */ +define(['jquery','logging','icinga/util/async'],function($,log,async) { + "use strict"; + + var MainDetailBehaviour = function() { + + var onOuterLinkClick = function(ev) { + var a = $(ev.currentTarget), + target = a.attr("target"), + href = a.attr("href"); + ev.stopImmediatePropagation(); + collapseDetailView(); + async.loadToTarget("icinga-main",href); + return false; +}; + +var onLinkTagClick = function(ev) { + + var a = $(ev.currentTarget), + target = a.attr("target"), + href = a.attr("href"); + + // check for protocol:// + if(/^[A-Z]{2,10}\:\/\//i.test(href)) { + window.open(href); + ev.stopImmediatePropagation(); + return false; + } + + // check for link in table header + if(a.parents('th').length > 0) { + ev.stopImmediatePropagation(); + return false; + } + + if(typeof target === "undefined") { + if(a.parents("#icinga-detail").length) { + log.debug("Parent is detail, loading into detail"); + async.loadToTarget("icinga-detail",href); + } else { + log.debug("Parent is not detail, loading into main"); + async.loadToTarget("icinga-main",href); + } + } else { + switch(target) { + case "body": + async.loadToTarget("body", href); + break; + case "main": + async.loadToTarget("icinga-main",href); + collapseDetailView(); + break; + case "detail": + log.debug("Target: detail"); + async.loadToTarget("icinga-detail",href); + break; + case "popup": + log.debug("No target"); + async.loadToTarget(null,href); + break; + default: + return true; + } + } + ev.stopImmediatePropagation(); + return false; + }; + + var expandDetailView = function() { + $("#icinga-detail").parents(".collapsed").removeClass('collapsed'); + }; + + var collapseDetailView = function(elementInDetailView) { + $("#icinga-detail").parents(".layout-main-detail").addClass('collapsed'); + }; + + this.expandDetailView = expandDetailView; + this.collapseDetailView = collapseDetailView; + + this.eventHandler = { + '.layout-main-detail * a' : { + 'click' : onLinkTagClick + }, + 'a' : { + 'click' : onOuterLinkClick + }, + '.layout-main-detail .icinga-container#icinga-detail' : { + 'focus' : expandDetailView + } + }; + }; + return new MainDetailBehaviour(); +}); diff --git a/public/js/icinga/icinga.js b/public/js/icinga/icinga.js index 40fc20dc6..ff59321f6 100755 --- a/public/js/icinga/icinga.js +++ b/public/js/icinga/icinga.js @@ -19,19 +19,16 @@ define([ var failedModules = []; var initialize = function () { - registerLazyModuleLoading(); enableInternalModules(); - + containerMgr.registerAsyncMgr(async); containerMgr.initializeContainers(document); log.debug("Initialization finished"); enableModules(); }; + - var registerLazyModuleLoading = function() { - async.registerHeaderListener("X-Icinga-Enable-Module", loadModuleScript, this); - }; var enableInternalModules = function() { $.each(internalModules,function(idx,module) { @@ -40,7 +37,6 @@ define([ }; var loadModuleScript = function(name) { - console.log("Loading ", name); moduleMgr.enableModule("modules/"+name+"/"+name, function(error) { failedModules.push({ name: name, @@ -71,12 +67,7 @@ define([ loadIntoContainer: function(ctr) { }, - - loadUrl: function(url, target, params) { - target = target || "icinga-main"; - async.loadToTarget(target, url, params); - }, - + getFailedModules: function() { return failedModules; }