mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	For any plugin/module, allow including additional JS dependencies via
new plugin syntax.
To include JS files, instead of passing a function directly, pass an
array with the first element being a sub-list of the includes:
cloudStack.plugin.myPlugin = [
    ['file1', 'file2', 'fileN' ...], // These will be loaded before
                                     // plugin is executed
    function(plugin) { // The plugin entry point
        ...
    }
];
-- Where each item represents a JS file relative to the plugin folder
   and without the .js extension. Sub-folders are also supported, i.e.,
   'subfolder/file1'
		
	
			
		
			
				
	
	
		
			171 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			171 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // 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, require) {
 | |
|     if (!cloudStack.pluginAPI) {
 | |
|         cloudStack.pluginAPI = {};
 | |
|     }
 | |
| 
 | |
|     var loadCSS = function(path) {
 | |
|         if (document.createStyleSheet) {
 | |
|             // IE-compatible CSS loading
 | |
|             document.createStyleSheet(path);
 | |
|         } else {
 | |
|             var $link = $('<link>');
 | |
| 
 | |
|             $link.attr({
 | |
|                 rel: 'stylesheet',
 | |
|                 type: 'text/css',
 | |
|                 href: path
 | |
|             });
 | |
| 
 | |
|             $('html head').append($link);
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     $.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',
 | |
|                     isPlugin: true
 | |
|                 });
 | |
|             },
 | |
|             extend: function(obj) {
 | |
|                 $.extend(true, cloudStack, obj);
 | |
|             }
 | |
|         }
 | |
|     });
 | |
| 
 | |
|     cloudStack.sections.plugins = {
 | |
|         title: 'label.plugins',
 | |
|         show: cloudStack.uiCustom.pluginListing
 | |
|     };
 | |
| 
 | |
|     var loadedPlugins = 0;
 | |
|     var pluginTotal = cloudStack.plugins.length + cloudStack.modules.length;
 | |
| 
 | |
|     // Load
 | |
|     $(['modules', 'plugins']).each(function() {
 | |
|         var type = this;
 | |
|         var paths = $(cloudStack[type]).map(function(index, id) {
 | |
|             return type + '/' + id + '/' + id;
 | |
|         }).toArray();
 | |
| 
 | |
|         // Load modules
 | |
|         require(
 | |
|             paths,
 | |
|             function() {
 | |
|                 $(cloudStack[type]).map(function(index, id) {
 | |
|                     var basePath = type + '/' + id + '/';
 | |
|                     var css = basePath + id + '.css';
 | |
|                     var configJS = type == 'plugins' ? basePath + 'config' : null;
 | |
| 
 | |
|                     var pluginDictionary;
 | |
|                     var locale;
 | |
|                     if (type == 'plugins') {
 | |
|                         pluginDictionary = basePath + 'dictionary';
 | |
|                         locale = $.cookie('lang');
 | |
|                     }
 | |
| 
 | |
|                     if (configJS) {
 | |
|                         // Load config metadata
 | |
|                         require([configJS]);
 | |
|                     }
 | |
| 
 | |
|                     // Execute module
 | |
|                     var target = cloudStack[type][id];
 | |
| 
 | |
|                     if ($.isArray(target)) { // Load additional JS includes
 | |
|                         pluginTotal += target[0].length;
 | |
|                         require(
 | |
|                             $(target[0]).map(function(index, val) {
 | |
|                                 return basePath + val;
 | |
|                             }).toArray(),
 | |
|                             function() {
 | |
|                                 loadedPlugins = loadedPlugins + target[0].length;
 | |
|                                 target[1](
 | |
|                                     $.extend(true, {}, cloudStack.pluginAPI, {
 | |
|                                         pluginAPI: {
 | |
|                                             extend: function(api) {
 | |
|                                                 cloudStack.pluginAPI[id] = api;
 | |
|                                             }
 | |
|                                         }
 | |
|                                     })
 | |
|                                 );
 | |
|                             });
 | |
|                     } else {
 | |
|                         target(
 | |
|                             $.extend(true, {}, cloudStack.pluginAPI, {
 | |
|                                 pluginAPI: {
 | |
|                                     extend: function(api) {
 | |
|                                         cloudStack.pluginAPI[id] = api;
 | |
|                                     }
 | |
|                                 }
 | |
|                             })
 | |
|                         );
 | |
|                     }
 | |
| 
 | |
|                     if (pluginDictionary) {
 | |
|                         // Callback for extending the dictionary with new entries
 | |
|                         var addToDictionary = function() {
 | |
|                             var additions = cloudStack[type][id].dictionary;
 | |
|                             $.extend(dictionary, additions);
 | |
|                         };
 | |
| 
 | |
|                         // Only add a suffix if the locale is defined and not english/US
 | |
|                         var suffix = '';
 | |
|                         if (locale && (locale != '' && locale != 'en' & locale != 'en_US'))
 | |
|                             suffix = '_'+locale;
 | |
| 
 | |
|                         // Attempt to load the locale's dictionary
 | |
|                         require([pluginDictionary+suffix], addToDictionary, function() {
 | |
|                             // If the load failed and there was no suffix, don't try again
 | |
|                             if (!suffix)
 | |
|                                 return;
 | |
| 
 | |
|                             // Otherwise try to load the default dictionary
 | |
|                             require([pluginDictionary], addToDictionary);
 | |
|                         });
 | |
|                     }
 | |
| 
 | |
|                     loadedPlugins = loadedPlugins + 1;
 | |
| 
 | |
|                     loadCSS(css);
 | |
|                 });
 | |
|             }
 | |
|         );
 | |
|     });
 | |
| 
 | |
|     var loadTimer = setInterval(function() {
 | |
|         if (loadedPlugins === pluginTotal) {
 | |
|             clearInterval(loadTimer);
 | |
|             $(window).trigger('cloudStack.pluginReady');
 | |
|         }
 | |
|     }, 100);
 | |
| }(jQuery, cloudStack, require));
 |