1
0
mirror of https://github.com/ansible/awx.git synced 2024-11-02 09:51:09 +03:00

AC-976 now using custom javascript to apply ellipsis to long group and host names. Fixed indes.html title.

This commit is contained in:
Chris Houseknecht 2014-01-29 13:31:36 -05:00
parent 97b776cf23
commit 22f40605cd
12 changed files with 216 additions and 64 deletions

View File

@ -316,7 +316,7 @@ function InventoriesEdit ($scope, $location, $routeParams, $compile, GenerateLis
GetSyncStatusMsg, InjectHosts, HostsReload, GroupsAdd, GroupsEdit, GroupsDelete, Breadcrumbs, LoadBreadCrumbs, Empty,
Rest, ProcessErrors, InventoryUpdate, Alert, ToggleChildren, ViewUpdateStatus, GroupsCancelUpdate, Find,
HostsCreate, EditInventoryProperties, HostsEdit, HostsDelete, ToggleHostEnabled, CopyMoveGroup, CopyMoveHost,
Stream, GetBasePath, ShowJobSummary)
Stream, GetBasePath, ShowJobSummary, ApplyEllipsis, WatchInventoryWindowResize)
{
ClearScope('htmlTemplate'); //Garbage collection. Don't leave behind any listeners/watchers from the prior
//scope.
@ -360,6 +360,11 @@ function InventoriesEdit ($scope, $location, $routeParams, $compile, GenerateLis
// Add hosts view
$scope.show_failures = false;
InjectHosts({ scope: $scope, inventory_id: $scope.inventory_id, tree_id: $scope.selected_tree_id, group_id: $scope.selected_group_id });
// As the window shrinks and expands, apply ellipsis
setTimeout(function() { ApplyEllipsis('#groups_table .group-name a'); }, 2500); //give the window time to display
WatchInventoryWindowResize();
});
@ -368,6 +373,8 @@ function InventoriesEdit ($scope, $location, $routeParams, $compile, GenerateLis
$scope.removeGroupTreeRefreshed();
}
$scope.removeGroupTreeRefreshed = $scope.$on('GroupTreeRefreshed', function(e, inventory_name, groups) {
// Reapply ellipsis to groups
setTimeout(function() { ApplyEllipsis('#groups_table .group-name a'); }, 2500);
// Reselect the preveiously selected group node, causing host view to refresh.
$scope.showHosts($scope.selected_tree_id, $scope.selected_group_id, false);
});
@ -525,12 +532,14 @@ function InventoriesEdit ($scope, $location, $routeParams, $compile, GenerateLis
//Load tree data for the first time
BuildTree({ scope: $scope, inventory_id: $scope.inventory_id, refresh: false });
}
InventoriesEdit.$inject = [ '$scope', '$location', '$routeParams', '$compile', 'GenerateList', 'ClearScope', 'InventoryGroups', 'InventoryHosts',
'BuildTree', 'Wait', 'GetSyncStatusMsg', 'InjectHosts', 'HostsReload', 'GroupsAdd', 'GroupsEdit', 'GroupsDelete',
'Breadcrumbs', 'LoadBreadCrumbs', 'Empty', 'Rest', 'ProcessErrors', 'InventoryUpdate', 'Alert', 'ToggleChildren',
'ViewUpdateStatus', 'GroupsCancelUpdate', 'Find', 'HostsCreate', 'EditInventoryProperties', 'HostsEdit',
'HostsDelete', 'ToggleHostEnabled', 'CopyMoveGroup', 'CopyMoveHost', 'Stream', 'GetBasePath', 'ShowJobSummary'
'HostsDelete', 'ToggleHostEnabled', 'CopyMoveGroup', 'CopyMoveHost', 'Stream', 'GetBasePath', 'ShowJobSummary',
'ApplyEllipsis', 'WatchInventoryWindowResize'
];

View File

@ -341,10 +341,10 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', '
.factory('GroupsAdd', ['$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'GroupForm', 'GenerateForm',
'Prompt', 'ProcessErrors', 'GetBasePath', 'ParseTypeChange', 'GroupsEdit', 'Wait', 'GetChoices',
'GetSourceTypeOptions', 'LookUpInit', 'BuildTree', 'SourceChange',
'GetSourceTypeOptions', 'LookUpInit', 'BuildTree', 'SourceChange', 'WatchInventoryWindowResize',
function($rootScope, $location, $log, $routeParams, Rest, Alert, GroupForm, GenerateForm, Prompt, ProcessErrors,
GetBasePath, ParseTypeChange, GroupsEdit, Wait, GetChoices, GetSourceTypeOptions, LookUpInit, BuildTree,
SourceChange) {
SourceChange, WatchInventoryWindowResize) {
return function(params) {
var inventory_id = params.inventory_id;
@ -387,11 +387,13 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', '
}
scope.removeSaveComplete = scope.$on('SaveComplete', function(e, group_id, error) {
if (!error) {
if (scope.searchCleanup)
if (scope.searchCleanup) {
scope.searchCleanup();
}
scope.formModalActionDisabled = false;
scope.showGroupHelp = false; //get rid of the Hint
BuildTree({ scope: parent_scope, inventory_id: inventory_id, refresh: true, new_group_id: group_id });
WatchInventoryWindowResize();
}
});
@ -484,6 +486,7 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', '
if (scope.searchCleanup) {
scope.searchCleanup();
}
WatchInventoryWindowResize();
}
// Save
@ -589,9 +592,10 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', '
.factory('GroupsEdit', ['$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'GroupForm', 'GenerateForm',
'Prompt', 'ProcessErrors', 'GetBasePath', 'SetNodeName', 'ParseTypeChange', 'GetSourceTypeOptions', 'InventoryUpdate',
'GetUpdateIntervalOptions', 'LookUpInit', 'Empty', 'Wait', 'GetChoices', 'UpdateGroup', 'SourceChange', 'Find',
'WatchInventoryWindowResize',
function($rootScope, $location, $log, $routeParams, Rest, Alert, GroupForm, GenerateForm, Prompt, ProcessErrors,
GetBasePath, SetNodeName, ParseTypeChange, GetSourceTypeOptions, InventoryUpdate, GetUpdateIntervalOptions,
LookUpInit, Empty, Wait, GetChoices, UpdateGroup, SourceChange, Find) {
LookUpInit, Empty, Wait, GetChoices, UpdateGroup, SourceChange, Find, WatchInventoryWindowResize) {
return function(params) {
var parent_scope = params.scope;
@ -855,6 +859,7 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', '
else {
Wait('stop');
}
WatchInventoryWindowResize();
}
});
@ -936,6 +941,7 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', '
if (scope.searchCleanup) {
scope.searchCleanup();
}
WatchInventoryWindowResize();
}
// Save
@ -1076,9 +1082,9 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', '
.factory('ShowUpdateStatus', ['$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'GenerateForm',
'Prompt', 'ProcessErrors', 'GetBasePath', 'FormatDate', 'InventoryStatusForm', 'Wait', 'Empty',
'Prompt', 'ProcessErrors', 'GetBasePath', 'FormatDate', 'InventoryStatusForm', 'Wait', 'Empty', 'WatchInventoryWindowResize',
function($rootScope, $location, $log, $routeParams, Rest, Alert, GenerateForm, Prompt, ProcessErrors, GetBasePath,
FormatDate, InventoryStatusForm, Wait, Empty) {
FormatDate, InventoryStatusForm, Wait, Empty, WatchInventoryWindowResize) {
return function(params) {
var group_name = params.group_name;
@ -1102,9 +1108,15 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', '
scope.formModalAction = function() {
$('#form-modal').modal("hide");
if (parent_scope && parent_scope.showHosts && !Empty(tree_id)) {
if (parent_scope.selected_tree_id !== tree_id)
if (parent_scope.selected_tree_id !== tree_id) {
parent_scope.showHosts(tree_id, group_id, false);
}
}
WatchInventoryWindowResize();
}
scope.cancelModal = function() {
WatchInventoryWindowResize();
}
if (scope.removeUpdateStatusReady) {

View File

@ -77,21 +77,21 @@ angular.module('HostsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', 'H
return -1 * (a - b);
});
title = "Recent Jobs";
html = "<table class=\"table table-condensed\">\n";
html = "<table class=\"table table-condensed\" style=\"width: 100%\">\n";
html += "<thead>\n";
html += "<tr>\n";
html += "<th>ID</td>\n";
html += "<th>Status</td>\n";
html += "<th>Name</td>\n";
html += "<th class=\"text-center\">Status</td>\n";
html += "<th style=\"width: 50%;\">Name</td>\n";
html += "</tr>\n";
html += "</thead>\n";
html += "<tbody>\n";
for (var j=0; j < jobs.length; j++) {
var job = jobs[j];
html += "<tr>\n";
html += "<td><a href=\"/#/jobs/" + job.id + "\">" + job.id + "</a></td>\n";
html += "<td><a ng-click=\"showJobSummary(" + job.id + ")\"><i class=\"fa icon-job-" + job.status + "\"></i> " + job.status + "</a></td>\n";
html += "<td>" + job.name + "</td>\n";
html += "<td><a ng-click=\"showJobSummary(" + job.id + ")\">" + job.id + "</a></td>\n";
html += "<td><a ng-click=\"showJobSummary(" + job.id + ")\"><i class=\"fa icon-job-" + job.status + "\"></i></a></td>\n";
html += "<td class=\"ellipsis\">" + job.name + "</td>\n";
html += "</tr>\n";
}
html += "</tbody>\n";
@ -128,8 +128,9 @@ angular.module('HostsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', 'H
}])
.factory('HostsReload', [ '$routeParams', 'Empty', 'InventoryHosts', 'GetBasePath', 'SearchInit', 'PaginateInit', 'Wait',
'SetHostStatus', 'SetStatus',
function($routeParams, Empty, InventoryHosts, GetBasePath, SearchInit, PaginateInit, Wait, SetHostStatus, SetStatus) {
'SetHostStatus', 'SetStatus', 'ApplyEllipsis',
function($routeParams, Empty, InventoryHosts, GetBasePath, SearchInit, PaginateInit, Wait, SetHostStatus, SetStatus,
ApplyEllipsis) {
return function(params) {
var scope = params.scope;
@ -153,6 +154,7 @@ angular.module('HostsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', 'H
//SetHostStatus(scope.hosts[i]);
}
SetStatus({ scope: scope });
setTimeout(function() { ApplyEllipsis('#hosts_table .host-name a'); }, 2500);
Wait('stop');
scope.$emit('HostReloadComplete');
});
@ -304,9 +306,9 @@ angular.module('HostsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', 'H
.factory('HostsCreate', ['$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'HostForm', 'GenerateForm',
'Prompt', 'ProcessErrors', 'GetBasePath', 'HostsReload', 'ParseTypeChange', 'Wait',
'Prompt', 'ProcessErrors', 'GetBasePath', 'HostsReload', 'ParseTypeChange', 'Wait', 'WatchInventoryWindowResize',
function($rootScope, $location, $log, $routeParams, Rest, Alert, HostForm, GenerateForm, Prompt, ProcessErrors,
GetBasePath, HostsReload, ParseTypeChange, Wait) {
GetBasePath, HostsReload, ParseTypeChange, Wait, WatchInventoryWindowResize) {
return function(params) {
var parent_scope = params.scope;
@ -349,11 +351,14 @@ angular.module('HostsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', 'H
scope.removeHostSaveComplete = scope.$on('HostSaveComplete', function() {
Wait('stop');
$('#form-modal').modal('hide');
HostsReload({
scope: parent_scope,
group_id: parent_scope.selected_group_id,
tree_id: parent_scope.selected_tree_id,
inventory_id: parent_scope.inventory_id });
WatchInventoryWindowResize();
});
// Save
@ -417,15 +422,20 @@ angular.module('HostsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', 'H
// Defaults
generator.reset();
};
scope.cancelModal = function() {
WatchInventoryWindowResize();
}
}
}])
.factory('HostsEdit', ['$rootScope', '$location', '$log', '$routeParams', 'Rest', 'Alert', 'HostForm', 'GenerateForm',
'Prompt', 'ProcessErrors', 'GetBasePath', 'HostsReload', 'ParseTypeChange', 'Wait', 'Find', 'SetStatus',
'Prompt', 'ProcessErrors', 'GetBasePath', 'HostsReload', 'ParseTypeChange', 'Wait', 'Find', 'SetStatus', 'ApplyEllipsis',
'WatchInventoryWindowResize',
function($rootScope, $location, $log, $routeParams, Rest, Alert, HostForm, GenerateForm, Prompt, ProcessErrors,
GetBasePath, HostsReload, ParseTypeChange, Wait, Find, SetStatus) {
GetBasePath, HostsReload, ParseTypeChange, Wait, Find, SetStatus, ApplyEllipsis, WatchInventoryWindowResize) {
return function(params) {
var parent_scope = params.scope;
@ -513,13 +523,29 @@ angular.module('HostsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', 'H
scope.removeSaveCompleted = scope.$on('saveCompleted', function() {
// Update the name on the list
var host = Find({ list: parent_scope.hosts, key: 'id', val: host_id });
var old_name = host.name;
host.name = scope.name;
host.enabled = scope.enabled;
host.enabled_flag = scope.enabled;
SetStatus({ scope: parent_scope, host: host });
// Close modal
Wait('stop');
$('#form-modal').modal('hide');
// Update any titles attributes created by ApplyEllipsis
if (old_name) {
setTimeout(function() {
$('#hosts_table .host-name a[title="' + old_name + '"').attr('title', host.name);
ApplyEllipsis('#hosts_table .host-name a');
// Close modal
Wait('stop');
$('#form-modal').modal('hide');
}, 2000);
}
else {
// Close modal
Wait('stop');
$('#form-modal').modal('hide');
}
// Restore ellipsis response to window resize
WatchInventoryWindowResize();
});
// Save changes to the parent
@ -580,6 +606,11 @@ angular.module('HostsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', 'H
}
scope.parseType = 'yaml';
}
scope.cancelModal = function() {
WatchInventoryWindowResize();
}
}
}])

View File

@ -12,6 +12,20 @@ angular.module('InventoryHelper', [ 'RestServices', 'Utilities', 'OrganizationLi
'InventoryHelper', 'InventoryFormDefinition', 'ParseHelper', 'SearchHelper'
])
.factory('WatchInventoryWindowResize', ['ApplyEllipsis', function(ApplyEllipsis) {
return function() {
// Call to set or restore window resize
var timeOut;
$(window).resize(function() {
clearTimeout(timeOut);
timeOut = setTimeout(function() {
ApplyEllipsis('#groups_table .group-name a');
ApplyEllipsis('#hosts_table .host-name a');
}, 100);
});
}
}])
.factory('SaveInventory', ['InventoryForm', 'Rest', 'Alert', 'ProcessErrors', 'LookUpInit', 'OrganizationList',
'GetBasePath', 'ParseTypeChange', 'Wait',
function(InventoryForm, Rest, Alert, ProcessErrors, LookUpInit, OrganizationList, GetBasePath, ParseTypeChange, Wait) {
@ -102,16 +116,12 @@ angular.module('InventoryHelper', [ 'RestServices', 'Utilities', 'OrganizationLi
var PreviousSearchParams = Store('CurrentSearchParams');
form.well = false;
//form.formLabelSize = 'col-lg-3';
//form.formFieldSize = 'col-lg-9';
var scope = generator.inject(form, {mode: 'edit', modal: true, related: false, modal_show: false });
/* Reset form properties. Otherwise it screws up future requests of the Inventories detail page */
form.well = true;
//delete form.formLabelSize;
//delete form.formFieldSize;
ParseTypeChange(scope,'inventory_variables', 'inventoryParseType');
scope.inventoryParseType = 'yaml';
scope.formModalActionLabel = 'Save';

View File

@ -29,7 +29,6 @@ angular.module('InventoryGroupsDefinition', [])
ngClass: "group.selected_class",
hasChildren: true,
columnClass: 'col-lg-9 col-md-9 col-sm-7 col-xs-7',
'class': 'ellipsis',
nosort: true,
awDroppable: "\{\{ group.isDroppable \}\}",
awDraggable: "\{\{ group.isDraggable \}\}",

View File

@ -26,7 +26,7 @@ angular.module('InventoryHostsDefinition', [])
label: 'Hosts',
ngClick: "editHost(\{\{ host.id \}\})",
searchPlaceholder: "search_place_holder",
columnClass: 'col-lg-9 ellipsis',
columnClass: 'col-lg-9 col-md-9 col-sm-7 col-xs-7',
dataHostId: "\{\{ host.id \}\}",
dataType: "host",
awDraggable: "true"
@ -91,6 +91,9 @@ angular.module('InventoryHostsDefinition', [])
},
actions: {
columnClass: 'col-lg-3 col-md-3 col-sm-5 col-xs-5',
create: {
mode: 'all',
ngClick: "createHost()",

View File

@ -66,7 +66,12 @@ body.modal-open {
.ellipsis {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
text-overflow: ellipsis;
}
.group-name {
display: inline-block;
width: 90%;
}
a {
@ -193,20 +198,22 @@ textarea {
}
/* TB tooltip overrides */
.popover-content, .popover-content {
width: 100%;
}
.popover {
z-index: 2000;
z-index: 2000;
}
.tooltip {
z-index: 1050;
opacity: 1.0;
z-index: 1050;
opacity: 1.0;
}
.alert {
.alert {
margin-top: 15px;
margin-bottom: 15px;
}
}
hr {
border-color: #e3e3e3;
@ -1132,6 +1139,10 @@ input[type="checkbox"].checkbox-no-label {
.draggable-clone {
opacity: .60;
font-weight: bold;
/*z-index: 2000;
overflow: visible;
whitespace: wrap;
text-overflow: clip;*/
}
.droppable-hover {
@ -1139,7 +1150,10 @@ input[type="checkbox"].checkbox-no-label {
color: @info-color;
padding: 6px;
border: 1px solid @info-border;
border-radius: 4px;
border-radius: 4px;
/*overflow: visible;
whitespace: wrap;
text-overflow: clip;*/
}

View File

@ -173,18 +173,21 @@ angular.module('InventoryTree', ['Utilities', 'RestServices', 'GroupsHelper', 'P
// Update a group with a set of properties
.factory('UpdateGroup', [ function() {
.factory('UpdateGroup', ['ApplyEllipsis', function(ApplyEllipsis) {
return function(params) {
var scope = params.scope;
var group_id = params.group_id;
var properties = params.properties; // object of key:value pairs to update
var old_name;
for (var i=0; i < scope.groups.length; i++) {
if (scope.groups[i].group_id == group_id) {
var grp = scope.groups[i];
for (var p in properties) {
scope.groups[i][p] = properties[p];
if (p == 'name') {
old_name = scope.groups[i].name;
}
scope.groups[i][p] = properties[p];
}
}
if (scope.groups[i].id == scope.selected_tree_id) {
@ -194,6 +197,15 @@ angular.module('InventoryTree', ['Utilities', 'RestServices', 'GroupsHelper', 'P
scope.hostSearchPlaceholder = 'Search ' + scope.groups[i].name;
}
}
// Update any titles attributes created by ApplyEllipsis
if (old_name) {
setTimeout(function() {
$('#groups_table .group-name a[title="' + old_name + '"').attr('title',properties.name);
ApplyEllipsis('#groups_table .group-name a');
}, 2500);
}
}
}])

View File

@ -539,18 +539,18 @@ angular.module('Utilities',['RestServices', 'Utilities'])
}])
/* Store
*
* Wrapper for local storage. All local storage requests flow through here so that we can
* stringify/unstringify objects and respond to future issues in one place. For example,
* we may at some point want to only use session storage rather than local storage. We might
* want to add a test for whether or not local/session storage exists for the browser, etc.
*
* store(key,value) will store the value using the key
*
* store(key) retrieves the value of the key
*
*/
/* Store
*
* Wrapper for local storage. All local storage requests flow through here so that we can
* stringify/unstringify objects and respond to future issues in one place. For example,
* we may at some point want to only use session storage rather than local storage. We might
* want to add a test for whether or not local/session storage exists for the browser, etc.
*
* store(key,value) will store the value using the key
*
* store(key) retrieves the value of the key
*
*/
.factory('Store', ['Empty', function(Empty) {
return function(key, value) {
if (!Empty(value)) {
@ -562,8 +562,59 @@ angular.module('Utilities',['RestServices', 'Utilities'])
var val = localStorage[key];
return (!Empty(val)) ? JSON.parse(val) : null;
}
}
}])
}
}])
/*
*
* ApplyEllipsis()
*
*/
.factory('ApplyEllipsis', [ function() {
return function(selector) {
// Add a hidden element to the DOM. We'll use this to calc the px length of
// our target text.
var tmp = $('#string-test');
if (!tmp.length) {
$('body').append('<div style="display:none;" id="string-test"></div>');
tmp = $('#string-test');
}
// Find and process the text.
$(selector).each(function() {
var setTitle = true;
var txt;
if ($(this).attr('title')) {
txt = $(this).attr('title');
setTitle = false;
}
else {
txt = $(this).text();
}
tmp.text(txt);
var w = tmp.width(); //text width
var pw = $(this).parent().width(); //parent width
if (w > pw) {
// text is wider than parent width
if (setTitle) {
// Save the original text in the title
$(this).attr('title',txt);
}
var cw = w / txt.length; // px width per character
var df = w - pw; // difference in px
txt = txt.substr(0, txt.length - (Math.ceil(df / cw) + 3));
$(this).text(txt + '...');
}
if (pw > w && !setTitle) {
// the parent has expanded and we previously set the title text
var txt = $(this).attr('title');
$(this).text(txt);
}
});
}
}]);

View File

@ -582,7 +582,6 @@ angular.module('AWDirectives', ['RestServices', 'Utilities', 'AuthService', 'Job
found = true;
break;
}
}
return (found) ? false : true;
}

View File

@ -471,9 +471,16 @@ angular.module('GeneratorHelpers', ['GeneratorHelpers'])
// Add collapse/expand icon --used on job_events page
if (list['hasChildren'] && field.hasChildren) {
html += "<span class=\"level-\{\{ " + list.iterator + ".event_level \}\}\"><a href=\"\" ng-click=\"\{\{ " + list.iterator + ".ngclick \}\}\"> " +
"<i class=\"\{\{ " + list.iterator + ".ngicon \}\}\"></i></a> ";
//ng-show=\"'\{\{ " + list.iterator + ".related.children \}\}' !== ''\"
html += "<span class=\"level-\{\{ " + list.iterator + ".event_level \}\}\"><a href=\"\" ng-click=\"\{\{ " + list.iterator + ".ngclick \}\}\"> " +
"<i class=\"\{\{ " + list.iterator + ".ngicon \}\}\"></i></a> ";
//ng-show=\"'\{\{ " + list.iterator + ".related.children \}\}' !== ''\"
}
if (list.name == 'groups') {
html += "<div class=\"group-name\">";
}
if (list.name == 'hosts') {
html += "<div class=\"host-name\">";
}
// Start the Link
@ -550,9 +557,14 @@ angular.module('GeneratorHelpers', ['GeneratorHelpers'])
&& options.mode != 'lookup' && options.mode != 'select' && !field.noLink && !field.ngBindHtml ) {
html += "</a>";
}
if (list.name == 'hosts' || list.name == 'groups') {
html += "</div>";
}
// close ngShow
html += (field.ngShow) ? "</span>" : "";
// Specific to Job Events page -showing event detail/results
html += (field.appendHTML) ? "<div ng-show=\"" + field.appendHTML + " !== null\" " +
"ng-bind-html-unsafe=\"" + field.appendHTML + "\" " +

View File

@ -2,7 +2,7 @@
<html lang="en" ng-app="ansible">
<head>
<meta charset="utf-8">
<title>AnsibleWorks AWX</title>
<title>Ansible Tower</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="{{ STATIC_URL }}css/custom-theme/jquery-ui-1.10.3.custom.min.css" />
<link rel="stylesheet" href="{{ STATIC_URL }}css/bootstrap.min.css" />
@ -244,7 +244,7 @@
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-target="#form-modal"
data-dismiss="modal" aria-hidden="true">&times;</button>
data-dismiss="modal" aria-hidden="true" ng-click="cancelModal()">&times;</button>
<h3 ng-bind-html-unsafe="formModalHeader"></h3>
</div>
<div class="modal-body" id="form-modal-body"></div>