mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	As notified in the 4.14.0.0 release notes, this deprecates the legacy UI and moves it under the ui/legacy directory which will be served at /client/legacy URL path. This will also ensure that users upgrading or installing 4.15.0.0 will get the new UI by default. This will also make it simpler to remove the old UI for future 4.16/master releases. Co-authored-by: Daan Hoogland <daan.hoogland@shapeblue.com>
		
			
				
	
	
		
			941 lines
		
	
	
		
			38 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			941 lines
		
	
	
		
			38 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) {
 | |
|     var elems = {
 | |
|         aclDialog: function(args) {
 | |
|             var isDialog = args.isDialog;
 | |
|             var actionArgs = args.actionArgs;
 | |
|             var context = args.context;
 | |
|             var $acl = $('<div>').addClass('acl').multiEdit(
 | |
|                 $.extend(true, {}, actionArgs.multiEdit, {
 | |
|                     context: context
 | |
|                 })
 | |
|             );
 | |
| 
 | |
|             // Show ACL dialog
 | |
|             if (isDialog) {
 | |
|                 $acl.dialog({
 | |
|                     title: _l('label.configure.network.ACLs'),
 | |
|                     dialogClass: 'configure-acl',
 | |
|                     width: 900,
 | |
|                     height: 600,
 | |
|                     buttons: {
 | |
|                         'Done': function() {
 | |
|                             $(':ui-dialog').remove();
 | |
|                             $('.overlay').remove();
 | |
|                         }
 | |
|                     }
 | |
|                 });
 | |
|             }
 | |
| 
 | |
|             return $acl;
 | |
|         },
 | |
|         vpcConfigureTooltip: function(args) {
 | |
|             var context = args.context;
 | |
|             var $browser = args.$browser;
 | |
|             var $chart = args.$chart;
 | |
|             var ipAddresses = args.ipAddresses;
 | |
|             var acl = args.acl;
 | |
|             var gateways = args.gateways;
 | |
|             var siteToSiteVPN = args.siteToSiteVPN;
 | |
|             var links = {
 | |
|                 'ip-addresses': _l('label.menu.ipaddresses'),
 | |
|                 'gateways': _l('label.private.Gateway'),
 | |
|                 'site-to-site-vpn': _l('label.site.to.site.VPN'),
 | |
|                 'network-acls': _l('label.network.ACLs')
 | |
|             };
 | |
|             var $links = $('<ul>').addClass('links');
 | |
|             var $tooltip = $('<div>').addClass('vpc-configure-tooltip').append(
 | |
|                 $('<div>').addClass('arrow')
 | |
|             );
 | |
|             var tierDetailView = args.tierDetailView;
 | |
| 
 | |
|             // Make links
 | |
|             $.map(links, function(label, id) {
 | |
|                 var $link = $('<li>').addClass('link').addClass(id);
 | |
|                 var $label = $('<span>').html(label);
 | |
| 
 | |
|                 $link.append($label);
 | |
|                 $link.appendTo($links);
 | |
| 
 | |
|                 // Link event
 | |
|                 $link.click(function() {
 | |
|                     switch (id) {
 | |
|                         case 'network-acls':
 | |
|                             $browser.cloudBrowser('addPanel', {
 | |
|                                 title: _l('label.network.ACLs'),
 | |
|                                 maximizeIfSelected: true,
 | |
|                                 complete: function($panel) {
 | |
|                                     $panel.listView(
 | |
|                                         $.extend(true, {}, acl.listView, {
 | |
|                                             listView: {
 | |
|                                                 actions: {
 | |
|                                                     add: {
 | |
|                                                         label: 'label.add.network.ACL',
 | |
|                                                         action: {
 | |
|                                                             custom: function() {
 | |
|                                                                 elems.aclDialog({
 | |
|                                                                     isDialog: true,
 | |
|                                                                     actionArgs: acl,
 | |
|                                                                     context: context
 | |
|                                                                 });
 | |
|                                                             }
 | |
|                                                         }
 | |
|                                                     }
 | |
|                                                 },
 | |
|                                                 detailView: function() {
 | |
|                                                     var detailView = $.extend(true, {}, tierDetailView);
 | |
| 
 | |
|                                                     detailView.tabs = {
 | |
|                                                         acl: tierDetailView.tabs.acl
 | |
|                                                     };
 | |
| 
 | |
|                                                     return detailView;
 | |
|                                                 }
 | |
|                                             }
 | |
|                                         }), {
 | |
|                                             context: acl.context
 | |
|                                         }
 | |
|                                     );
 | |
|                                 }
 | |
|                             });
 | |
|                             break;
 | |
| 
 | |
|                         case 'ip-addresses':
 | |
|                             $browser.cloudBrowser('addPanel', {
 | |
|                                 title: _l('label.menu.ipaddresses'),
 | |
|                                 maximizeIfSelected: true,
 | |
|                                 complete: function($panel) {
 | |
|                                     //ipAddresses.listView is a function
 | |
|                                     $panel.listView(ipAddresses.listView(), {
 | |
|                                         context: ipAddresses.context
 | |
|                                     });
 | |
|                                 }
 | |
|                             });
 | |
|                             break;
 | |
|                         case 'gateways':
 | |
|                             //siteToSiteVPN is an object
 | |
|                             var addAction = gateways.add;
 | |
|                             var isGatewayPresent = addAction.preCheck({
 | |
|                                 context: gateways.context
 | |
|                             });
 | |
|                             var showGatewayListView = function() {
 | |
|                                 $browser.cloudBrowser('addPanel', {
 | |
|                                     title: _l('label.private.Gateway'),
 | |
|                                     maximizeIfSelected: true,
 | |
|                                     complete: function($panel) {
 | |
|                                         $panel.listView(gateways.listView(), {
 | |
|                                             context: gateways.context
 | |
|                                         });
 | |
|                                     }
 | |
|                                 });
 | |
|                             };
 | |
| 
 | |
|                             if (isGatewayPresent) {
 | |
|                                 showGatewayListView();
 | |
|                             } else {
 | |
|                                 cloudStack.dialog.createForm({
 | |
|                                     form: addAction.createForm,
 | |
|                                     context: args.gateways.context,
 | |
|                                     after: function(args) {
 | |
|                                         var data = args.data;
 | |
|                                         var error = function(message) {
 | |
|                                             cloudStack.dialog.notice({
 | |
|                                                 message: message
 | |
|                                             });
 | |
|                                         };
 | |
| 
 | |
|                                         addAction.action({
 | |
|                                             data: data,
 | |
|                                             $form: args.$form,
 | |
|                                             context: gateways.context,
 | |
|                                             response: {
 | |
|                                                 success: function(args) {
 | |
|                                                     var _custom = args._custom;
 | |
|                                                     var notification = {
 | |
|                                                         poll: addAction.notification.poll,
 | |
|                                                         _custom: _custom,
 | |
|                                                         desc: addAction.messages.notification()
 | |
|                                                     };
 | |
|                                                     var success = function(args) {
 | |
|                                                         if (!$chart.is(':visible')) return;
 | |
| 
 | |
|                                                         cloudStack.dialog.confirm({
 | |
|                                                             message: 'Gateway for VPC has been created successfully. Would you like to see its details?',
 | |
|                                                             action: showGatewayListView
 | |
|                                                         });
 | |
|                                                     };
 | |
| 
 | |
|                                                     cloudStack.dialog.notice({
 | |
|                                                         message: 'Your gateway is being created; please see notifications window.'
 | |
|                                                     });
 | |
| 
 | |
|                                                     cloudStack.ui.notifications.add(
 | |
|                                                         notification,
 | |
|                                                         success, {},
 | |
|                                                         error, {}
 | |
|                                                     );
 | |
|                                                 },
 | |
|                                                 error: error
 | |
|                                             }
 | |
|                                         });
 | |
|                                     }
 | |
|                                 });
 | |
|                             }
 | |
|                             break;
 | |
|                         case 'site-to-site-vpn':
 | |
|                             //siteToSiteVPN is an object
 | |
|                             var addAction = siteToSiteVPN.add;
 | |
|                             var isVPNPresent = addAction.preCheck({
 | |
|                                 context: siteToSiteVPN.context
 | |
|                             });
 | |
|                             var showVPNListView = function() {
 | |
|                                 $browser.cloudBrowser('addPanel', {
 | |
|                                     title: _l('label.site.to.site.VPN'),
 | |
|                                     maximizeIfSelected: true,
 | |
|                                     complete: function($panel) {
 | |
|                                         $panel.listView(siteToSiteVPN, {
 | |
|                                             context: siteToSiteVPN.context
 | |
|                                         });
 | |
|                                     }
 | |
|                                 });
 | |
|                             };
 | |
| 
 | |
|                             if (isVPNPresent) {
 | |
|                                 showVPNListView();
 | |
|                             } else {
 | |
|                                 cloudStack.dialog.confirm({
 | |
|                                     message: 'Please confirm that you want to add a Site-to-Site VPN gateway.',
 | |
|                                     action: function() {
 | |
|                                         var error = function(message) {
 | |
|                                             cloudStack.dialog.notice({
 | |
|                                                 message: message
 | |
|                                             });
 | |
|                                         };
 | |
| 
 | |
|                                         addAction.action({
 | |
|                                             context: siteToSiteVPN.context,
 | |
|                                             response: {
 | |
|                                                 success: function(args) {
 | |
|                                                     var _custom = args._custom;
 | |
|                                                     var notification = {
 | |
|                                                         poll: addAction.notification.poll,
 | |
|                                                         _custom: _custom,
 | |
|                                                         desc: addAction.messages.notification()
 | |
|                                                     };
 | |
|                                                     var success = function(args) {
 | |
|                                                         if (!$chart.is(':visible')) return;
 | |
|                                                         cloudStack.dialog.confirm({
 | |
|                                                             message: 'Gateway for VPC has been created successfully. Would you like to see its details?',
 | |
|                                                             action: showVPNListView
 | |
|                                                         });
 | |
|                                                     };
 | |
| 
 | |
|                                                     cloudStack.dialog.notice({
 | |
|                                                         message: 'Your VPN is being created; please see notifications window.'
 | |
|                                                     });
 | |
| 
 | |
|                                                     cloudStack.ui.notifications.add(
 | |
|                                                         notification,
 | |
|                                                         success, {},
 | |
|                                                         error, {}
 | |
|                                                     );
 | |
|                                                 },
 | |
|                                                 error: error
 | |
|                                             }
 | |
|                                         });
 | |
|                                     }
 | |
|                                 });
 | |
|                             }
 | |
|                             break;
 | |
|                     }
 | |
|                 });
 | |
|             });
 | |
| 
 | |
|             $tooltip.append($links);
 | |
| 
 | |
|             // Tooltip hover event
 | |
|             $tooltip.hover(
 | |
|                 function() {
 | |
|                     $tooltip.addClass('active');
 | |
|                 },
 | |
|                 function() {
 | |
|                     $tooltip.removeClass('active');
 | |
| 
 | |
|                     setTimeout(function() {
 | |
|                         if (!$tooltip.hasClass('active')) {
 | |
|                             $tooltip.remove();
 | |
|                         }
 | |
|                     }, 500);
 | |
|                 }
 | |
|             );
 | |
| 
 | |
|             return $tooltip;
 | |
|         },
 | |
|         vpcConfigureArea: function(args) {
 | |
|             var context = args.context;
 | |
|             var $browser = args.$browser;
 | |
|             var $chart = args.$chart;
 | |
|             var ipAddresses = args.ipAddresses;
 | |
|             var acl = args.acl;
 | |
|             var gateways = args.gateways;
 | |
|             var siteToSiteVPN = args.siteToSiteVPN;
 | |
|             var $config = $('<div>').addClass('config-area');
 | |
|             var $configIcon = $('<span>').addClass('icon').html(' ');
 | |
|             var tierDetailView = args.tierDetailView;
 | |
| 
 | |
|             $config.append($configIcon);
 | |
| 
 | |
|             // Tooltip event
 | |
|             $configIcon.mouseover(function() {
 | |
|                 var $tooltip = elems.vpcConfigureTooltip({
 | |
|                     context: context,
 | |
|                     $browser: $browser,
 | |
|                     $chart: $chart,
 | |
|                     ipAddresses: ipAddresses,
 | |
|                     gateways: gateways,
 | |
|                     acl: acl,
 | |
|                     siteToSiteVPN: siteToSiteVPN,
 | |
|                     tierDetailView: tierDetailView
 | |
|                 });
 | |
| 
 | |
|                 // Make sure tooltip is center aligned with icon
 | |
|                 $tooltip.css({
 | |
|                     left: $configIcon.position().left
 | |
|                 });
 | |
|                 $tooltip.appendTo($config).hide();
 | |
|                 $tooltip.stop().fadeIn('fast');
 | |
|             });
 | |
| 
 | |
|             return $config;
 | |
|         },
 | |
|         router: function(args) {
 | |
|             var $browser = args.$browser;
 | |
|             var detailView = args.detailView;
 | |
|             var $router = $('<li>').addClass('tier virtual-router');
 | |
|             var $title = $('<span>').addClass('title').html(_l('label.virtual.router'));
 | |
| 
 | |
|             $router.append($title);
 | |
| 
 | |
|             // Append horizontal chart line
 | |
|             $router.append($('<div>').addClass('connect-line'));
 | |
| 
 | |
|             $router.click(function() {
 | |
|                 if ($router.hasClass('disabled')) return false;
 | |
| 
 | |
|                 $browser.cloudBrowser('addPanel', {
 | |
|                     title: _l('label.VPC.router.details'),
 | |
|                     complete: function($panel) {
 | |
|                         $panel.detailView(detailView);
 | |
|                     }
 | |
|                 });
 | |
|             });
 | |
| 
 | |
|             return $router;
 | |
|         },
 | |
|         tier: function(args) {
 | |
|             var ipAddresses = args.ipAddresses;
 | |
|             var acl = args.acl;
 | |
|             var name = args.name;
 | |
|             var cidr = args.cidr;
 | |
|             var context = args.context;
 | |
|             var vmListView = args.vmListView;
 | |
|             var actionPreFilter = args.actionPreFilter;
 | |
|             var actions = $.map(
 | |
|                 args.actions ? args.actions : {}, function(value, key) {
 | |
|                     return {
 | |
|                         id: key,
 | |
|                         action: value
 | |
|                     };
 | |
|                 }
 | |
|             );
 | |
|             var detailView = args.detailView;
 | |
|             var $browser = args.$browser;
 | |
|             var isPlaceholder = args.isPlaceholder;
 | |
|             var virtualMachines = args.virtualMachines;
 | |
|             var $tier = $('<li>').addClass('tier');
 | |
|             var $title = $('<span>').addClass('title');
 | |
|             var $cidr = $('<span>').addClass('cidr');
 | |
|             var $vmCount = $('<span>').addClass('vm-count');
 | |
|             var $actions = $('<div>').addClass('actions');
 | |
| 
 | |
|             // Ignore special actions
 | |
|             // -- Add tier action is handled separately
 | |
|             actions = $.grep(actions, function(action) {
 | |
|                 return action.id != 'add';
 | |
|             });
 | |
| 
 | |
|             // Add loading indicator
 | |
|             $vmCount.append(
 | |
|                 $('<div>').addClass('loading-overlay')
 | |
|                 .attr('title', 'VMs are launching in this tier.')
 | |
|             );
 | |
| 
 | |
|             // VM count shows instance list
 | |
|             $vmCount.click(function() {
 | |
|                 var $dialog = $('<div>');
 | |
|                 var $listView = $('<div>').listView($.extend(true, {}, vmListView, {
 | |
|                     context: context
 | |
|                 }));
 | |
| 
 | |
|                 $dialog.append($listView);
 | |
|                 $dialog.dialog({
 | |
|                     title: _l('label.VMs.in.tier') + ': ' + name,
 | |
|                     dialogClass: 'multi-edit-add-list panel configure-acl',
 | |
|                     width: 825,
 | |
|                     height: 600,
 | |
|                     buttons: {
 | |
|                         'Done': function() {
 | |
|                             $(':ui-dialog').remove();
 | |
|                             $('.overlay').remove();
 | |
|                         }
 | |
|                     }
 | |
|                 }).closest('.ui-dialog').overlay();
 | |
|             });
 | |
| 
 | |
|             // Title shows tier details
 | |
|             $title.click(function() {
 | |
|                 if ($browser && $browser.length) { // Fix null exception, if add tier returns error
 | |
|                     $browser.cloudBrowser('addPanel', {
 | |
|                         title: name,
 | |
|                         maximizeIfSelected: true,
 | |
|                         complete: function($panel) {
 | |
|                             $panel.detailView($.extend(true, {}, detailView, {
 | |
|                                 $browser: $browser,
 | |
|                                 context: context
 | |
|                             }));
 | |
|                         }
 | |
|                     });
 | |
|                 }
 | |
|             });
 | |
| 
 | |
|             if (isPlaceholder) {
 | |
|                 $tier.addClass('placeholder');
 | |
|                 $title.html(_l('label.add.new.tier'));
 | |
|             } else {
 | |
|                 $title.html(
 | |
|                     cloudStack.concat(name, 8)
 | |
|                 );
 | |
|                 $title.attr('title', name);
 | |
|                 $cidr.html(cidr);
 | |
|                 $vmCount.append(
 | |
|                     $('<span>').addClass('total').html(virtualMachines != null ? virtualMachines.length : 0),
 | |
|                     _l('label.vms')
 | |
|                 );
 | |
|                 $tier.append($actions);
 | |
| 
 | |
|                 // Build action buttons
 | |
|                 $(actions).map(function(index, action) {
 | |
|                     var $action = $('<div>').addClass('action');
 | |
|                     var shortLabel = action.action.shortLabel;
 | |
|                     var label = action.action.label;
 | |
| 
 | |
|                     $action.addClass(action.id);
 | |
| 
 | |
|                     if (action.id != 'remove') {
 | |
|                         $action.append($('<span>').addClass('label').html(_l(shortLabel)));
 | |
|                     } else {
 | |
|                         $action.append($('<span>').addClass('icon').html(' '));
 | |
|                     }
 | |
| 
 | |
|                     $actions.append($action);
 | |
|                     $action.attr('title', label);
 | |
|                     $action.data('vpc-tier-action-id', action.id);
 | |
| 
 | |
|                     // Action event
 | |
|                     $action.click(function() {
 | |
|                         if ($action.hasClass('disabled')) {
 | |
|                             return false;
 | |
|                         }
 | |
| 
 | |
|                         tierAction({
 | |
|                             action: action,
 | |
|                             actionPreFilter: actionPreFilter,
 | |
|                             context: context,
 | |
|                             $tier: $tier,
 | |
|                             $actions: $actions
 | |
|                         });
 | |
| 
 | |
|                         return true;
 | |
|                     });
 | |
|                 });
 | |
|             }
 | |
| 
 | |
|             $tier.prepend($title);
 | |
| 
 | |
|             if (!isPlaceholder) {
 | |
|                 $tier.append($title, $cidr, $vmCount);
 | |
|             }
 | |
| 
 | |
|             // Append horizontal chart line
 | |
|             $tier.append($('<div>').addClass('connect-line'));
 | |
| 
 | |
|             // Handle action filter
 | |
|             filterActions({
 | |
|                 $actions: $actions,
 | |
|                 actionPreFilter: actionPreFilter,
 | |
|                 context: context
 | |
|             });
 | |
| 
 | |
|             return $tier;
 | |
|         },
 | |
|         chart: function(args) {
 | |
|             var $browser = args.$browser;
 | |
|             var acl = args.acl;
 | |
|             var ipAddresses = args.ipAddresses;
 | |
|             var gateways = args.gateways;
 | |
|             var siteToSiteVPN = args.siteToSiteVPN;
 | |
|             var tiers = args.tiers;
 | |
|             var vmListView = args.vmListView;
 | |
|             var actions = args.actions;
 | |
|             var actionPreFilter = args.actionPreFilter;
 | |
|             var vpcName = args.vpcName;
 | |
|             var context = args.context;
 | |
|             var tierDetailView = args.tierDetailView;
 | |
|             var $tiers = $('<ul>').addClass('tiers');
 | |
|             var $router;
 | |
| 
 | |
|             $router = elems.router({
 | |
|                 $browser: $browser,
 | |
|                 detailView: $.extend(true, {}, args.routerDetailView(), {
 | |
|                     context: context
 | |
|                 })
 | |
|             });
 | |
| 
 | |
|             if (!isAdmin()) $router.addClass('disabled');
 | |
| 
 | |
|             var $chart = $('<div>').addClass('vpc-chart');
 | |
|             var $title = $('<div>').addClass('vpc-title')
 | |
|                 .append(
 | |
|                     $('<span>').html(vpcName)
 | |
|             )
 | |
|                 .append(
 | |
|                     elems.vpcConfigureArea({
 | |
|                         context: context,
 | |
|                         $browser: $browser,
 | |
|                         $chart: $chart,
 | |
|                         ipAddresses: $.extend(ipAddresses, {
 | |
|                             context: context
 | |
|                         }),
 | |
|                         gateways: $.extend(gateways, {
 | |
|                             context: context
 | |
|                         }),
 | |
|                         siteToSiteVPN: $.extend(siteToSiteVPN, {
 | |
|                             context: context
 | |
|                         }),
 | |
|                         acl: $.extend(acl, {
 | |
|                             context: context
 | |
|                         }),
 | |
|                         tierDetailView: tierDetailView
 | |
|                     })
 | |
|             );
 | |
| 
 | |
|             var showAddTierDialog = function() {
 | |
|                 if ($(this).find('.loading-overlay').length) {
 | |
|                     return false;
 | |
|                 }
 | |
| 
 | |
|                 addTierDialog({
 | |
|                     ipAddresses: ipAddresses,
 | |
|                     $browser: $browser,
 | |
|                     tierDetailView: tierDetailView,
 | |
|                     $tiers: $tiers,
 | |
|                     acl: acl,
 | |
|                     context: context,
 | |
|                     actions: actions,
 | |
|                     vmListView: vmListView,
 | |
|                     actionPreFilter: actionPreFilter
 | |
|                 });
 | |
| 
 | |
|                 return true;
 | |
|             };
 | |
| 
 | |
|             if (tiers != null && tiers.length > 0) {
 | |
|                 $(tiers).map(function(index, tier) {
 | |
|                     var $tier = elems.tier({
 | |
|                         ipAddresses: ipAddresses,
 | |
|                         acl: acl,
 | |
|                         $browser: $browser,
 | |
|                         detailView: tierDetailView,
 | |
|                         name: tier.name,
 | |
|                         cidr: tier.cidr,
 | |
|                         virtualMachines: tier.virtualMachines,
 | |
|                         vmListView: vmListView,
 | |
|                         actions: actions,
 | |
|                         actionPreFilter: actionPreFilter,
 | |
|                         context: $.extend(true, {}, context, {
 | |
|                             networks: [tier]
 | |
|                         })
 | |
|                     });
 | |
| 
 | |
|                     $tier.appendTo($tiers);
 | |
|                 });
 | |
| 
 | |
|             }
 | |
| 
 | |
|             elems.tier({
 | |
|                 isPlaceholder: true
 | |
|             }).appendTo($tiers)
 | |
|                 .click(showAddTierDialog);
 | |
|             $tiers.prepend($router);
 | |
|             $chart.append($title, $tiers);
 | |
| 
 | |
|             if (!tiers || !tiers.length) {
 | |
|                 showAddTierDialog();
 | |
|             }
 | |
| 
 | |
|             return $chart;
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     var filterActions = function(args) {
 | |
|         var $actions = args.$actions;
 | |
|         var actionPreFilter = args.actionPreFilter;
 | |
|         var context = args.context;
 | |
|         var disabledActions, allowedActions;
 | |
| 
 | |
|         disabledActions = actionPreFilter ? actionPreFilter({
 | |
|             context: context
 | |
|         }) : [];
 | |
| 
 | |
|         // Visual appearance for disabled actions
 | |
|         $actions.find('.action').map(function(index, action) {
 | |
|             var $action = $(action);
 | |
|             var actionID = $action.data('vpc-tier-action-id');
 | |
| 
 | |
|             if ($.inArray(actionID, disabledActions) > -1) {
 | |
|                 $action.addClass('disabled');
 | |
|             } else {
 | |
|                 $action.removeClass('disabled');
 | |
|             }
 | |
|         });
 | |
|     };
 | |
| 
 | |
|     // Handles tier action, including UI effects
 | |
|     var tierAction = function(args) {
 | |
|         var $tier = args.$tier;
 | |
|         var $loading = $('<div>').addClass('loading-overlay');
 | |
|         var $actions = args.$actions;
 | |
|         var actionArgs = args.action.action;
 | |
|         var action = actionArgs.action;
 | |
|         var actionID = args.action.id;
 | |
|         var notification = actionArgs.notification;
 | |
|         var label = actionArgs.label;
 | |
|         var context = args.context;
 | |
|         var actionPreFilter = args.actionPreFilter;
 | |
| 
 | |
|         var success = function(args) {
 | |
|             var remove = args ? args.remove : false;
 | |
|             var _custom = args ? args._custom : {};
 | |
| 
 | |
|             var updateVMLoadingState = function() {
 | |
|                 var pendingVMs = $tier.data('vpc-tier-pending-vms');
 | |
| 
 | |
|                 pendingVMs = pendingVMs ? pendingVMs - 1 : 0;
 | |
| 
 | |
|                 if (!pendingVMs) {
 | |
|                     $tier.data('vpc-tier-pending-vms', 0);
 | |
|                     $tier.removeClass('loading');
 | |
|                 } else {
 | |
|                     $tier.data('vpc-tier-pending-vms', pendingVMs);
 | |
|                 }
 | |
|             };
 | |
| 
 | |
|             cloudStack.ui.notifications.add(
 | |
|                 // Notification
 | |
|                 {
 | |
|                     desc: label,
 | |
|                     poll: notification.poll,
 | |
|                     _custom: _custom
 | |
|                 },
 | |
| 
 | |
|                 // Success
 | |
| 
 | |
|                 function(args) {
 | |
|                     if (actionID == 'addVM') {
 | |
|                         // Increment VM total
 | |
|                         var $total = $tier.find('.vm-count .total');
 | |
|                         var prevTotal = parseInt($total.html());
 | |
|                         var newTotal = prevTotal + 1;
 | |
|                         var newVM = args.data;
 | |
|                         var newContext = $.extend(true, {}, context, {
 | |
|                             vms: [newVM]
 | |
|                         });
 | |
| 
 | |
|                         $total.html(newTotal);
 | |
| 
 | |
|                         filterActions({
 | |
|                             $actions: $actions,
 | |
|                             actionPreFilter: actionPreFilter,
 | |
|                             context: newContext
 | |
|                         });
 | |
| 
 | |
|                         updateVMLoadingState();
 | |
|                     } else if (actionID == 'remove') { //remove tier
 | |
|                         $loading.remove();
 | |
|                         $tier.remove();
 | |
|                     } else {
 | |
|                         $loading.remove();
 | |
|                     }
 | |
| 
 | |
|                 },
 | |
| 
 | |
|                 {},
 | |
| 
 | |
|                 // Error
 | |
| 
 | |
|                 function(args) {
 | |
|                     if (actionID == 'addVM') {
 | |
|                         updateVMLoadingState();
 | |
|                     } else {
 | |
|                         $loading.remove();
 | |
|                     }
 | |
|                 }
 | |
|             );
 | |
|         };
 | |
| 
 | |
|         switch (actionID) {
 | |
|             case 'addVM':
 | |
|                 action({
 | |
|                     context: context,
 | |
|                     complete: function(args) {
 | |
|                         var pendingVMs = $tier.data('vpc-tier-pending-vms');
 | |
| 
 | |
|                         pendingVMs = pendingVMs ? pendingVMs + 1 : 1;
 | |
|                         $tier.addClass('loading');
 | |
|                         $tier.data('vpc-tier-pending-vms', pendingVMs);
 | |
|                         success(args);
 | |
|                     }
 | |
|                 });
 | |
|                 break;
 | |
|             case 'remove':
 | |
|                 $loading.appendTo($tier);
 | |
|                 action({
 | |
|                     context: context,
 | |
|                     response: {
 | |
|                         success: function(args) {
 | |
|                             success($.extend(args, {
 | |
|                                 remove: true
 | |
|                             }));
 | |
|                         }
 | |
|                     }
 | |
|                 });
 | |
|                 break;
 | |
|             case 'acl':
 | |
|                 elems.aclDialog({
 | |
|                     isDialog: true,
 | |
|                     actionArgs: actionArgs,
 | |
|                     context: context
 | |
|                 }).closest('.ui-dialog').overlay();
 | |
|                 break;
 | |
|             default:
 | |
|                 $loading.appendTo($tier);
 | |
|                 action({
 | |
|                     context: context,
 | |
|                     complete: success,
 | |
|                     response: {
 | |
|                         success: success,
 | |
|                         error: function(args) {
 | |
|                             $loading.remove();
 | |
|                         }
 | |
|                     }
 | |
|                 });
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     // Appends a new tier to chart
 | |
|     var addNewTier = function(args) {
 | |
|         var ipAddresses = args.ipAddresses;
 | |
|         var acl = args.acl;
 | |
|         var actions = args.actions;
 | |
|         var vmListView = args.vmListView;
 | |
|         var actionPreFilter = args.actionPreFilter;
 | |
|         var context = args.context;
 | |
|         var $browser = args.$browser;
 | |
|         var tierDetailView = args.tierDetailView;
 | |
|         var tier = $.extend(args.tier, {
 | |
|             ipAddresses: ipAddresses,
 | |
|             $browser: $browser,
 | |
|             detailView: tierDetailView,
 | |
|             context: context,
 | |
|             vmListView: vmListView,
 | |
|             actions: actions,
 | |
|             actionPreFilter: actionPreFilter,
 | |
|             acl: acl,
 | |
|             virtualMachines: []
 | |
|         });
 | |
|         var $tiers = args.$tiers;
 | |
| 
 | |
|         $tiers.find('li.placeholder')
 | |
|             .before(
 | |
|                 elems.tier(tier)
 | |
|                 .hide()
 | |
|                 .fadeIn('slow')
 | |
|         );
 | |
|     };
 | |
| 
 | |
|     // Renders the add tier form, in a dialog
 | |
|     var addTierDialog = function(args) {
 | |
|         var ipAddresses = args.ipAddresses;
 | |
|         var actions = args.actions;
 | |
|         var context = args.context;
 | |
|         var vmListView = args.vmListView;
 | |
|         var actionPreFilter = args.actionPreFilter;
 | |
|         var $tiers = args.$tiers;
 | |
|         var $browser = args.$browser;
 | |
|         var tierDetailView = args.tierDetailView;
 | |
|         var acl = args.acl;
 | |
| 
 | |
|         cloudStack.dialog.createForm({
 | |
|             context: context,
 | |
|             form: actions.add.createForm,
 | |
|             after: function(args) {
 | |
|                 var $loading = $('<div>').addClass('loading-overlay').prependTo($tiers.find('li.placeholder'));
 | |
|                 actions.add.action({
 | |
|                     context: context,
 | |
|                     data: args.data,
 | |
|                     response: {
 | |
|                         success: function(args) {
 | |
|                             var tier = args.data;
 | |
| 
 | |
|                             cloudStack.ui.notifications.add(
 | |
|                                 // Notification
 | |
|                                 {
 | |
|                                     desc: actions.add.label
 | |
|                                 },
 | |
| 
 | |
|                                 // Success
 | |
| 
 | |
|                                 function(args) {
 | |
|                                     $loading.remove();
 | |
|                                     addNewTier({
 | |
|                                         ipAddresses: ipAddresses,
 | |
|                                         $browser: $browser,
 | |
|                                         tierDetailView: tierDetailView,
 | |
|                                         context: $.extend(true, {}, context, {
 | |
|                                             networks: [tier]
 | |
|                                         }),
 | |
|                                         tier: tier,
 | |
|                                         acl: acl,
 | |
|                                         $tiers: $tiers,
 | |
|                                         actions: actions,
 | |
|                                         actionPreFilter: actionPreFilter,
 | |
|                                         vmListView: vmListView
 | |
|                                     });
 | |
|                                 },
 | |
| 
 | |
|                                 {},
 | |
| 
 | |
|                                 // Error
 | |
| 
 | |
|                                 function(args) {
 | |
|                                     $loading.remove();
 | |
|                                 }
 | |
|                             );
 | |
|                         },
 | |
|                         error: function(errorMsg) {
 | |
|                             cloudStack.dialog.notice({
 | |
|                                 message: _s(errorMsg)
 | |
|                             });
 | |
|                             $loading.remove();
 | |
|                         }
 | |
|                     }
 | |
|                 });
 | |
|             }
 | |
|         });
 | |
|     };
 | |
| 
 | |
|     cloudStack.uiCustom.vpc = function(args) {
 | |
|         var vmListView = args.vmListView;
 | |
|         var tierArgs = args.tiers;
 | |
|         var ipAddresses = args.ipAddresses;
 | |
|         var gateways = args.gateways;
 | |
|         var acl = args.acl;
 | |
|         var siteToSiteVPN = args.siteToSiteVPN;
 | |
|         var routerDetailView = args.routerDetailView;
 | |
| 
 | |
|         return function(args) {
 | |
|             var context = args.context;
 | |
|             var $browser = $('#browser .container');
 | |
|             var $toolbar = $('<div>').addClass('toolbar');
 | |
|             var vpc = args.context.vpc[0];
 | |
| 
 | |
|             $browser.cloudBrowser('addPanel', {
 | |
|                 maximizeIfSelected: true,
 | |
|                 title: _l('label.configure.vpc') + ': ' + vpc.name,
 | |
|                 complete: function($panel) {
 | |
|                     var $loading = $('<div>').addClass('loading-overlay').appendTo($panel);
 | |
| 
 | |
|                     $panel.append($toolbar);
 | |
| 
 | |
|                     // Load data
 | |
|                     tierArgs.dataProvider({
 | |
|                         context: context,
 | |
|                         response: {
 | |
|                             success: function(args) {
 | |
|                                 // Setup detail view tabs
 | |
|                                 var tierDetailView = $.extend(true, {}, tierArgs.detailView, {
 | |
|                                     tabs: {
 | |
|                                         acl: {
 | |
|                                             custom: function(args) {
 | |
|                                                 var $acl = elems.aclDialog({
 | |
|                                                     isDialog: false,
 | |
|                                                     actionArgs: acl,
 | |
|                                                     context: args.context
 | |
|                                                 });
 | |
| 
 | |
|                                                 return $acl;
 | |
|                                             }
 | |
|                                         },
 | |
|                                         ipAddresses: {
 | |
|                                             custom: function(args) {
 | |
|                                                 return $('<div>').listView(ipAddresses.listView(), {
 | |
|                                                     context: args.context
 | |
|                                                 });
 | |
|                                             }
 | |
|                                         }
 | |
|                                     }
 | |
|                                 });
 | |
| 
 | |
|                                 var tiers = args.tiers;
 | |
|                                 var $chart = elems.chart({
 | |
|                                     $browser: $browser,
 | |
|                                     ipAddresses: ipAddresses,
 | |
|                                     gateways: gateways,
 | |
|                                     acl: acl,
 | |
|                                     tierDetailView: tierDetailView,
 | |
|                                     routerDetailView: routerDetailView,
 | |
|                                     siteToSiteVPN: siteToSiteVPN,
 | |
|                                     vmListView: vmListView,
 | |
|                                     context: context,
 | |
|                                     actions: tierArgs.actions,
 | |
|                                     actionPreFilter: tierArgs.actionPreFilter,
 | |
|                                     vpcName: vpc.name,
 | |
|                                     tiers: tiers
 | |
|                                 }).appendTo($panel);
 | |
| 
 | |
|                                 $loading.remove();
 | |
|                                 $chart.fadeIn(function() {});
 | |
|                             }
 | |
|                         }
 | |
|                     });
 | |
|                 }
 | |
|             });
 | |
|         };
 | |
|     };
 | |
| }(jQuery, cloudStack));
 |