mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			1148 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			1148 lines
		
	
	
		
			37 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 getProjectAdmin, selectedProjectObj;
 | |
|   cloudStack.projects = {
 | |
|     requireInvitation: function(args) {
 | |
|       return g_capabilities.projectinviterequired;
 | |
|     },
 | |
| 
 | |
|     invitationCheck: function(args) {
 | |
|       $.ajax({
 | |
|         url: createURL('listProjectInvitations'),
 | |
|         data: { state: 'Pending' },
 | |
|         success: function(json) {
 | |
|           args.response.success({
 | |
|             data: json.listprojectinvitationsresponse.projectinvitation ?
 | |
|               json.listprojectinvitationsresponse.projectinvitation : []
 | |
|           });
 | |
|         }
 | |
|       });
 | |
|     },
 | |
| 
 | |
|     resourceManagement: {
 | |
|       update: function(args, projectID) {
 | |
|         var totalResources = 5;
 | |
|         var updatedResources = 0;
 | |
| 
 | |
|         projectID = projectID ? projectID : cloudStack.context.projects[0].id;
 | |
| 
 | |
|         $.each(args.data, function(key, value) {
 | |
|           $.ajax({
 | |
|             url: createURL('updateResourceLimit', { ignoreProject: true }),
 | |
|             data: {
 | |
|               projectid: projectID,
 | |
|               resourcetype: key,
 | |
|               max: args.data[key]
 | |
|             },
 | |
|             success: function(json) {
 | |
|               updatedResources++;
 | |
|               if (updatedResources == totalResources) {
 | |
|                 args.response.success();
 | |
|               }
 | |
|             }
 | |
|           });
 | |
|         });
 | |
|       },
 | |
| 
 | |
|       dataProvider: function(args, projectID) {
 | |
|         projectID = projectID ? projectID : cloudStack.context.projects[0].id;
 | |
| 
 | |
|         $.ajax({
 | |
|           url: createURL('listResourceLimits', { ignoreProject: true }),
 | |
|           data: {
 | |
|             projectid: projectID
 | |
|           },
 | |
|           success: function(json) {
 | |
|             var resourceLimits = $.grep(
 | |
|               json.listresourcelimitsresponse.resourcelimit,
 | |
|               function(resourceLimit) {
 | |
|                 return resourceLimit.resourcetype != 5 && resourceLimit.resourcetype != 8;
 | |
|               }
 | |
|             );
 | |
|             
 | |
|             args.response.success({
 | |
|               data: $.map(
 | |
|                 resourceLimits,
 | |
|                 function(resource) {
 | |
|                   var resourceMap = {
 | |
|                     0: {
 | |
|                       id: 'user_vm',
 | |
|                       label: 'label.max.vms'
 | |
|                     },
 | |
|                     1: {
 | |
|                       id: 'public_ip',
 | |
|                       label: 'label.max.public.ips'
 | |
|                     },
 | |
|                     2: {
 | |
|                       id: 'volume',
 | |
|                       label: 'label.max.volumes'
 | |
|                     },
 | |
|                     3: {
 | |
|                       id: 'snapshot',
 | |
|                       label: 'label.max.snapshots'
 | |
|                     },
 | |
|                     4: {
 | |
|                       id: 'template',
 | |
|                       label: 'label.max.templates'
 | |
|                     },
 | |
|                     5: {
 | |
|                       id: 'project',
 | |
|                       label: 'label.max.projects'
 | |
|                     },
 | |
|                     6: {
 | |
|                       id: 'network',
 | |
|                       label: 'label.max.networks'
 | |
|                     },
 | |
|                     7: {
 | |
|                       id: 'vpc',
 | |
|                       label: 'label.max.vpcs'
 | |
|                     }                    
 | |
|                   };
 | |
| 
 | |
|                   return {
 | |
|                     id: resourceMap[resource.resourcetype].id,
 | |
|                     label: _l(resourceMap[resource.resourcetype].label),
 | |
|                     type: resource.resourcetype,
 | |
|                     value: resource.max
 | |
|                   };
 | |
|                 }
 | |
|               )
 | |
|             });
 | |
|           }
 | |
|         });
 | |
|       }
 | |
|     },
 | |
| 
 | |
|     dashboard: function(args) {
 | |
|       var dataFns = {
 | |
|         instances: function(data) {
 | |
|           $.ajax({
 | |
|             url: createURL('listVirtualMachines'),
 | |
|             success: function(json) {
 | |
|               var instances = json.listvirtualmachinesresponse.virtualmachine ?
 | |
|                     json.listvirtualmachinesresponse.virtualmachine : [];
 | |
| 
 | |
|               dataFns.storage($.extend(data, {
 | |
|                 runningInstances: $.grep(instances, function(instance) {
 | |
|                   return instance.state == 'Running';
 | |
|                 }).length,
 | |
|                 stoppedInstances: $.grep(instances, function(instance) {
 | |
|                   return instance.state != 'Running';
 | |
|                 }).length,
 | |
|                 totalInstances: instances.length
 | |
|               }));
 | |
|             }
 | |
|           });
 | |
|         },
 | |
| 
 | |
|         storage: function(data) {
 | |
|           $.ajax({
 | |
|             url: createURL('listVolumes'),
 | |
|             success: function(json) {
 | |
|               dataFns.bandwidth($.extend(data, {
 | |
|                 totalVolumes: json.listvolumesresponse.volume ?
 | |
|                   json.listvolumesresponse.count : 0
 | |
|               }));
 | |
|             }
 | |
|           });
 | |
|         },
 | |
| 
 | |
|         bandwidth: function(data) {
 | |
|           var totalBandwidth = 0;
 | |
|           $.ajax({
 | |
|             url: createURL('listNetworks'),
 | |
|             success: function(json) {
 | |
|               var networks = json.listnetworksresponse.network ?
 | |
|                     json.listnetworksresponse.network : [];
 | |
|               $(networks).each(function() {
 | |
|                 var network = this;
 | |
|                 $.ajax({
 | |
|                   url: createURL('listNetworkOfferings'),
 | |
|                   async: false,
 | |
|                   data: {
 | |
|                     id: network.networkofferingid
 | |
|                   },
 | |
|                   success: function(json) {
 | |
|                     totalBandwidth +=
 | |
|                     json.listnetworkofferingsresponse.networkoffering[0].networkrate;
 | |
|                   }
 | |
|                 });
 | |
|               });
 | |
| 
 | |
|               dataFns.ipAddresses($.extend(data, {
 | |
|                 totalBandwidth: totalBandwidth
 | |
|               }));
 | |
|             }
 | |
|           });
 | |
|         },
 | |
| 
 | |
|         ipAddresses: function(data) {
 | |
|           $.ajax({
 | |
|             url: createURL('listPublicIpAddresses'),
 | |
|             success: function(json) {
 | |
|               dataFns.loadBalancingRules($.extend(data, {
 | |
|                 totalIPAddresses: json.listpublicipaddressesresponse.count ?
 | |
|                   json.listpublicipaddressesresponse.count : 0
 | |
|               }));
 | |
|             }
 | |
|           });
 | |
|         },
 | |
| 
 | |
|         loadBalancingRules: function(data) {
 | |
|           $.ajax({
 | |
|             url: createURL('listLoadBalancerRules'),
 | |
|             success: function(json) {
 | |
|               dataFns.portForwardingRules($.extend(data, {
 | |
|                 totalLoadBalancers: json.listloadbalancerrulesresponse.count ?
 | |
|                   json.listloadbalancerrulesresponse.count : 0
 | |
|               }));
 | |
|             }
 | |
|           });
 | |
|         },
 | |
| 
 | |
|         portForwardingRules: function(data) {
 | |
|           $.ajax({
 | |
|             url: createURL('listPortForwardingRules'),
 | |
|             success: function(json) {
 | |
|               dataFns.users($.extend(data, {
 | |
|                 totalPortForwards: json.listportforwardingrulesresponse.count ?
 | |
|                   json.listportforwardingrulesresponse.count : 0
 | |
|               }));
 | |
|             }
 | |
|           });
 | |
|         },
 | |
| 
 | |
|         users: function(data) {
 | |
|           $.ajax({
 | |
|             url: createURL('listProjectAccounts'),
 | |
|             success: function(json) {
 | |
|               var users = json.listprojectaccountsresponse.projectaccount;
 | |
| 
 | |
|               dataFns.events($.extend(data, {
 | |
|                 users: $.map(users, function(user) {
 | |
|                   return {
 | |
|                     account: user.account
 | |
|                   };
 | |
|                 })
 | |
|               }));
 | |
|             }
 | |
|           });
 | |
|         },
 | |
| 
 | |
|         events: function(data) {
 | |
|           $.ajax({
 | |
|             url: createURL('listEvents', { ignoreProject: true }),
 | |
|             data: {
 | |
|               page: 1,
 | |
|               pageSize: 8
 | |
|             },
 | |
|             success: function(json) {
 | |
|               var events = json.listeventsresponse.event;
 | |
| 
 | |
|               complete($.extend(data, {
 | |
|                 events: $.map(events, function(event) {
 | |
|                   return {
 | |
|                     date: event.created.substr(5, 2) +
 | |
|                       '/' + event.created.substr(8, 2) +
 | |
|                       '/' + event.created.substr(2, 2),
 | |
|                     desc: event.description
 | |
|                   };
 | |
|                 })
 | |
|               }));
 | |
|             }
 | |
|           });
 | |
|         }
 | |
|       };
 | |
| 
 | |
|       var complete = function(data) {
 | |
|         args.response.success({
 | |
|           data: data
 | |
|         });
 | |
|       };
 | |
| 
 | |
|       dataFns.instances();
 | |
|     },
 | |
| 
 | |
|     add: function(args) {
 | |
|       setTimeout(function() {
 | |
|         $.ajax({
 | |
|           url: createURL('createProject', { ignoreProject: true }),
 | |
|           data: {
 | |
|             account: args.context.users[0].account,
 | |
|             domainId: args.context.users[0].domainid,
 | |
|             name: args.data['project-name'],
 | |
|             displayText: args.data['project-display-text']
 | |
|           },
 | |
|           dataType: 'json',
 | |
|           async: true,
 | |
|           success: function(data) {
 | |
|             args.response.success({
 | |
|               data: {
 | |
|                 id: data.createprojectresponse.id,
 | |
|                 name: args.data['project-name'],
 | |
|                 displayText: args.data['project-display-text'],
 | |
|                 users: []
 | |
|               }
 | |
|             });
 | |
|           },
 | |
|           error: function(json) {
 | |
|             args.response.error(parseXMLHttpResponse(json));
 | |
|           }
 | |
|         });
 | |
|       }, 100);
 | |
|     },
 | |
|     inviteForm: {
 | |
|       noSelect: true,
 | |
|       noHeaderActionsColumn: true,
 | |
|       ignoreEmptyFields: true,
 | |
|       fields: {
 | |
|         'email': { edit: true, label: 'label.email' },
 | |
|         'account': { edit: true, label: 'label.account' },
 | |
|         'state': { edit: 'ignore', label: 'label.status' },
 | |
|         'add-user': { addButton: true, label: '' }
 | |
|       },
 | |
|       add: {
 | |
|         label: 'label.invite',
 | |
|         action: function(args) {
 | |
|           $.ajax({
 | |
|             url: createURL('addAccountToProject', { ignoreProject: true }),
 | |
|             data: {
 | |
|               projectId: args.context.projects[0].id,
 | |
|               account: args.data.account,
 | |
|               email: args.data.email
 | |
|             },
 | |
|             dataType: 'json',
 | |
|             async: true,
 | |
|             success: function(data) {
 | |
|               data: args.data,
 | |
|               args.response.success({
 | |
|                 _custom: {
 | |
|                   jobId: data.addaccounttoprojectresponse.jobid
 | |
|                 },
 | |
|                 notification: {
 | |
|                   label: 'label.project.invite',
 | |
|                   poll: pollAsyncJobResult
 | |
|                 }
 | |
|               });
 | |
|             },
 | |
|             error: function(json) {
 | |
|               args.response.error(parseXMLHttpResponse(json));
 | |
|             }
 | |
|           });
 | |
|         }
 | |
|       },
 | |
|       actionPreFilter: function(args) {
 | |
|         if (args.context.projects &&
 | |
|             args.context.projects[0] &&
 | |
|             !args.context.projects[0].isNew) {
 | |
|           return args.context.actions;
 | |
|         }
 | |
| 
 | |
|         return ['destroy'];
 | |
|       },
 | |
| 
 | |
|       actions: {
 | |
|         destroy: {
 | |
|           label: 'label.revoke.project.invite',
 | |
|           action: function(args) {
 | |
|             $.ajax({
 | |
|               url: createURL('deleteProjectInvitation'),
 | |
|               data: {
 | |
|                 id: args.context.multiRule[0].id
 | |
|               },
 | |
|               success: function(data) {
 | |
|                 args.response.success({
 | |
|                   _custom: { jobId: data.deleteprojectinvitationresponse.jobid },
 | |
|                   notification: {
 | |
|                     label: 'label.revoke.project.invite',
 | |
|                     poll: pollAsyncJobResult
 | |
|                   }
 | |
|                 });
 | |
|               }
 | |
|             });
 | |
|           }
 | |
|         }
 | |
|       },
 | |
| 
 | |
|       // Project users data provider
 | |
|       dataProvider: function(args) {
 | |
|         $.ajax({
 | |
|           url: createURL('listProjectInvitations', { ignoreProject: true }),
 | |
|           data: {
 | |
|             state: 'Pending',
 | |
|             listAll: true,
 | |
|             projectId: args.context.projects[0].id
 | |
|           },
 | |
|           dataType: 'json',
 | |
|           async: true,
 | |
|           success: function(data) {
 | |
|             var invites = data.listprojectinvitationsresponse.projectinvitation ?
 | |
|               data.listprojectinvitationsresponse.projectinvitation : [];
 | |
|             args.response.success({
 | |
|               data: $.map(invites, function(elem) {
 | |
|                 return {
 | |
|                   id: elem.id,
 | |
|                   account: elem.account,
 | |
|                   email: elem.email,
 | |
|                   state: elem.state
 | |
|                 };
 | |
|               })
 | |
|             });
 | |
|           }
 | |
|         });
 | |
|       }
 | |
|     },
 | |
|     addUserForm: {
 | |
|       noSelect: true,
 | |
|       hideForm: function() {
 | |
|         return g_capabilities.projectinviterequired;
 | |
|       },
 | |
|       fields: {
 | |
|         'username': { edit: true, label: 'label.account' },
 | |
|         'role': { edit: 'ignore', label: 'label.role' },
 | |
|         'add-user': { addButton: true, label: '' }
 | |
|       },
 | |
|       add: {
 | |
|         label: 'label.add.account',
 | |
|         action: function(args) {
 | |
|           $.ajax({
 | |
|             url: createURL('addAccountToProject', { ignoreProject: true }),
 | |
|             data: {
 | |
|               projectId: args.context.projects[0].id,
 | |
|               account: args.data.username
 | |
|             },
 | |
|             dataType: 'json',
 | |
|             async: true,
 | |
|             success: function(data) {
 | |
|               args.response.success({
 | |
|                 _custom: {
 | |
|                   jobId: data.addaccounttoprojectresponse.jobid
 | |
|                 },
 | |
|                 notification: {
 | |
|                   label: 'label.add.account.to.project',
 | |
|                   poll: pollAsyncJobResult
 | |
|                 }
 | |
|               });
 | |
| 
 | |
|               if (g_capabilities.projectinviterequired) {
 | |
|                 cloudStack.dialog.notice({ message: 'message.project.invite.sent' });
 | |
|               }
 | |
|             }
 | |
|           });
 | |
|         }
 | |
|       },
 | |
|       actionPreFilter: function(args) {
 | |
|         if (!args.context.projects &&
 | |
|             args.context.multiRule[0].role != 'Admin') { // This is for the new project wizard
 | |
|             return ['destroy'];
 | |
|         }
 | |
| 
 | |
|         if (args.context.multiRule[0].role != 'Admin' &&
 | |
|             (cloudStack.context.users[0].account == getProjectAdmin || isAdmin() || isDomainAdmin())) { // This is for the new project wizard: check if current logged in User is the Project Owner
 | |
|           return args.context.actions;
 | |
|         }
 | |
| 
 | |
|         return [];
 | |
|       },
 | |
|       readOnlyCheck: function(args) { // check if current logged in User is the Project Owner
 | |
|         if (isAdmin() || isDomainAdmin())
 | |
|             return true;
 | |
| 
 | |
|         var projectOwner, currentUser = cloudStack.context.users[0].account;
 | |
|         $(args.data).each(function() {
 | |
|             var data = this;
 | |
|             if (data.role == 'Admin')
 | |
|                 projectOwner = data.username;
 | |
|         });
 | |
|         if (projectOwner == currentUser)
 | |
|             return true;
 | |
| 
 | |
|         return false;
 | |
|       },
 | |
|       actions: {
 | |
|         destroy: {
 | |
|           label: 'label.remove.project.account',
 | |
|           action: function(args) {
 | |
|             $.ajax({
 | |
|               url: createURL('deleteAccountFromProject', { ignoreProject: true }),
 | |
|               data: {
 | |
|                 projectId: args.context.projects[0].id,
 | |
|                 account: args.context.multiRule[0].username
 | |
|               },
 | |
|               dataType: 'json',
 | |
|               async: true,
 | |
|               success: function(data) {
 | |
|                 args.response.success({
 | |
|                   _custom: {
 | |
|                     jobId: data.deleteaccountfromprojectresponse.jobid
 | |
|                   },
 | |
|                   notification: {
 | |
|                     label: 'label.remove.project.account',
 | |
|                     poll: pollAsyncJobResult
 | |
|                   }
 | |
|                 });
 | |
|               },
 | |
|               error: function(data) {
 | |
|                 args.response.error('Could not remove user');
 | |
|               }
 | |
|             });
 | |
|           }
 | |
|         },
 | |
| 
 | |
|         makeOwner: {
 | |
|           label: 'label.make.project.owner',
 | |
|           action: function(args) {
 | |
|             $.ajax({
 | |
|               url: createURL('updateProject', { ignoreProject: true }),
 | |
|               data: {
 | |
|                 id: args.context.projects[0].id,
 | |
|                 account: args.context.multiRule[0].username
 | |
|               },
 | |
|               dataType: 'json',
 | |
|               async: true,
 | |
|               success: function(data) {
 | |
|                 args.response.success({
 | |
|                   _custom: {
 | |
|                     jobId: data.updateprojectresponse.jobid,
 | |
|                     onComplete: function(){
 | |
|                       setTimeout(function() {
 | |
|                         $(window).trigger('cloudStack.fullRefresh');
 | |
|                         if (isUser()) {
 | |
|                           $(window).trigger('cloudStack.detailsRefresh');
 | |
|                         }
 | |
|                       }, 500);
 | |
|                     }
 | |
|                   },
 | |
|                   notification: {
 | |
|                     label: 'label.make.project.owner',
 | |
|                     poll: pollAsyncJobResult
 | |
|                   }
 | |
|                 });
 | |
|               }
 | |
|             });
 | |
|           }
 | |
|         }
 | |
|       },
 | |
| 
 | |
|       // Project users data provider
 | |
|       dataProvider: function(args) {
 | |
|         $.ajax({
 | |
|           url: createURL('listProjectAccounts', { ignoreProject: true }),
 | |
|           data: {
 | |
|             projectId: args.context.projects[0].id
 | |
|           },
 | |
|           dataType: 'json',
 | |
|           async: true,
 | |
|           success: function(data) {
 | |
|             args.response.success({
 | |
|               data: $.map(data.listprojectaccountsresponse.projectaccount, function(elem) {
 | |
|                 if (elem.role == 'Owner' || elem.role == 'Admin')
 | |
|                   getProjectAdmin = elem.account;
 | |
|                 return {
 | |
|                   id: elem.accountid,
 | |
|                   role: elem.role,
 | |
|                   username: elem.role == 'Owner' ?
 | |
|                     elem.account + ' (owner)' : elem.account
 | |
|                 };
 | |
|               })
 | |
|             });
 | |
|           }
 | |
|         });
 | |
|       }
 | |
|     },
 | |
| 
 | |
|     // Project listing data provider
 | |
|     dataProvider: function(args) {
 | |
|       var user = args.context.users[0];
 | |
|       var data = {
 | |
|         accountId: user.userid,
 | |
|         listAll: true
 | |
|       };
 | |
| 
 | |
|       if (args.projectName) {
 | |
|         data.keyword = args.projectName;
 | |
|       }
 | |
| 
 | |
|       $.ajax({
 | |
|         url: createURL('listProjects', { ignoreProject: true }),
 | |
|         data: data,
 | |
|         dataType: 'json',
 | |
|         async: true,
 | |
|         success: function(data) {
 | |
|           args.response.success({
 | |
|             data: $.map(
 | |
|               data.listprojectsresponse.project ?
 | |
|                 data.listprojectsresponse.project : [],
 | |
|               function(elem) {
 | |
|                 return $.extend(elem, {
 | |
|                   displayText: elem.displaytext
 | |
|                 });
 | |
|               })
 | |
|           });
 | |
|         }
 | |
|       });
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   cloudStack.sections.projects = {
 | |
|     title: 'label.projects',
 | |
|     id: 'projects',
 | |
|     sectionSelect: {
 | |
|       label: 'label.select-view'
 | |
|     },
 | |
|     sections: {
 | |
|       projects: {
 | |
|         type: 'select',
 | |
|         id: 'projects',
 | |
|         title: 'label.projects',
 | |
|         listView: {
 | |
|           fields: {
 | |
|             name: { label: 'label.name' },
 | |
|             displaytext: { label: 'label.display.name' },
 | |
|             domain: { label: 'label.domain' },
 | |
|             account: { label: 'label.owner.account' },
 | |
|             state: {              
 | |
|               label: 'label.status', 
 | |
| 							indicator: {                
 | |
|                 'Active': 'on', 
 | |
| 								'Destroyed': 'off', 
 | |
| 								'Disabled': 'off', 
 | |
| 								'Left Project': 'off'
 | |
|               }
 | |
|             }
 | |
|           },
 | |
| 
 | |
| 					advSearchFields: {
 | |
| 					  name: { label: 'label.name' },						
 | |
|             displaytext: { label: 'label.display.text' },
 | |
| 						
 | |
| 						domainid: {					
 | |
| 							label: 'Domain',					
 | |
| 							select: function(args) {
 | |
| 								if(isAdmin() || isDomainAdmin()) {
 | |
| 									$.ajax({
 | |
| 										url: createURL('listDomains'),
 | |
| 										data: { 
 | |
| 											listAll: true,
 | |
| 											details: 'min'
 | |
| 										},
 | |
| 										success: function(json) {
 | |
| 											var array1 = [{id: '', description: ''}];
 | |
| 											var domains = json.listdomainsresponse.domain;
 | |
| 											if(domains != null && domains.length > 0) {
 | |
| 												for(var i = 0; i < domains.length; i++) {
 | |
| 													array1.push({id: domains[i].id, description: domains[i].path});
 | |
| 												}
 | |
| 											}
 | |
| 											args.response.success({
 | |
| 												data: array1
 | |
| 											});
 | |
| 										}
 | |
| 									});
 | |
| 								}
 | |
| 								else {
 | |
| 									args.response.success({
 | |
| 										data: null
 | |
| 									});
 | |
| 								}
 | |
| 							},
 | |
| 							isHidden: function(args) {
 | |
| 								if(isAdmin() || isDomainAdmin())
 | |
| 									return false;
 | |
| 								else
 | |
| 									return true;
 | |
| 							}
 | |
| 						},		
 | |
| 						
 | |
| 						account: { 
 | |
| 							label: 'Account',
 | |
| 							isHidden: function(args) {
 | |
| 								if(isAdmin() || isDomainAdmin())
 | |
| 									return false;
 | |
| 								else
 | |
| 									return true;
 | |
| 							}			
 | |
| 						}			
 | |
| 					},
 | |
| 					
 | |
|           dataProvider: function(args) {
 | |
|             var data = {};
 | |
| 						listViewDataProvider(args, data);						
 | |
|            
 | |
|             if (isDomainAdmin()) {
 | |
| 						  $.extend(data, {
 | |
| 							  domainid: args.context.users[0].domainid
 | |
| 							});
 | |
|             }
 | |
|             
 | |
|             $.ajax({
 | |
|               url: createURL('listProjects', { ignoreProject: true }),
 | |
|               data: data,          
 | |
|               success: function(data) {
 | |
|                 args.response.success({
 | |
|                   data: data.listprojectsresponse.project,
 | |
|                   actionFilter: projectsActionFilter
 | |
|                 });
 | |
|               }
 | |
|             });
 | |
|           },
 | |
| 
 | |
|           actions: {
 | |
|             add: {
 | |
|               label: 'label.new.project',
 | |
|               action: {
 | |
|                 custom: function(args) {
 | |
|                   $(window).trigger('cloudStack.newProject');
 | |
|                 }
 | |
|               }
 | |
|             }
 | |
|           },
 | |
| 
 | |
|           detailView: {
 | |
|             updateContext: function (args) {
 | |
|               var project;
 | |
|               var projectID = args.context.projects[0].id;
 | |
|               var url = 'listProjects';
 | |
|               if (isDomainAdmin()) {
 | |
|                 url += '&domainid=' + args.context.users[0].domainid;
 | |
|               }
 | |
|               $.ajax({
 | |
|                 url: createURL(url),
 | |
|                 data: {
 | |
|                   listAll: true,
 | |
|                   id: projectID
 | |
|                 },
 | |
|                 async: false,
 | |
|                 success: function(json) {
 | |
|                   project = json.listprojectsresponse.project[0]; // override project after update owner
 | |
|                 }
 | |
|               });
 | |
|               selectedProjectObj = project;
 | |
| 
 | |
|               return {
 | |
|                 projects: [project]
 | |
|               };
 | |
|             },
 | |
|             actions: {
 | |
|               edit: {
 | |
|                 label: 'label.edit',
 | |
|                 action: function(args) {
 | |
|                   $.ajax({
 | |
|                     url: createURL('updateProject'),
 | |
|                     data: $.extend(true, {}, args.context.projects[0], args.data),
 | |
|                     success: function(json) {
 | |
|                       args.response.success();
 | |
|                     },
 | |
|                     error: function(json) {
 | |
|                       args.response.error(parseXMLHttpResponse(json));
 | |
|                     }
 | |
|                   });
 | |
|                 },
 | |
|                 messages: {
 | |
|                   notification: function(args) { return 'label.edit.project.details'; }
 | |
|                 }
 | |
|               },
 | |
|               disable: {
 | |
|                 label: 'label.suspend.project',
 | |
|                 action: function(args) {
 | |
|                   $.ajax({
 | |
|                     url: createURL('suspendProject'),
 | |
|                     data: {
 | |
|                       id: args.context.projects[0].id
 | |
|                     },
 | |
|                     success: function(json) {
 | |
|                       args.response.success({
 | |
|                         _custom: {
 | |
|                           jobId: json.suspendprojectresponse.jobid,
 | |
|                           getUpdatedItem: function() {
 | |
|                             return { state: 'Suspended' };
 | |
|                           }
 | |
|                         }
 | |
|                       });
 | |
|                     },
 | |
|                     error: function(json) {
 | |
|                       args.response.error(parseXMLHttpResponse(json));
 | |
|                     }
 | |
|                   });
 | |
|                 },
 | |
|                 messages: {
 | |
|                   confirm: function() { return 'message.suspend.project'; },
 | |
|                   notification: function() { return 'label.suspend.project'; }
 | |
|                 },
 | |
|                 notification: { poll: pollAsyncJobResult }
 | |
|               },
 | |
| 
 | |
|               enable: {
 | |
|                 label: 'label.activate.project',
 | |
|                 action: function(args) {
 | |
|                   $.ajax({
 | |
|                     url: createURL('activateProject'),
 | |
|                     data: {
 | |
|                       id: args.context.projects[0].id
 | |
|                     },
 | |
|                     success: function(json) {
 | |
|                       args.response.success({
 | |
|                         _custom: {
 | |
|                           jobId: json.activaterojectresponse.jobid, // NOTE: typo
 | |
|                           getUpdatedItem: function() {
 | |
|                             return { state: 'Active' };
 | |
|                           }
 | |
|                         }
 | |
|                       });
 | |
|                     },
 | |
|                     error: function(json) {
 | |
|                       args.response.error(parseXMLHttpResponse(json));
 | |
|                     }
 | |
|                   });
 | |
|                 },
 | |
|                 messages: {
 | |
|                   confirm: function() { return 'message.activate.project'; },
 | |
|                   notification: function() { return 'label.activate.project'; }
 | |
|                 },
 | |
|                 notification: { poll: pollAsyncJobResult }
 | |
|               },
 | |
| 
 | |
|               remove: {
 | |
|                 label: 'label.delete.project',
 | |
|                 action: function(args) {
 | |
|                   $.ajax({
 | |
|                     url: createURL('deleteProject', { ignoreProject: true }),
 | |
|                     data: {
 | |
|                       id: args.data.id
 | |
|                     },
 | |
|                     dataType: 'json',
 | |
|                     async: true,
 | |
|                     success: function(data) {
 | |
|                       args.response.success({
 | |
|                         _custom: {
 | |
|                           getUpdatedItem: function(data) {
 | |
|                             return $.extend(data, { state: 'Destroyed' });
 | |
|                           },
 | |
|                           getActionFilter: function(args) {
 | |
|                             return function() {
 | |
|                               return [];
 | |
|                             };
 | |
|                           },
 | |
|                           jobId: data.deleteprojectresponse.jobid
 | |
|                         }
 | |
|                       });
 | |
|                     }
 | |
|                   });
 | |
|                 },
 | |
| 
 | |
|                 messages: {
 | |
|                   confirm: function(args) {
 | |
|                     return 'message.delete.project';
 | |
|                   },
 | |
|                   notification: function(args) {
 | |
|                     return 'label.delete.project';
 | |
|                   }
 | |
|                 },
 | |
| 
 | |
|                 notification: {
 | |
|                   poll: pollAsyncJobResult
 | |
|                 }
 | |
|               }
 | |
|             },
 | |
| 
 | |
|             tabFilter: function(args) {
 | |
|               var project = selectedProjectObj;
 | |
|               var projectOwner = project.account;
 | |
|               var currentAccount = args.context.users[0].account;
 | |
|               var hiddenTabs = [];
 | |
| 
 | |
|               if (!isAdmin() && !isDomainAdmin()) {
 | |
|                 hiddenTabs.push('resources');
 | |
| 
 | |
|                 if (currentAccount != projectOwner) {
 | |
|                   hiddenTabs.push('accounts');
 | |
|                   hiddenTabs.push('invitations');
 | |
|                 }
 | |
|               }
 | |
| 
 | |
|               if (!cloudStack.projects.requireInvitation()) {
 | |
|                 hiddenTabs.push('invitations');
 | |
|               }
 | |
| 
 | |
|               return hiddenTabs;
 | |
|             },
 | |
|             tabs: {
 | |
|               details: {
 | |
|                 title: 'label.details',
 | |
|                 fields: [
 | |
|                   {
 | |
|                     name: { label: 'label.name' }
 | |
|                   },
 | |
|                   {
 | |
|                     displaytext: { label: 'label.display.name', isEditable: true },
 | |
|                     domain: { label: 'label.domain' },
 | |
|                     account: { label: 'label.account'},
 | |
|                     state: { label: 'label.state' }
 | |
|                   }
 | |
|                 ],
 | |
| 
 | |
|                 tags: cloudStack.api.tags({ resourceType: 'Project', contextId: 'projects' }),
 | |
| 
 | |
|                 dataProvider: function(args) {
 | |
|                   var projectID = args.context.projects[0].id;
 | |
| 
 | |
|                   var url = 'listProjects';
 | |
|                   
 | |
|                   if (isDomainAdmin()) {
 | |
|                     url += '&domainid=' + args.context.users[0].domainid;
 | |
|                   }                  
 | |
|                   $.ajax({
 | |
|                     url: createURL(url),
 | |
|                     data: {
 | |
|                       listAll: true,
 | |
|                       id: projectID
 | |
|                     },
 | |
|                     success: function(json) {
 | |
|                       args.response.success({
 | |
|                         data: json.listprojectsresponse.project ?
 | |
|                           json.listprojectsresponse.project[0] : {},
 | |
|                         actionFilter: projectsActionFilter
 | |
|                       });
 | |
|                     }
 | |
|                   });
 | |
|                 }
 | |
|               },
 | |
| 
 | |
|               accounts: {
 | |
|                 title: 'label.accounts',
 | |
|                 custom: function(args) {
 | |
|                   var project = args.context.projects[0];
 | |
|                   var multiEditArgs = $.extend(
 | |
|                     true, {},
 | |
|                     cloudStack.projects.addUserForm,
 | |
|                     {
 | |
|                       context: { projects: [project] }
 | |
|                     }
 | |
|                   );
 | |
|                   var $users = $('<div>').multiEdit(multiEditArgs);
 | |
|                   
 | |
|                   return $users;
 | |
|                 }
 | |
|               },
 | |
| 
 | |
|               invitations: {
 | |
|                 title: 'label.invitations',
 | |
|                 custom: function(args) {
 | |
|                   var project = args.context.projects[0];
 | |
|                   var $invites = cloudStack.uiCustom.projectsTabs.userManagement({
 | |
|                     useInvites: true,
 | |
|                     context: { projects: [project] }
 | |
|                   });
 | |
|                   
 | |
|                   return $invites;
 | |
|                 }
 | |
|               },
 | |
| 
 | |
|               resources: {
 | |
|                 title: 'label.resources',
 | |
|                 custom: function(args) {
 | |
|                   var $resources = cloudStack.uiCustom
 | |
|                     .projectsTabs.dashboardTabs.resources({
 | |
|                       projectID: args.context.projects[0].id
 | |
|                   });
 | |
| 
 | |
|                   return $('<div>').addClass('project-dashboard').append($resources);
 | |
|                 }
 | |
|               }
 | |
|             }
 | |
|           }
 | |
|         }
 | |
|       },
 | |
| 
 | |
|       invitations: {
 | |
|         type: 'select',
 | |
|         id: 'invitations',
 | |
|         title: 'label.invitations',
 | |
|         listView: {
 | |
|           fields: {
 | |
|             project: { label: 'label.project' },
 | |
|             domain: { label: 'label.domain' },
 | |
|             state: {
 | |
|               label: 'label.status',              
 | |
|               indicator: {
 | |
|                 'Accepted': 'on', 'Completed': 'on',
 | |
|                 'Pending': 'off', 'Declined': 'off'
 | |
|               }
 | |
|             }
 | |
|           },
 | |
| 
 | |
|           dataProvider: function(args) {
 | |
|             $.ajax({
 | |
|               url: createURL('listProjectInvitations'),
 | |
|               data: {
 | |
|                 state: 'Pending'
 | |
|               },
 | |
|               success: function(data) {
 | |
|                 args.response.success({
 | |
|                   actionFilter: projectInvitationActionFilter,
 | |
|                   data: data.listprojectinvitationsresponse.projectinvitation ?
 | |
|                     data.listprojectinvitationsresponse.projectinvitation : []
 | |
|                 });
 | |
|               }
 | |
|             });
 | |
|           },
 | |
| 
 | |
|           actions: {
 | |
|             enterToken: {
 | |
|               label: 'label.enter.token',
 | |
|               isHeader: true,
 | |
|               addRow: false,
 | |
|               preFilter: function(args) {
 | |
|                 var invitationsPresent = false;
 | |
|                 
 | |
|                 $.ajax({
 | |
|                   url: createURL('listProjectInvitations'),
 | |
|                   data: { state: 'Pending' },
 | |
|                   async: false,
 | |
|                   success: function(json) {
 | |
|                     if (json.listprojectinvitationsresponse.count) {
 | |
|                       invitationsPresent = true;
 | |
|                     }
 | |
|                   }
 | |
|                 });
 | |
| 
 | |
|                 return !invitationsPresent;
 | |
|               },
 | |
|               createForm: {
 | |
|                 desc: 'message.enter.token',
 | |
|                 fields: {
 | |
|                   projectid: { label: 'label.project.id', validation: { required: true}, docID: 'helpEnterTokenProjectID' },
 | |
|                   token: { label: 'label.token', docID: 'helpEnterTokenToken', validation: { required: true }}
 | |
|                 }
 | |
|               },
 | |
|               action: function(args) {
 | |
|                 $.ajax({
 | |
|                   url: createURL('updateProjectInvitation'),
 | |
|                   data: args.data,
 | |
|                   success: function(json) {
 | |
|                     args.response.success({
 | |
|                       _custom: {
 | |
|                         jobId: json.updateprojectinvitationresponse.jobid
 | |
|                       }
 | |
|                     });
 | |
|                   },
 | |
|                   error: function(json) {
 | |
|                     args.response.error(parseXMLHttpResponse(json));
 | |
|                   }
 | |
|                 });
 | |
|               },
 | |
|               messages: {
 | |
|                 notification: function() {
 | |
|                   return 'label.accept.project.invitation';
 | |
|                 },
 | |
|                 complete: function() {
 | |
|                   return 'message.join.project';
 | |
|                 }
 | |
|               },
 | |
|               notification: { poll: pollAsyncJobResult }
 | |
|             },
 | |
|             
 | |
|             accept: {
 | |
|               label: 'label.accept.project.invitation',
 | |
|               action: function(args) {
 | |
|                 $.ajax({
 | |
|                   url: createURL('updateProjectInvitation'),
 | |
|                   data: {
 | |
|                     projectid: args.context.invitations[0].projectid,
 | |
|                     account: args.context.users[0].account,
 | |
|                     domainid: args.context.users[0].domainid,
 | |
|                     accept: true
 | |
|                   },
 | |
|                   success: function(data) {
 | |
|                     args.response.success({
 | |
|                       _custom: {
 | |
|                         jobId: data.updateprojectinvitationresponse.jobid,
 | |
|                         getUpdatedItem: function() { return { state: 'Accepted' }; }
 | |
|                       }
 | |
|                     });
 | |
|                   }
 | |
|                 });
 | |
|               },
 | |
|               messages: {
 | |
|                 confirm: function() { return 'message.confirm.join.project'; },
 | |
|                 notification: function() { return 'label.accept.project.invitation'; }
 | |
|               },
 | |
|               notification: { poll: pollAsyncJobResult }
 | |
|             },
 | |
| 
 | |
|             decline: {
 | |
|               label: 'label.decline.invitation',
 | |
|               action: function(args) {
 | |
|                 $.ajax({
 | |
|                   url: createURL('updateProjectInvitation'),
 | |
|                   data: {
 | |
|                     projectid: args.context.invitations[0].projectid,
 | |
|                     account: args.context.users[0].account,
 | |
|                     accept: false
 | |
|                   },
 | |
| 
 | |
|                   success: function(data) {
 | |
|                     args.response.success({
 | |
|                       _custom: {
 | |
|                         jobId: data.updateprojectinvitationresponse.jobid,
 | |
|                         getUpdatedItem: function() { return { state: 'Declined' }; }
 | |
|                       }
 | |
|                     });
 | |
|                   }
 | |
|                 });
 | |
|               },
 | |
|               notification: { poll: pollAsyncJobResult },
 | |
|               messages: {
 | |
|                 confirm: function() { return 'message.decline.invitation'; },
 | |
|                 notification: function() { return 'label.decline.invitation'; }
 | |
|               }
 | |
|             }
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   var projectsActionFilter = function(args) {
 | |
|     var allowedActions = ['remove', 'edit'];
 | |
| 
 | |
|     if (args.context.item.account == cloudStack.context.users[0].account ||
 | |
|         isAdmin() || isDomainAdmin()) {
 | |
|       if (args.context.item.state == 'Suspended') {
 | |
|         allowedActions.push('enable');
 | |
|       } else if (args.context.item.state == 'Active') {
 | |
|         allowedActions.push('disable');
 | |
|       }
 | |
| 
 | |
|       return allowedActions;
 | |
|     }
 | |
| 
 | |
|     return [];
 | |
|   };
 | |
| 
 | |
|   var projectInvitationActionFilter = function(args) {
 | |
|     var state = args.context.item.state;
 | |
| 
 | |
|     if (state == 'Accepted' || state == 'Completed' || state == 'Declined') {
 | |
|       return [];
 | |
|     }
 | |
| 
 | |
|     return ['accept', 'decline'];
 | |
|   };
 | |
| } (cloudStack));
 |