diff --git a/awx/ui/static/js/controllers/Inventories.js b/awx/ui/static/js/controllers/Inventories.js index 5176b173b9..1939aa3c67 100644 --- a/awx/ui/static/js/controllers/Inventories.js +++ b/awx/ui/static/js/controllers/Inventories.js @@ -185,7 +185,7 @@ function InventoriesEdit ($scope, $rootScope, $compile, $location, $log, $routeP RelatedPaginateInit, ReturnToCaller, ClearScope, LookUpInit, Prompt, OrganizationList, TreeInit, GetBasePath, GroupsList, GroupsAdd, GroupsEdit, LoadInventory, GroupsDelete, HostsList, HostsAdd, HostsEdit, HostsDelete, RefreshGroupName, ParseTypeChange, - HostsReload) + HostsReload, EditInventory) { ClearScope('htmlTemplate'); //Garbage collection. Don't leave behind any listeners/watchers from the prior //scope. @@ -242,8 +242,8 @@ function InventoriesEdit ($scope, $rootScope, $compile, $location, $log, $routeP scope.inventory_variables = "---"; } }); - - LoadInventory({ scope: scope }); + + LoadInventory({ scope: scope, doPostSteps: true }); scope.filterInventory = function() { RefreshTree({ scope: scope }); @@ -347,6 +347,10 @@ function InventoriesEdit ($scope, $rootScope, $compile, $location, $log, $routeP $location.path('/' + base + '/' + $routeParams.id + '/' + set + '/' + id); }; + scope.editInventory = function() { + EditInventory({ scope: scope, 'inventory_id': scope['inventory_id'] }); + }; + // Related set: Delete button scope['delete'] = function(set, itm_id, name, title) { $rootScope.flashMessage = null; @@ -384,7 +388,7 @@ function InventoriesEdit ($scope, $rootScope, $compile, $location, $log, $routeP if (!scope.$$phase) { scope.$digest(); } - InventoryEdit({ "inventory_id": id, group_id: null }); + EditInventory({ scope: scope, "inventory_id": id }); } }, addGroup: { @@ -542,6 +546,6 @@ InventoriesEdit.$inject = [ '$scope', '$rootScope', '$compile', '$location', '$l 'RelatedPaginateInit', 'ReturnToCaller', 'ClearScope', 'LookUpInit', 'Prompt', 'OrganizationList', 'TreeInit', 'GetBasePath', 'GroupsList', 'GroupsAdd', 'GroupsEdit', 'LoadInventory', 'GroupsDelete', 'HostsList', 'HostsAdd', 'HostsEdit', 'HostsDelete', 'RefreshGroupName', - 'ParseTypeChange', 'HostsReload' + 'ParseTypeChange', 'HostsReload', 'EditInventory' ]; diff --git a/awx/ui/static/js/forms/Inventories.js b/awx/ui/static/js/forms/Inventories.js index cd33a00cab..ca93afb5fb 100644 --- a/awx/ui/static/js/forms/Inventories.js +++ b/awx/ui/static/js/forms/Inventories.js @@ -13,12 +13,10 @@ angular.module('InventoryFormDefinition', []) addTitle: 'Create Inventory', editTitle: '{{ inventory_name }}', name: 'inventory', - well: true, - collapse: true, - collapseTitle: 'Edit Inventory', - collapseMode: 'edit', - twoColumns: true, parseTypeName: 'inventoryParseType', + well: false, + formLabelSize: 'col-lg-3', + formFieldSize: 'col-lg-9', fields: { has_active_failures: { @@ -27,8 +25,7 @@ angular.module('InventoryFormDefinition', []) ' Failed jobs', type: 'custom', ngShow: 'has_active_failures', - readonly: true, - column: 1 + readonly: true }, inventory_name: { realName: 'name', @@ -36,8 +33,7 @@ angular.module('InventoryFormDefinition', []) type: 'text', addRequired: true, editRequired: true, - capitalize: false, - column: 1 + capitalize: false }, inventory_description: { realName: 'description', @@ -45,7 +41,6 @@ angular.module('InventoryFormDefinition', []) type: 'text', addRequired: false, editRequired: false, - column: 1 }, organization: { label: 'Organization', @@ -55,8 +50,7 @@ angular.module('InventoryFormDefinition', []) addRequired: true, editRequired: true, ngClick: 'lookUpOrganization()', - awRequiredWhen: {variable: "organizationrequired", init: "true" }, - column: 1 + awRequiredWhen: {variable: "organizationrequired", init: "true" } }, inventory_variables: { realName: 'variables', @@ -76,8 +70,7 @@ angular.module('InventoryFormDefinition', []) '
View YAML examples at ansibleworks.com
', dataTitle: 'Inventory Variables', dataPlacement: 'bottom', - dataContainer: "body", - column: 2 + dataContainer: '#form-modal .modal-content' } }, diff --git a/awx/ui/static/js/helpers/inventory.js b/awx/ui/static/js/helpers/inventory.js index 1d61498d0f..523777d820 100644 --- a/awx/ui/static/js/helpers/inventory.js +++ b/awx/ui/static/js/helpers/inventory.js @@ -11,7 +11,7 @@ angular.module('InventoryHelper', [ 'RestServices', 'Utilities', 'OrganizationListDefinition', 'SearchHelper', 'PaginateHelper', 'ListGenerator', 'AuthService', 'InventoryHelper', 'RelatedSearchHelper', 'RelatedPaginateHelper', - 'InventoryFormDefinition' + 'InventoryFormDefinition', 'ParseHelper' ]) .factory('LoadTreeData', ['Alert', 'Rest', 'Authorization', '$http', @@ -227,12 +227,15 @@ angular.module('InventoryHelper', [ 'RestServices', 'Utilities', 'OrganizationLi } } - // Load the tree view scope.TreeParams = { scope: scope, inventory: data }; scope.variable_url = data.related.variable_data; scope.relatedSets['hosts'] = { url: data.related.hosts, iterator: 'host' }; - RelatedSearchInit({ scope: scope, form: form, relatedSets: scope.relatedSets }); - RelatedPaginateInit({ scope: scope, relatedSets: scope.relatedSets }); + + // Load the tree view + if (params.doPostSteps) { + RelatedSearchInit({ scope: scope, form: form, relatedSets: scope.relatedSets }); + RelatedPaginateInit({ scope: scope, relatedSets: scope.relatedSets }); + } scope.$emit('inventoryLoaded'); }) .error( function(data, status, headers, config) { @@ -305,5 +308,76 @@ angular.module('InventoryHelper', [ 'RestServices', 'Utilities', 'OrganizationLi LoadInventory({ scope: scope }); } - }]); + }]) + + + .factory('EditInventory', ['InventoryForm', 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'LookUpInit', 'OrganizationList', + 'GetBasePath', 'ParseTypeChange', 'LoadInventory', + function(InventoryForm, GenerateForm, Rest, Alert, ProcessErrors, LookUpInit, OrganizationList, GetBasePath, ParseTypeChange, + LoadInventory) { + return function(params) { + + var generator = GenerateForm; + var form = InventoryForm; + var defaultUrl=GetBasePath('inventory'); + var scope = params.scope + + generator.inject(form, {mode: 'edit', modal: true, related: false}); + + ParseTypeChange(scope,'inventory_variables', 'inventoryParseType'); + + scope.inventoryParseType = 'yaml'; + scope['inventory_id'] = params['inventory_id']; + scope.formModalActionLabel = 'Save'; + scope.formModalCancelShow = true; + scope.formModalInfo = false; + $('#form-modal .btn-success').removeClass('btn-none').addClass('btn-success'); + scope.formModalHeader = 'Inventory Properties'; + + // Retrieve each related set and any lookups + if (scope.inventoryLoadedRemove) { + scope.inventoryLoadedRemove(); + } + scope.inventoryLoadedRemove = scope.$on('inventoryLoaded', function() { + + LookUpInit({ + scope: scope, + form: form, + current_item: (scope.organization !== undefined) ? scope.organization : null, + list: OrganizationList, + field: 'organization' + }); + + if (scope.variable_url) { + Rest.setUrl(scope.variable_url); + Rest.get() + .success( function(data, status, headers, config) { + if ($.isEmptyObject(data)) { + scope.inventory_variables = "---"; + } + else { + scope.inventory_variables = jsyaml.safeDump(data); + } + }) + .error( function(data, status, headers, config) { + scope.inventory_variables = null; + ProcessErrors(scope, data, status, form, + { hdr: 'Error!', msg: 'Failed to retrieve inventory variables. GET returned status: ' + status }); + }); + } + else { + scope.inventory_variables = "---"; + } + if (!scope.$$phase) { + scope.$digest(); + } + }); + + LoadInventory({ scope: scope, doPostSteps: false }); + + if (!scope.$$phase) { + scope.$digest(); + } + } + }]);