| // 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 != 12; |
| } |
| ); |
| |
| 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' |
| }, |
| 8: { |
| id: 'cpu', |
| label: 'label.max.cpus' |
| }, |
| 9: { |
| id: 'memory', |
| label: 'label.max.memory' |
| }, |
| 10: { |
| id: 'primary_storage', |
| label: 'label.max.primary.storage' |
| }, |
| 11: { |
| id: 'secondary_storage', |
| label: 'label.max.secondary.storage' |
| } |
| }; |
| |
| 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 data1 = { |
| accountId: user.userid, |
| listAll: true |
| }; |
| if (args.projectName) { |
| data1.keyword = args.projectName; |
| } |
| |
| var array1 = []; |
| var page = 1; |
| var getNextPage = function() { |
| var data2 = $.extend({}, data1, { |
| page: page, |
| pageSize: 500 |
| }); |
| |
| $.ajax({ |
| url: createURL('listProjects', { |
| ignoreProject: true |
| }), |
| data: data2, |
| async: false, |
| success: function(json) { |
| var projects = json.listprojectsresponse.project; |
| if (projects != undefined) { |
| for(var i = 0; i < projects.length; i++) { |
| array1.push($.extend(projects[i], { |
| displayText: projects[i].displaytext |
| })); |
| } |
| } |
| if (array1.length < json.listprojectsresponse.count) { |
| page++; |
| getNextPage(); |
| } |
| } |
| }); |
| } |
| getNextPage(); |
| args.response.success({ data: array1 }); |
| } |
| }; |
| |
| 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: '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 |
| }); |
| } |
| } |
| array1.sort(function(a, b) { |
| return a.description.localeCompare(b.description); |
| }); |
| args.response.success({ |
| data: array1 |
| }); |
| } |
| }); |
| } else { |
| args.response.success({ |
| data: null |
| }); |
| } |
| }, |
| isHidden: function(args) { |
| if (isAdmin() || isDomainAdmin()) |
| return false; |
| else |
| return true; |
| } |
| }, |
| |
| account: { |
| label: '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 |
| }); |
| }, |
| error: function(XMLHttpResponse) { |
| cloudStack.dialog.notice({ |
| message: parseXMLHttpResponse(XMLHttpResponse) |
| }); |
| args.response.error(); |
| } |
| }); |
| }, |
| |
| 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' |
| }); |
| }, |
| onComplete: function(data) { |
| $(window).trigger('cloudStack.deleteProject', args); |
| }, |
| 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 |
| }, |
| id: { |
| label: 'label.id' |
| }, |
| domain: { |
| label: 'label.domain' |
| }, |
| account: { |
| label: 'label.account' |
| }, |
| state: { |
| label: 'label.state' |
| } |
| }, { |
| vmtotal: { |
| label: 'label.total.vms' |
| }, |
| memorytotal: { |
| label: 'label.memory.total' |
| }, |
| cputotal: { |
| label: 'label.total.cpu' |
| }, |
| volumetotal: { |
| label: 'label.volume' |
| }, |
| primarystoragetotal: { |
| label: 'label.primary.storage' |
| }, |
| iptotal: { |
| label: 'label.total.of.ip' |
| }, |
| templatetotal: { |
| label: 'label.template' |
| } |
| }], |
| |
| 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)); |