// 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 apiList = []; var rolePermissions = []; cloudStack.sections.roles = { title: 'label.roles', id: 'roles', listView: { id: 'roles', fields: { name: { label: 'label.name' }, type: { label: 'label.type' }, description: { label: 'label.description' } }, disableInfiniteScrolling: true, dataProvider: function(args) { var data = {}; if (args.filterBy.search && args.filterBy.search.value) { data['name'] = args.filterBy.search.value; } $.ajax({ url: createURL("listRoles"), data: data, dataType: "json", async: true, success: function(json) { var jsonObj; jsonObj = json.listrolesresponse.role; args.response.success({ data: jsonObj }); } }); }, actions: { add: { label: 'label.add.role', preFilter: function(args) { if (isAdmin()) return true; }, messages: { notification: function() { return 'label.add.role'; } }, createForm: { title: 'label.add.role', fields: { name: { label: 'label.name', validation: { required: true } }, description: { label: 'label.description', }, type: { label: 'label.type', validation: { required: true }, select: function(args) { var items = []; items.push({ id: "Admin", description: "Admin" }); items.push({ id: "DomainAdmin", description: "Domain Admin" }); items.push({ id: "User", description: "User" }); args.response.success({ data: items }); } } } }, action: function(args) { $.ajax({ url: createURL('createRole'), data: args.data, success: function(json) { var item = json.createroleresponse.role; args.response.success({ data: item }); }, error: function(json) { args.response.error(parseXMLHttpResponse(json)); } }); }, notification: { poll: function(args) { args.complete(); } } } }, detailView: { tabs: { details: { title: 'label.details', fields: { id: { label: 'label.id' }, name: { label: 'label.name', isEditable: true, validation: { required: true } }, type: { label: 'label.type' }, description: { label: 'label.description', isEditable: true } }, dataProvider: function(args) { $.ajax({ url: createURL("listRoles&id=" + args.context.roles[0].id), dataType: "json", async: true, success: function(json) { var response = json.listrolesresponse.role[0]; args.response.success({ data: response }); } }); } }, rules: { title: 'label.rules', custom: function(args) { var context = args.context; return $('
').multiEdit({ context: context, noSelect: true, noHeaderActionsColumn: true, selectPermission: { action: function(args){ $.ajax({ url: createURL("updateRolePermission"), data: { roleid: args.roleid, ruleid: args.ruleid, permission: args.permission }, dataType: "json", async: true, success: function(json) { $(window).trigger('cloudStack.fullRefresh'); }, error: function(json) { cloudStack.dialog.notice({ message: 'message.role.update.fail' }); } }); } }, reorder: { moveDrag: { action: function(args) { var rule = args.context.multiRule[0]; var prevItemId = args.prevItem ? args.prevItem.id : 0; var ruleOrder = []; $.each(rolePermissions, function(idx, item) { var itemId = item.id; if (idx == 0 && prevItemId == 0) { ruleOrder.push(rule.id); } if (itemId == rule.id) { return true; } ruleOrder.push(item.id); if (prevItemId == itemId) { ruleOrder.push(rule.id); } }); $.ajax({ type: 'POST', url: createURL('updateRolePermission'), data: { roleid: rule.roleid, ruleorder: ruleOrder.join() }, success: function(json) { args.response.success(); $(window).trigger('cloudStack.fullRefresh'); }, error: function(json) { cloudStack.dialog.notice({ message: 'message.role.ordering.fail' }); } }); } } }, fields: { 'rule': { edit: true, label: 'label.rule', isOptional: false }, 'permission': { label: 'label.permission', select: function(args) { args.response.success({ data: [{ name: 'allow', description: 'Allow' }, { name: 'deny', description: 'Deny' }] }); } }, 'description': { edit: true, label: 'label.description', isOptional: true }, 'always-hide': { label: 'label.action', addButton: true } }, add: { label: 'label.add', action: function(args) { var data = { rule: args.data.rule, permission: args.data.permission, description: args.data.description, roleid: args.context.roles[0].id }; $.ajax({ url: createURL('createRolePermission'), data: data, dataType: 'json', success: function(json) { var response = json.createrolepermissionresponse.rolepermission; args.response.success({ data: response }); }, error: function(json) { args.response.error(parseXMLHttpResponse(json)); } }); } }, actions: { destroy: { label: 'label.remove.rule', action: function(args) { $.ajax({ url: createURL('deleteRolePermission'), data: { id: args.context.multiRule[0].id }, dataType: 'json', success: function(data) { args.response.success(); }, error: function(json) { args.response.error(parseXMLHttpResponse(json)); } }); } } }, dataProvider: function(args) { $.ajax({ url: createURL('listRolePermissions'), data: { roleid: args.context.roles[0].id }, dataType: 'json', success: function(json) { var rules = json.listrolepermissionsresponse.rolepermission; if (rules) { rolePermissions = rules; } args.response.success({ data: rules }); } }); var setupAutocompletion = function() { $($.find('input[name="rule"]')).autocomplete("destroy"); $($.find('input[name="rule"]')).autocomplete({ source: apiList, autoFocus:true }); }; if (apiList.length == 0) { $.ajax({ url: createURL("listApis"), dataType: "json", success: function(json) { var response = json.listapisresponse.api; $.each(response, function(idx, api) { apiList.push(api.name); }); setupAutocompletion(); } }); } else { setupAutocompletion(); } } }); } } }, actions: { edit: { label: 'label.edit.role', action: function(args) { var data = { id: args.context.roles[0].id, name: args.data.name, description: args.data.description }; $.ajax({ url: createURL('updateRole'), data: data, success: function(json) { args.response.success(); }, error: function(json) { args.response.error(parseXMLHttpResponse(json)); } }); } }, remove: { label: 'label.delete.role', messages: { confirm: function(args) { return 'label.delete.role'; }, notification: function(args) { return 'label.delete.role'; } }, action: function(args) { $.ajax({ url: createURL("deleteRole&id=" + args.context.roles[0].id), dataType: "json", success: function(json) { var response = json.deleteroleresponse; args.response.success({ data: response }); } }); }, notification: { poll: function(args) { args.complete(); } } } } } } } })(jQuery, cloudStack);