| // 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 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)); |