diff --git a/ui/index.jsp b/ui/index.jsp index 550661e546a..5e5a7f2becf 100644 --- a/ui/index.jsp +++ b/ui/index.jsp @@ -1680,9 +1680,10 @@ under the License. - + + diff --git a/ui/modules/modules.js b/ui/modules/modules.js new file mode 100644 index 00000000000..490749ff085 --- /dev/null +++ b/ui/modules/modules.js @@ -0,0 +1,20 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +(function($, cloudStack) { + cloudStack.modules = [ + ]; +}(jQuery, cloudStack)); diff --git a/ui/scripts/plugins.js b/ui/scripts/plugins.js index d3e07055299..9d1991cc759 100644 --- a/ui/scripts/plugins.js +++ b/ui/scripts/plugins.js @@ -15,6 +15,8 @@ // specific language governing permissions and limitations // under the License. (function($, cloudStack, require) { + if (!cloudStack.pluginAPI) cloudStack.pluginAPI = {}; + var loadCSS = function(path) { var $link = $(''); @@ -27,27 +29,29 @@ $('head').append($link); }; - var pluginAPI = { - pollAsyncJob: pollAsyncJobResult, - apiCall: function(command, args) { - $.ajax({ - url: createURL(command), - data: args.data, - success: args.success, - error: function(json) { - args.error(parseXMLHttpResponse(json)); - } - }) - }, - addSection: function(section) { - cloudStack.sections[section.id] = $.extend(section, { - customIcon: 'plugins/' + section.id + '/icon.png' - }); - }, - extend: function(obj) { - $.extend(true, cloudStack, obj); + $.extend(cloudStack.pluginAPI, { + ui: { + pollAsyncJob: pollAsyncJobResult, + apiCall: function(command, args) { + $.ajax({ + url: createURL(command), + data: args.data, + success: args.success, + error: function(json) { + args.error(parseXMLHttpResponse(json)); + } + }) + }, + addSection: function(section) { + cloudStack.sections[section.id] = $.extend(section, { + customIcon: 'plugins/' + section.id + '/icon.png' + }); + }, + extend: function(obj) { + $.extend(true, cloudStack, obj); + } } - }; + }); cloudStack.sections.plugins = { title: 'label.plugins', @@ -66,9 +70,37 @@ loadCSS(pluginCSS); // Execute plugin - cloudStack.plugins[pluginID]({ - ui: pluginAPI - }); + cloudStack.plugins[pluginID]( + $.extend(true, {}, cloudStack.pluginAPI, { + pluginAPI: { + extend: function(api) { + cloudStack.pluginAPI[pluginID] = api; + } + } + }) + ); + }); + }); + + // Load modules + $(cloudStack.modules).map(function(index, moduleID) { + var basePath = 'modules/' + moduleID + '/'; + var moduleJS = basePath + moduleID + '.js'; + var moduleCSS = basePath + moduleID + '.css'; + + require([moduleJS], function() { + loadCSS(moduleCSS); + + // Execute module + cloudStack.modules[moduleID]( + $.extend(true, {}, cloudStack.pluginAPI, { + pluginAPI: { + extend: function(api) { + cloudStack.pluginAPI[moduleID] = api; + } + } + }) + ); }); }); }(jQuery, cloudStack, require));