Inventory refactor: lists now uniformly set tool tips placement to 'top'. Fixed an ugly scope bug when using modals that call LookupInit. The callbacks inside search were being left in the inventory scope and fired everytime the host view refreshed. Added a cleanup method in search to remove its callbacks. Calling the cleanup method on modal close fixes.

This commit is contained in:
Chris Houseknecht 2014-01-13 20:55:28 +00:00
parent 6d205213db
commit afb151bf29
19 changed files with 117 additions and 85 deletions

View File

@ -450,8 +450,8 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', '
var inventory_id = params.inventory_id;
var group_id = (params.group_id !== undefined) ? params.group_id : null;
var inventory_scope = params.scope;
var parent_scope = params.scope;
// Inject dynamic view
var defaultUrl = (group_id !== null) ? GetBasePath('groups') + group_id + '/children/' :
GetBasePath('inventory') + inventory_id + '/groups/';
@ -459,14 +459,14 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', '
var generator = GenerateForm;
var scope = generator.inject(form, { mode: 'add', modal: true, related: false, show_modal: false });
var groupCreated = false;
$('#form-modal .btn-none').removeClass('btn-none').addClass('btn-success');
scope.formModalActionLabel = 'Save';
scope.formModalCancelShow = true;
scope.parseType = 'yaml';
scope.source = null;
ParseTypeChange(scope);
$('#form-modal .btn-none').removeClass('btn-none').addClass('btn-success');
generator.reset();
var master={};
@ -475,24 +475,28 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', '
scope.removeAddTreeRefreshed();
}
scope.removeAddTreeRefreshed = scope.$on('GroupTreeRefreshed', function(e) {
$rootScope.formModalHeader = null;
$rootScope.formModalCancleShow= null;
$rootScope.formModalActionLabel = null;
Wait('stop');
$('#form-modal').modal('hide');
scope.removeAddTreeRefreshed();
});
if (scope.removeSaveComplete) {
scope.removeSaveComplete();
scope.removeSaveComplete();
}
scope.removeSaveComplete = scope.$on('SaveComplete', function(e, group_id, error) {
if (!error) {
scope.searchCleanup();
scope.formModalActionDisabled = false;
scope.showGroupHelp = false; //get rid of the Hint
BuildTree({ scope: inventory_scope, inventory_id: inventory_id, refresh: true, new_group_id: group_id });
BuildTree({ scope: parent_scope, inventory_id: inventory_id, refresh: true, new_group_id: group_id });
}
});
if (scope.removeFormSaveSuccess) {
scope.removeFormSaveSuccess();
scope.removeFormSaveSuccess();
}
scope.removeFormSaveSuccess = scope.$on('formSaveSuccess', function(e, group_id, url) {
@ -574,7 +578,13 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', '
scope.$emit('SaveComplete', group_id, false);
}
});
// Cancel
scope.cancelModal = function() {
if (scope.searchCleanup) {
scope.searchCleanup();
}
}
// Save
scope.formModalAction = function() {
@ -637,12 +647,6 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', '
});
}
// Cancel
scope.formReset = function() {
// Defaults
generator.reset();
};
var choicesReady = 0;
if (scope.removeChoicesReady) {
@ -699,7 +703,6 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', '
var form = GroupForm;
var defaultUrl = GetBasePath('groups') + group_id + '/';
var master = {};
var relatedSets = {};
// Load the modal form
var scope = generator.inject(form, { mode: 'edit', modal: true, related: false, show_modal: false });
@ -726,10 +729,6 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', '
scope.groupLoadedRemove();
}
scope.groupLoadedRemove = scope.$on('groupLoaded', function() {
for (var set in relatedSets) {
scope.search(relatedSets[set].iterator);
}
if (scope.variable_url) {
// get group variables
Rest.setUrl(scope.variable_url);
@ -871,12 +870,6 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', '
master[fld] = scope[fld];
}
}
var related = data.related;
for (var set in form.related) {
if (related[set]) {
relatedSets[set] = { url: related[set], iterator: form.related[set].iterator };
}
}
scope.variable_url = data.related.variable_data;
scope.source_url = data.related.inventory_source;
$('#form-modal').modal('show');
@ -926,6 +919,7 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', '
}
scope.removeSaveComplete = scope.$on('SaveComplete', function(e, error) {
if (!error) {
// Update the view with any changes
UpdateGroup({
scope: parent_scope,
group_id: group_id,
@ -935,6 +929,8 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', '
has_inventory_sources: (scope.source) ? true : false
}
});
//Clean up
scope.searchCleanup();
scope.formModalActionDisabled = false;
scope.showGroupHelp = false; //get rid of the Hint
Wait('stop');
@ -1025,6 +1021,13 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', '
}
});
// Cancel
scope.cancelModal = function() {
if (scope.searchCleanup) {
scope.searchCleanup();
}
}
// Save
scope.formModalAction = function() {
Wait('start');
@ -1120,17 +1123,7 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', '
form: GroupForm
});
}
// Cancel
scope.formReset = function() {
generator.reset();
for (var fld in master) {
scope[fld] = master[fld];
}
scope.parseType = 'yaml';
$('#s2id_group_source_regions').select2('data', master['source_regions']);
}
}
}])

View File

@ -38,6 +38,7 @@ angular.module('HostsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', 'H
SearchInit({ scope: scope, set: 'hosts', list: InventoryHosts, url: url });
PaginateInit({ scope: scope, list: InventoryHosts, url: url });
console.log('before call to hosts search')
scope.search(InventoryHosts.iterator);
}
}])

View File

@ -27,11 +27,11 @@ angular.module('LookUpHelper', [ 'RestServices', 'Utilities', 'SearchHelper', 'P
var defaultUrl;
if (params.url) {
// pass in a url value to override the default
defaultUrl = params.url;
// pass in a url value to override the default
defaultUrl = params.url;
}
else {
defaultUrl = (list.name == 'inventories') ? GetBasePath('inventory') : GetBasePath(list.name);
defaultUrl = (list.name == 'inventories') ? GetBasePath('inventory') : GetBasePath(list.name);
}
// Show pop-up
@ -67,15 +67,15 @@ angular.module('LookUpHelper', [ 'RestServices', 'Utilities', 'SearchHelper', 'P
found = true;
scope[field] = listScope[list.name][i].id;
if (scope[form.name + '_form'] && form.fields[field] && form.fields[field].sourceModel) {
scope[form.fields[field].sourceModel + '_' + form.fields[field].sourceField] =
listScope[list.name][i][form.fields[field].sourceField];
scope[form.fields[field].sourceModel + '_' + form.fields[field].sourceField] =
listScope[list.name][i][form.fields[field].sourceField];
if (scope[form.name + '_form'][form.fields[field].sourceModel + '_' + form.fields[field].sourceField]) {
scope[form.name + '_form'][form.fields[field].sourceModel + '_' + form.fields[field].sourceField]
.$setValidity('awlookup',true);
scope[form.name + '_form'][form.fields[field].sourceModel + '_' + form.fields[field].sourceField]
.$setValidity('awlookup',true);
}
}
if (scope[form.name + '_form']) {
scope[form.name + '_form'].$setDirty();
scope[form.name + '_form'].$setDirty();
}
listGenerator.hide();
}
@ -94,12 +94,12 @@ angular.module('LookUpHelper', [ 'RestServices', 'Utilities', 'SearchHelper', 'P
listScope['toggle_' + list.iterator] = function(id) {
for (var i=0; i < scope[list.name].length; i++) {
if (listScope[list.name][i]['id'] == id) {
listScope[list.name][i]['checked'] = '1';
listScope[list.name][i]['success_class'] = 'success';
listScope[list.name][i]['checked'] = '1';
listScope[list.name][i]['success_class'] = 'success';
}
else {
listScope[list.name][i]['checked'] = '0';
listScope[list.name][i]['success_class'] = '';
listScope[list.name][i]['checked'] = '0';
listScope[list.name][i]['success_class'] = '';
}
}
}
@ -114,10 +114,10 @@ angular.module('LookUpHelper', [ 'RestServices', 'Utilities', 'SearchHelper', 'P
listScope.lookupPostRefreshRemove = scope.$on('PostRefresh', function() {
for (var fld in list.fields) {
if (list.fields[fld].type && list.fields[fld].type == 'date') {
//convert dates to our standard format
for (var i=0; i < scope[list.name].length; i++) {
scope[list.name][i][fld] = FormatDate(new Date(scope[list.name][i][fld]));
}
//convert dates to our standard format
for (var i=0; i < scope[list.name].length; i++) {
scope[list.name][i][fld] = FormatDate(new Date(scope[list.name][i][fld]));
}
}
}
// List generator creates the form, resetting it and losing the previously selected value.

View File

@ -22,7 +22,8 @@ angular.module('RefreshHelper', ['RestServices', 'Utilities'])
var set = params.set;
var iterator = params.iterator;
var url = params.url;
console.log('Inside refresh');
console.log(url);
scope.current_url = url;
Rest.setUrl(url);
Rest.get()

View File

@ -525,5 +525,15 @@ angular.module('SearchHelper', ['RestServices', 'Utilities', 'RefreshHelper'])
scope.search(list.iterator);
}
// Call after modal dialogs to remove any lingering callbacks
scope.searchCleanup = function() {
console.log('search cleanup!');
scope.removeDoSearch();
scope.removeFoundObject();
scope.removeResultWarning();
scope.removePrepareSearch();
scope.removePrepareSearch2();
}
}
}]);

View File

@ -59,7 +59,8 @@ angular.module('CloudCredentialsListDefinition', [])
icon: 'fa-edit',
label: 'Edit',
"class": 'btn-sm',
awToolTip: 'View/Edit credential'
awToolTip: 'View/Edit credential',
dataPlacement: 'top'
},
"delete": {
@ -67,7 +68,8 @@ angular.module('CloudCredentialsListDefinition', [])
icon: 'fa-trash-o',
label: 'Delete',
"class": 'btn-sm',
awToolTip: 'Delete credential'
awToolTip: 'Delete credential',
dataPlacement: 'top'
}
}
});

View File

@ -73,7 +73,8 @@ angular.module('CredentialsListDefinition', [])
icon: 'fa-edit',
label: 'Edit',
"class": 'btn-sm',
awToolTip: 'View/Edit credential'
awToolTip: 'View/Edit credential',
dataPlacement: 'top'
},
"delete": {
@ -81,7 +82,8 @@ angular.module('CredentialsListDefinition', [])
icon: 'fa-trash',
label: 'Delete',
"class": 'btn-sm',
awToolTip: 'Delete credential'
awToolTip: 'Delete credential',
dataPlacement: 'top'
}
}
});

View File

@ -44,7 +44,8 @@ angular.module('GroupListDefinition', [])
ngClick: "editGroup(\{\{ group.id \}\})",
icon: 'icon-edit',
"class": 'btn-xs',
awToolTip: 'View/Edit group'
awToolTip: 'View/Edit group',
dataPlacement: 'top'
},
"delete": {
@ -52,7 +53,8 @@ angular.module('GroupListDefinition', [])
ngClick: "deleteGroup(\{\{ group.id \}\},'\{\{ group.name \}\}')",
icon: 'icon-trash',
"class": 'btn-xs',
awToolTip: 'Delete group'
awToolTip: 'Delete group',
dataPlacement: 'top'
}
}
});

View File

@ -44,7 +44,8 @@ angular.module('HostListDefinition', [])
ngClick: "editHost(\{\{ host.id \}\})",
icon: 'icon-edit',
"class": 'btn-xs',
awToolTip: 'View/Edit host'
awToolTip: 'View/Edit host',
dataPlacement: 'top'
},
"delete": {
@ -52,7 +53,8 @@ angular.module('HostListDefinition', [])
ngClick: "deleteHost(\{\{ host.id \}\},'\{\{ host.name \}\}')",
icon: 'icon-trash',
"class": 'btn-xs',
awToolTip: 'Delete host'
awToolTip: 'Delete host',
dataPlacement: 'top'
}
}
});

View File

@ -101,14 +101,16 @@ angular.module('InventoriesListDefinition', [])
ngClick: "editInventory(\{\{ inventory.id \}\})",
icon: 'icon-edit',
"class": 'btn-xs btn-default',
awToolTip: 'Edit inventory'
awToolTip: 'Edit inventory',
dataPlacement: 'top'
},
"delete": {
label: 'Delete',
ngClick: "deleteInventory(\{\{ inventory.id \}\},'\{\{ inventory.name \}\}')",
icon: 'icon-trash',
"class": 'btn-xs btn-danger',
awToolTip: 'Delete inventory'
awToolTip: 'Delete inventory',
dataPlacement: 'top'
},
dropdown: {
type: 'DropDown',

View File

@ -100,13 +100,12 @@ angular.module('InventoryHostsDefinition', [])
awToolTip: "Create a new host"
},
stream: {
mode: 'all',
ngClick: "showActivity()",
awToolTip: "View Activity Stream",
mode: 'all',
ngShow: "user_is_superuser"
},
help: {
dataPlacement: 'top',
mode: 'all',
awToolTip:
//"<div style=\"text-align:left;\"><img src=\"/static/img/cow.png\" style=\"width:50px; height:56px; float:left; padding-right:5px;\">" +

View File

@ -50,7 +50,8 @@ angular.module('JobTemplatesListDefinition', [])
ngClick: "editJobTemplate(\{\{ job_template.id \}\})",
icon: 'icon-edit',
awToolTip: 'Edit template',
"class": 'btn-default btn-xs'
"class": 'btn-default btn-xs',
dataPlacement: 'top'
},
submit: {
label: 'Launch',
@ -58,14 +59,16 @@ angular.module('JobTemplatesListDefinition', [])
mode: 'all',
"class": 'btn-xs btn-success',
ngClick: 'submitJob(\{\{ job_template.id \}\})',
awToolTip: 'Start a job using this template'
awToolTip: 'Start a job using this template',
dataPlacement: 'top'
},
"delete": {
label: 'Delete',
ngClick: "deleteJobTemplate(\{\{ job_template.id \}\},'\{\{ job_template.name \}\}')",
icon: 'icon-trash',
"class": 'btn-danger btn-xs',
awToolTip: 'Delete template'
awToolTip: 'Delete template',
dataPlacement: 'top'
}
}
});

View File

@ -89,7 +89,8 @@ angular.module('JobsListDefinition', [])
mode: 'all',
ngClick: "submitJob(\{\{ job.id \}\}, '\{\{ job.summary_fields.job_template.name \}\}' )",
'class': 'btn-success btn-xs',
awToolTip: 'Relaunch the job template, running it again from scratch'
awToolTip: 'Relaunch the job template, running it again from scratch',
dataPlacement: 'top'
},
cancel: {
label: 'Cancel',
@ -98,7 +99,8 @@ angular.module('JobsListDefinition', [])
ngClick: 'deleteJob(\{\{ job.id \}\})',
"class": 'btn-danger btn-xs delete-btn',
awToolTip: 'Cancel a running or pending job',
ngShow: "job.status == 'pending' || job.status == 'running' || job.status == 'waiting'"
ngShow: "job.status == 'pending' || job.status == 'running' || job.status == 'waiting'",
dataPlacement: 'top'
},
"delete": {
label: 'Delete',
@ -107,7 +109,8 @@ angular.module('JobsListDefinition', [])
ngClick: 'deleteJob(\{\{ job.id \}\})',
"class": 'btn-danger btn-xs delete-btn',
awToolTip: 'Remove the selected job from the database',
ngShow: "job.status != 'pending' && job.status != 'running' && job.status != 'waiting'"
ngShow: "job.status != 'pending' && job.status != 'running' && job.status != 'waiting'",
dataPlacement: 'top'
},
dropdown: {
type: 'DropDown',

View File

@ -47,7 +47,8 @@ angular.module('OrganizationListDefinition', [])
ngClick: "editOrganization(\{\{ organization.id \}\})",
icon: 'icon-edit',
"class": 'btn-xs btn-default',
awToolTip: 'View/Edit organization'
awToolTip: 'View/Edit organization',
dataPlacement: 'top'
},
"delete": {
@ -55,7 +56,8 @@ angular.module('OrganizationListDefinition', [])
ngClick: "deleteOrganization(\{\{ organization.id \}\},'\{\{ organization.name \}\}')",
icon: 'icon-trash',
"class": 'btn-xs btn-danger',
awToolTip: 'Delete organization'
awToolTip: 'Delete organization',
dataPlacement: 'top'
}
}
});

View File

@ -62,7 +62,8 @@ angular.module('PermissionListDefinition', [])
ngClick: "editPermission(\{\{ permission.id \}\})",
icon: 'icon-edit',
"class": 'btn-xs btn-default',
awToolTip: 'View/Edit permission'
awToolTip: 'View/Edit permission',
dataPlacement: 'top'
},
"delete": {
@ -71,7 +72,8 @@ angular.module('PermissionListDefinition', [])
icon: 'icon-trash',
"class": 'btn-xs btn-danger',
awToolTip: 'Delete permission',
ngShow: 'PermissionAddAllowed'
ngShow: 'PermissionAddAllowed',
dataPlacement: 'top'
}
}
});

View File

@ -95,7 +95,8 @@ angular.module('ProjectsListDefinition', [])
ngClick: "editProject(\{\{ project.id \}\})",
icon: 'icon-edit',
"class": 'btn-xs btn-default',
awToolTip: 'View/edit project properties'
awToolTip: 'View/edit project properties',
dataPlacement: 'top'
},
scm_update: {
label: 'Update',
@ -103,7 +104,8 @@ angular.module('ProjectsListDefinition', [])
"class": 'btn-xs btn-success',
ngClick: 'SCMUpdate(\{\{ project.id \}\})',
awToolTip: "\{\{ project.scm_update_tooltip \}\}",
ngClass: "project.scm_type_class"
ngClass: "project.scm_type_class",
dataPlacement: 'top'
},
cancel: {
label: 'Cancel',
@ -111,7 +113,8 @@ angular.module('ProjectsListDefinition', [])
ngClick: "cancelUpdate(\{\{ project.id \}\}, '\{\{ project.name \}\}')",
"class": 'btn-danger btn-xs delete-btn',
awToolTip: 'Cancel a running SCM update process',
ngShow: "project.status == 'updating'"
ngShow: "project.status == 'updating'",
dataPlacement: 'top'
},
"delete": {
label: 'Delete',
@ -119,7 +122,8 @@ angular.module('ProjectsListDefinition', [])
icon: 'icon-trash',
"class": 'btn-danger btn-xs delete-btn',
awToolTip: 'Permanently remove project from the database',
ngShow: "project.status !== 'updating'"
ngShow: "project.status !== 'updating'",
dataPlacement: 'top'
}
}
});

View File

@ -54,7 +54,8 @@ angular.module('TeamsListDefinition', [])
ngClick: "editTeam(\{\{ team.id \}\})",
icon: 'icon-edit',
"class": 'btn-xs btn-default',
awToolTip: 'View/Edit team'
awToolTip: 'View/Edit team',
dataPlacement: 'top'
},
"delete": {
@ -62,7 +63,8 @@ angular.module('TeamsListDefinition', [])
ngClick: "deleteTeam(\{\{ team.id \}\},'\{\{ team.name \}\}')",
icon: 'icon-trash',
"class": 'btn-xs btn-danger',
awToolTip: 'Delete team'
awToolTip: 'Delete team',
dataPlacement: 'top'
}
}
});

View File

@ -56,7 +56,8 @@ angular.module('UserListDefinition', [])
ngClick: "editUser(\{\{ user.id \}\})",
icon: 'icon-edit',
"class": 'btn-xs btn-default',
awToolTip: 'View/Edit user'
awToolTip: 'View/Edit user',
dataPlacement: 'top'
},
"delete": {
@ -64,7 +65,8 @@ angular.module('UserListDefinition', [])
ngClick: "deleteUser(\{\{ user.id \}\},'\{\{ user.username \}\}')",
icon: 'icon-trash',
"class": 'btn-xs btn-danger',
awToolTip: 'Delete user'
awToolTip: 'Delete user',
dataPlacement: 'top'
}
}
});

View File

@ -252,7 +252,7 @@
<div class="modal-footer">
<button ng-show="formModalInfo !== undefined && formModalInfo != ''" ng-click="formModalInfoAction()"
class="btn btn-sm pull-left"><i class="fa fa-search-plus"></i> <span ng-bind="formModalInfo"></span></button>
<a href="#" ng-show="formModalCancelShow" data-target="#form-modal" data-dismiss="modal" id="form_cancel_btn" class="btn btn-default">Cancel</a>
<a href="#" ng-show="formModalCancelShow" data-target="#form-modal" ng-click="cancelModal()" data-dismiss="modal" id="form_cancel_btn" class="btn btn-default">Cancel</a>
<a href="" ng-bind="formModalActionLabel" ng-click="formModalAction()" ng-disabled="formModalActionDisabled" id="form_ok_btn" class="btn btn-primary"></a>
</div>
</div><!-- modal-content -->