mirror of
https://github.com/ansible/awx.git
synced 2026-05-19 14:57:39 -02:30
Merge branch 'ui_release_3.0.1' into release_3.0.2
* ui_release_3.0.1: (54 commits) Returning btn-primary to blue Fixed adhoc relaunch logic to match normal adhoc launch logic Breadcrumb appears correctly on first run Fixed display of non-breaking names Continuing audit work remove aws ask at runtime prompt from cred form config, resolves #3055 (#3058) fix missing URI encoding in event summary serch, kickback on #2980 (#3050) Switch base class for StateConflict Fixed password show/hide on enter for survey maker password type previews Fixed password show/hide on enter for survey taker survey questions where type is password Prevent populate_user from being registered multiple times. Fixing iterator used when jobs list refreshes Explicit super user check for JT can_delete Fix for populating teams for LDAP user. Update hubspot template for marketting Fix up flake8 Rolled back the onExit solution previously implemented to handle the backspace navigation on the job launch modal. New solution listens for state changes within the directive and cleans itself up. Switch disallowed object delete to 409 Password enter show/hide fix add test for CustomInventoryScript serializer ...
This commit is contained in:
@@ -80,12 +80,6 @@ a.red-txt:active {
|
|||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
|
|
||||||
.name-column {
|
|
||||||
white-space: nowrap;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
|
||||||
|
|
||||||
blockquote {
|
blockquote {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,9 +44,11 @@
|
|||||||
color: @list-header-txt;
|
color: @list-header-txt;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
white-space: nowrap;
|
|
||||||
padding-bottom: 25px;
|
padding-bottom: 25px;
|
||||||
min-height: 45px;
|
min-height: 45px;
|
||||||
|
word-break: break-all;
|
||||||
|
max-width: 90%;
|
||||||
|
word-wrap: break-word;
|
||||||
}
|
}
|
||||||
|
|
||||||
.Form-secondaryTitle{
|
.Form-secondaryTitle{
|
||||||
@@ -55,7 +57,10 @@
|
|||||||
min-height: 40px;
|
min-height: 40px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.Form-title--is_superuser, .Form-title--is_system_auditor, .Form-title--is_ldap_user{
|
.Form-title--is_superuser,
|
||||||
|
.Form-title--is_system_auditor,
|
||||||
|
.Form-title--is_ldap_user,
|
||||||
|
.Form-title--is_external_account{
|
||||||
height:15px;
|
height:15px;
|
||||||
color: @default-interface-txt;
|
color: @default-interface-txt;
|
||||||
background-color: @default-list-header-bg;
|
background-color: @default-list-header-bg;
|
||||||
@@ -353,6 +358,11 @@
|
|||||||
border-color: transparent transparent @field-dropdown-icon transparent!important;
|
border-color: transparent transparent @field-dropdown-icon transparent!important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.select2-container--default.select2-container--open.select2-container--below .select2-selection--single {
|
||||||
|
border-bottom-left-radius: 0 !important;
|
||||||
|
border-bottom-right-radius: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
.select2-dropdown{
|
.select2-dropdown{
|
||||||
border:1px solid @field-border;
|
border:1px solid @field-border;
|
||||||
|
|
||||||
|
|||||||
@@ -78,6 +78,7 @@ table, tbody {
|
|||||||
padding-left: 15px;
|
padding-left: 15px;
|
||||||
padding-right: 15px;
|
padding-right: 15px;
|
||||||
border-top:0px!important;
|
border-top:0px!important;
|
||||||
|
word-wrap: break-word;
|
||||||
}
|
}
|
||||||
|
|
||||||
.List-tableCell.description-column {
|
.List-tableCell.description-column {
|
||||||
@@ -383,6 +384,7 @@ table, tbody {
|
|||||||
|
|
||||||
.List-action--showTooltipOnDisabled {
|
.List-action--showTooltipOnDisabled {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
cursor: not-allowed;
|
||||||
}
|
}
|
||||||
|
|
||||||
.List-action--showTooltipOnDisabled .btn[disabled] {
|
.List-action--showTooltipOnDisabled .btn[disabled] {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "angular-codemirror",
|
"name": "angular-codemirror",
|
||||||
"version": "1.0.2",
|
"version": "1.0.3",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"angular": "latest",
|
"angular": "latest",
|
||||||
"angular-route": "latest",
|
"angular-route": "latest",
|
||||||
@@ -13,14 +13,13 @@
|
|||||||
"codemirror": "latest"
|
"codemirror": "latest"
|
||||||
},
|
},
|
||||||
"homepage": "https://github.com/chouseknecht/angular-codemirror",
|
"homepage": "https://github.com/chouseknecht/angular-codemirror",
|
||||||
"_release": "1.0.2",
|
"_release": "1.0.3",
|
||||||
"_resolution": {
|
"_resolution": {
|
||||||
"type": "version",
|
"type": "version",
|
||||||
"tag": "v1.0.2",
|
"tag": "1.0.3",
|
||||||
"commit": "94b7aac548b036f4fbd94e56129ed9574e472616"
|
"commit": "b94dc86fde8f60a50b324054806d29d742177d21"
|
||||||
},
|
},
|
||||||
"_source": "git://github.com/chouseknecht/angular-codemirror.git",
|
"_source": "https://github.com/chouseknecht/angular-codemirror.git",
|
||||||
"_target": "~1.0.2",
|
"_target": "~1.0.3",
|
||||||
"_originalSource": "angular-codemirror",
|
"_originalSource": "angular-codemirror"
|
||||||
"_direct": true
|
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "angular-codemirror",
|
"name": "angular-codemirror",
|
||||||
"version": "0.0.3",
|
"version": "1.0.2",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"angular": "latest",
|
"angular": "latest",
|
||||||
"angular-route": "latest",
|
"angular-route": "latest",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**********************************************
|
/**********************************************
|
||||||
* AngularCodeMirror.css
|
* AngularCodeMirror.css
|
||||||
*
|
*
|
||||||
* CodeMirror.css overrides
|
* CodeMirror.css overrides
|
||||||
*
|
*
|
||||||
* Copyright (c) 2014 Chris Houseknecht
|
* Copyright (c) 2014 Chris Houseknecht
|
||||||
@@ -30,14 +30,14 @@
|
|||||||
.CodeMirror {
|
.CodeMirror {
|
||||||
height: auto;
|
height: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.CodeMirror-activeline-background {
|
.CodeMirror-activeline-background {
|
||||||
background-color: #f7f7f7;
|
background-color: #f7f7f7;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Modal dialog overrides to make jqueryui dialog blend in with Twitter.
|
||||||
/* Modal dialog overrides to make jqueryui dialog blend in with Twitter.
|
|
||||||
Why? Twitter's modal is not draggable or resizable, which is not very
|
Why? Twitter's modal is not draggable or resizable, which is not very
|
||||||
useful for a code editor */
|
useful for a code editor */
|
||||||
|
|
||||||
@@ -71,7 +71,7 @@
|
|||||||
border-color: #ffffff;
|
border-color: #ffffff;
|
||||||
color: #A9A9A9;
|
color: #A9A9A9;
|
||||||
}
|
}
|
||||||
|
|
||||||
.ui-dialog .ui-resizable-se {
|
.ui-dialog .ui-resizable-se {
|
||||||
right: 5px;
|
right: 5px;
|
||||||
bottom: 5px;
|
bottom: 5px;
|
||||||
@@ -108,3 +108,4 @@
|
|||||||
.CodeMirror-lint-tooltip {
|
.CodeMirror-lint-tooltip {
|
||||||
z-index: 2060;
|
z-index: 2060;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
angular.module('AngularCodeMirrorModule', [])
|
angular.module('AngularCodeMirrorModule', [])
|
||||||
|
|
||||||
.factory('AngularCodeMirror', [ function() {
|
.factory('AngularCodeMirror', [ function() {
|
||||||
return function() {
|
return function(readOnly) {
|
||||||
var fn = function() {
|
var fn = function() {
|
||||||
|
|
||||||
this.myCodeMirror = null;
|
this.myCodeMirror = null;
|
||||||
@@ -43,7 +43,6 @@ angular.module('AngularCodeMirrorModule', [])
|
|||||||
model = params.model,
|
model = params.model,
|
||||||
mode = params.mode,
|
mode = params.mode,
|
||||||
onReady = params.onReady,
|
onReady = params.onReady,
|
||||||
onChange = params.onChange,
|
|
||||||
height = 0;
|
height = 0;
|
||||||
|
|
||||||
self.element = $(element);
|
self.element = $(element);
|
||||||
@@ -69,6 +68,15 @@ angular.module('AngularCodeMirrorModule', [])
|
|||||||
|
|
||||||
// Initialize CodeMirror
|
// Initialize CodeMirror
|
||||||
self.modes[mode].value = scope[model];
|
self.modes[mode].value = scope[model];
|
||||||
|
|
||||||
|
// if readOnly is passed to AngularCodeMirror, set the
|
||||||
|
// options for all modes to be readOnly
|
||||||
|
if (readOnly) {
|
||||||
|
Object.keys(self.modes).forEach(function(val) {
|
||||||
|
self.modes[val].readOnly = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
self.myCodeMirror = CodeMirror(document.getElementById('cm-' + model + '-container'), self.modes[mode]);
|
self.myCodeMirror = CodeMirror(document.getElementById('cm-' + model + '-container'), self.modes[mode]);
|
||||||
|
|
||||||
// Adjust the height
|
// Adjust the height
|
||||||
@@ -85,14 +93,7 @@ angular.module('AngularCodeMirrorModule', [])
|
|||||||
|
|
||||||
// Update the model on change
|
// Update the model on change
|
||||||
self.myCodeMirror.on('change', function() {
|
self.myCodeMirror.on('change', function() {
|
||||||
setTimeout(function() {
|
setTimeout(function() { scope.$apply(function(){ scope[model] = self.myCodeMirror.getValue(); }); }, 500);
|
||||||
scope.$apply(function(){
|
|
||||||
scope[model] = self.myCodeMirror.getValue();
|
|
||||||
if (onChange) {
|
|
||||||
onChange();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}, 500);
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -52,8 +52,7 @@
|
|||||||
"tag": "2.0.0",
|
"tag": "2.0.0",
|
||||||
"commit": "8a1951c54a956c33964c99b338f3a4830e652689"
|
"commit": "8a1951c54a956c33964c99b338f3a4830e652689"
|
||||||
},
|
},
|
||||||
"_source": "git://github.com/tameraydin/ngToast.git",
|
"_source": "https://github.com/tameraydin/ngToast.git",
|
||||||
"_target": "~2.0.0",
|
"_target": "~2.0.0",
|
||||||
"_originalSource": "ngtoast",
|
"_originalSource": "ngtoast"
|
||||||
"_direct": true
|
|
||||||
}
|
}
|
||||||
@@ -66,6 +66,12 @@
|
|||||||
display: inline-block;
|
display: inline-block;
|
||||||
color: @default-interface-txt;
|
color: @default-interface-txt;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
|
max-width: 200px;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: bottom;
|
||||||
}
|
}
|
||||||
|
|
||||||
.BreadCrumb-item + .BreadCrumb-item:before {
|
.BreadCrumb-item + .BreadCrumb-item:before {
|
||||||
|
|||||||
@@ -20,7 +20,8 @@ export function JobsListController ($rootScope, $log, $scope, $compile, $statePa
|
|||||||
var jobs_scope, scheduled_scope,
|
var jobs_scope, scheduled_scope,
|
||||||
choicesCount = 0,
|
choicesCount = 0,
|
||||||
listCount = 0,
|
listCount = 0,
|
||||||
api_complete = false;
|
api_complete = false,
|
||||||
|
scheduledJobsList = _.cloneDeep(ScheduledJobsList);
|
||||||
|
|
||||||
$scope.jobsSelected = true;
|
$scope.jobsSelected = true;
|
||||||
|
|
||||||
@@ -66,22 +67,23 @@ export function JobsListController ($rootScope, $log, $scope, $compile, $statePa
|
|||||||
scope: jobs_scope,
|
scope: jobs_scope,
|
||||||
list: AllJobsList,
|
list: AllJobsList,
|
||||||
id: 'active-jobs',
|
id: 'active-jobs',
|
||||||
pageSize: 20,
|
|
||||||
url: GetBasePath('unified_jobs') + '?status__in=pending,waiting,running,completed,failed,successful,error,canceled,new&order_by=-finished',
|
url: GetBasePath('unified_jobs') + '?status__in=pending,waiting,running,completed,failed,successful,error,canceled,new&order_by=-finished',
|
||||||
|
pageSize: 20,
|
||||||
searchParams: search_params,
|
searchParams: search_params,
|
||||||
spinner: false
|
spinner: false
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
scheduled_scope = $scope.$new(true);
|
scheduled_scope = $scope.$new(true);
|
||||||
|
scheduledJobsList.basePath = GetBasePath('schedules') + '?next_run__isnull=false';
|
||||||
LoadSchedulesScope({
|
LoadSchedulesScope({
|
||||||
parent_scope: $scope,
|
parent_scope: $scope,
|
||||||
scope: scheduled_scope,
|
scope: scheduled_scope,
|
||||||
list: ScheduledJobsList,
|
list: scheduledJobsList,
|
||||||
pageSize: 20,
|
pageSize: 20,
|
||||||
id: 'scheduled-jobs-tab',
|
id: 'scheduled-jobs-tab',
|
||||||
searchSize: 'col-lg-4 col-md-4 col-sm-4 col-xs-12',
|
searchSize: 'col-lg-4 col-md-4 col-sm-4 col-xs-12',
|
||||||
url: GetBasePath('schedules') + '?next_run__isnull=false'
|
url: scheduledJobsList.basePath
|
||||||
});
|
});
|
||||||
|
|
||||||
$scope.refreshJobs = function() {
|
$scope.refreshJobs = function() {
|
||||||
|
|||||||
@@ -358,11 +358,8 @@ export function ProjectsList ($scope, $rootScope, $location, $log, $stateParams,
|
|||||||
|
|
||||||
$scope.editSchedules = function(id) {
|
$scope.editSchedules = function(id) {
|
||||||
var project = Find({ list: $scope.projects, key: 'id', val: id });
|
var project = Find({ list: $scope.projects, key: 'id', val: id });
|
||||||
if (project.scm_type === "Manual" || Empty(project.scm_type)) {
|
if (!(project.scm_type === "Manual" || Empty(project.scm_type)) && !(project.status === 'updating' || project.status === 'running' || project.status === 'pending')) {
|
||||||
// Nothing to do
|
$state.go('projectSchedules', {id: id});
|
||||||
}
|
|
||||||
else {
|
|
||||||
$location.path('/projects/' + id + '/schedules');
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -162,6 +162,7 @@ export function UsersAdd($scope, $rootScope, $compile, $location, $log,
|
|||||||
$scope.not_ldap_user = !$scope.ldap_user;
|
$scope.not_ldap_user = !$scope.ldap_user;
|
||||||
$scope.ldap_dn = null;
|
$scope.ldap_dn = null;
|
||||||
$scope.socialAuthUser = false;
|
$scope.socialAuthUser = false;
|
||||||
|
$scope.external_account = null;
|
||||||
|
|
||||||
generator.reset();
|
generator.reset();
|
||||||
|
|
||||||
@@ -334,6 +335,7 @@ export function UsersEdit($scope, $rootScope, $location,
|
|||||||
$scope.not_ldap_user = !$scope.ldap_user;
|
$scope.not_ldap_user = !$scope.ldap_user;
|
||||||
master.ldap_user = $scope.ldap_user;
|
master.ldap_user = $scope.ldap_user;
|
||||||
$scope.socialAuthUser = (data.auth.length > 0) ? true : false;
|
$scope.socialAuthUser = (data.auth.length > 0) ? true : false;
|
||||||
|
$scope.external_account = data.external_account;
|
||||||
|
|
||||||
$scope.user_type = $scope.user_type_options[0];
|
$scope.user_type = $scope.user_type_options[0];
|
||||||
$scope.is_system_auditor = false;
|
$scope.is_system_auditor = false;
|
||||||
|
|||||||
@@ -6,8 +6,8 @@
|
|||||||
|
|
||||||
export default
|
export default
|
||||||
['$scope', '$state', '$stateParams', 'PageRangeSetup', 'GetBasePath', 'DashboardHostsList',
|
['$scope', '$state', '$stateParams', 'PageRangeSetup', 'GetBasePath', 'DashboardHostsList',
|
||||||
'generateList', 'PaginateInit', 'SetStatus', 'DashboardHostService', 'hosts', '$rootScope',
|
'generateList', 'PaginateInit', 'SetStatus', 'DashboardHostService', 'hosts', '$rootScope', 'SearchInit',
|
||||||
function($scope, $state, $stateParams, PageRangeSetup, GetBasePath, DashboardHostsList, GenerateList, PaginateInit, SetStatus, DashboardHostService, hosts, $rootScope){
|
function($scope, $state, $stateParams, PageRangeSetup, GetBasePath, DashboardHostsList, GenerateList, PaginateInit, SetStatus, DashboardHostService, hosts, $rootScope, SearchInit){
|
||||||
var setJobStatus = function(){
|
var setJobStatus = function(){
|
||||||
_.forEach($scope.hosts, function(value){
|
_.forEach($scope.hosts, function(value){
|
||||||
SetStatus({
|
SetStatus({
|
||||||
@@ -59,6 +59,12 @@ export default
|
|||||||
$scope.hosts = hosts.results;
|
$scope.hosts = hosts.results;
|
||||||
setJobStatus();
|
setJobStatus();
|
||||||
generator.inject(list, {mode: 'edit', scope: $scope});
|
generator.inject(list, {mode: 'edit', scope: $scope});
|
||||||
|
SearchInit({
|
||||||
|
scope: $scope,
|
||||||
|
set: 'hosts',
|
||||||
|
list: list,
|
||||||
|
url: defaultUrl
|
||||||
|
});
|
||||||
PaginateInit({
|
PaginateInit({
|
||||||
scope: $scope,
|
scope: $scope,
|
||||||
list: list,
|
list: list,
|
||||||
@@ -77,6 +83,7 @@ export default
|
|||||||
$scope.rowBeingEdited = $state.params.id;
|
$scope.rowBeingEdited = $state.params.id;
|
||||||
$scope.listBeingEdited = "hosts";
|
$scope.listBeingEdited = "hosts";
|
||||||
}
|
}
|
||||||
|
$scope.search(list.iterator);
|
||||||
};
|
};
|
||||||
init();
|
init();
|
||||||
}];
|
}];
|
||||||
|
|||||||
@@ -101,10 +101,8 @@
|
|||||||
|
|
||||||
.DashboardList-nameCell {
|
.DashboardList-nameCell {
|
||||||
padding-left: 15px;
|
padding-left: 15px;
|
||||||
text-overflow: ellipsis;
|
|
||||||
overflow:hidden;
|
|
||||||
white-space: nowrap;
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
word-wrap: break-word;
|
||||||
}
|
}
|
||||||
|
|
||||||
.DashboardList-nameContainer {
|
.DashboardList-nameContainer {
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ export default
|
|||||||
permissions: {
|
permissions: {
|
||||||
awToolTip: 'Please save before assigning permissions',
|
awToolTip: 'Please save before assigning permissions',
|
||||||
dataPlacement: 'top',
|
dataPlacement: 'top',
|
||||||
basePath: 'projects/:id/access_list/',
|
basePath: 'inventories/:id/access_list/',
|
||||||
type: 'collection',
|
type: 'collection',
|
||||||
title: 'Permissions',
|
title: 'Permissions',
|
||||||
iterator: 'permission',
|
iterator: 'permission',
|
||||||
|
|||||||
@@ -281,7 +281,7 @@ export default
|
|||||||
column: 2,
|
column: 2,
|
||||||
awPopOver: "callback_help",
|
awPopOver: "callback_help",
|
||||||
awPopOverWatch: "callback_help",
|
awPopOverWatch: "callback_help",
|
||||||
dataPlacement: 'right',
|
dataPlacement: 'top',
|
||||||
dataTitle: 'Provisioning Callback URL',
|
dataTitle: 'Provisioning Callback URL',
|
||||||
dataContainer: "body"
|
dataContainer: "body"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ export default
|
|||||||
label: 'Username',
|
label: 'Username',
|
||||||
type: 'text',
|
type: 'text',
|
||||||
awRequiredWhen: {
|
awRequiredWhen: {
|
||||||
reqExpression: "not_ldap_user",
|
reqExpression: "not_ldap_user && external_account === null",
|
||||||
init: true
|
init: true
|
||||||
},
|
},
|
||||||
autocomplete: false
|
autocomplete: false
|
||||||
@@ -69,7 +69,7 @@ export default
|
|||||||
label: 'Password',
|
label: 'Password',
|
||||||
type: 'sensitive',
|
type: 'sensitive',
|
||||||
hasShowInputButton: true,
|
hasShowInputButton: true,
|
||||||
ngShow: 'ldap_user == false && socialAuthUser === false',
|
ngShow: 'ldap_user == false && socialAuthUser === false && external_account === null',
|
||||||
addRequired: true,
|
addRequired: true,
|
||||||
editRequired: false,
|
editRequired: false,
|
||||||
ngChange: "clearPWConfirm('password_confirm')",
|
ngChange: "clearPWConfirm('password_confirm')",
|
||||||
@@ -80,7 +80,7 @@ export default
|
|||||||
label: 'Confirm Password',
|
label: 'Confirm Password',
|
||||||
type: 'sensitive',
|
type: 'sensitive',
|
||||||
hasShowInputButton: true,
|
hasShowInputButton: true,
|
||||||
ngShow: 'ldap_user == false && socialAuthUser === false',
|
ngShow: 'ldap_user == false && socialAuthUser === false && external_account === null',
|
||||||
addRequired: true,
|
addRequired: true,
|
||||||
editRequired: false,
|
editRequired: false,
|
||||||
awPassMatch: true,
|
awPassMatch: true,
|
||||||
|
|||||||
@@ -55,9 +55,9 @@ export default
|
|||||||
// Submit request to run an adhoc comamand
|
// Submit request to run an adhoc comamand
|
||||||
.factory('AdhocRun', ['$location','$stateParams', 'LaunchJob',
|
.factory('AdhocRun', ['$location','$stateParams', 'LaunchJob',
|
||||||
'PromptForPasswords', 'Rest', 'GetBasePath', 'Alert', 'ProcessErrors',
|
'PromptForPasswords', 'Rest', 'GetBasePath', 'Alert', 'ProcessErrors',
|
||||||
'Wait', 'Empty', 'CreateLaunchDialog',
|
'Wait', 'Empty', 'CreateLaunchDialog', '$state',
|
||||||
function ($location, $stateParams, LaunchJob, PromptForPasswords,
|
function ($location, $stateParams, LaunchJob, PromptForPasswords,
|
||||||
Rest, GetBasePath, Alert, ProcessErrors, Wait, Empty, CreateLaunchDialog) {
|
Rest, GetBasePath, Alert, ProcessErrors, Wait, Empty, CreateLaunchDialog, $state) {
|
||||||
return function (params) {
|
return function (params) {
|
||||||
var id = params.project_id,
|
var id = params.project_id,
|
||||||
scope = params.scope.$new(),
|
scope = params.scope.$new(),
|
||||||
@@ -87,25 +87,31 @@ export default
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
if (scope.removeAdhocLaunchFinished) {
|
|
||||||
scope.removeAdhocLaunchFinished();
|
|
||||||
}
|
|
||||||
scope.removeAdhocLaunchFinished = scope.$on('AdhocLaunchFinished',
|
|
||||||
function(e, data) {
|
|
||||||
$location.path('/ad_hoc_commands/' + data.id);
|
|
||||||
});
|
|
||||||
|
|
||||||
if (scope.removeStartAdhocRun) {
|
if (scope.removeStartAdhocRun) {
|
||||||
scope.removeStartAdhocRun();
|
scope.removeStartAdhocRun();
|
||||||
}
|
}
|
||||||
|
|
||||||
scope.removeStartAdhocRun = scope.$on('StartAdhocRun', function() {
|
scope.removeStartAdhocRun = scope.$on('StartAdhocRun', function() {
|
||||||
LaunchJob({
|
var password,
|
||||||
scope: scope,
|
postData={};
|
||||||
url: url,
|
for (password in scope.passwords) {
|
||||||
callback: 'AdhocLaunchFinished' // send to the adhoc
|
postData[scope.passwords[password]] = scope[
|
||||||
// standard out page
|
scope.passwords[password]
|
||||||
});
|
];
|
||||||
|
}
|
||||||
|
// Re-launch the adhoc job
|
||||||
|
Rest.setUrl(url);
|
||||||
|
Rest.post(postData)
|
||||||
|
.success(function (data) {
|
||||||
|
Wait('stop');
|
||||||
|
$state.go('adHocJobStdout', {id: data.id});
|
||||||
|
})
|
||||||
|
.error(function (data, status) {
|
||||||
|
ProcessErrors(scope, data, status, {
|
||||||
|
hdr: 'Error!',
|
||||||
|
msg: 'Failed to launch adhoc command. POST ' +
|
||||||
|
'returned status: ' + status });
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// start routine only if passwords need to be prompted
|
// start routine only if passwords need to be prompted
|
||||||
|
|||||||
@@ -165,6 +165,7 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', listGenerator.name
|
|||||||
has_inventory_sources = params.has_inventory_sources,
|
has_inventory_sources = params.has_inventory_sources,
|
||||||
launch_class = '',
|
launch_class = '',
|
||||||
launch_tip = 'Start sync process',
|
launch_tip = 'Start sync process',
|
||||||
|
schedule_tip = 'Schedule future inventory syncs',
|
||||||
stat, stat_class, status_tip;
|
stat, stat_class, status_tip;
|
||||||
|
|
||||||
stat = status;
|
stat = status;
|
||||||
@@ -225,7 +226,8 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', listGenerator.name
|
|||||||
"tooltip": status_tip,
|
"tooltip": status_tip,
|
||||||
"status": stat,
|
"status": stat,
|
||||||
"launch_class": launch_class,
|
"launch_class": launch_class,
|
||||||
"launch_tip": launch_tip
|
"launch_tip": launch_tip,
|
||||||
|
"schedule_tip": schedule_tip
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,8 @@ export default
|
|||||||
fld = (params.variable) ? params.variable : 'variables',
|
fld = (params.variable) ? params.variable : 'variables',
|
||||||
pfld = (params.parse_variable) ? params.parse_variable : 'parseType',
|
pfld = (params.parse_variable) ? params.parse_variable : 'parseType',
|
||||||
onReady = params.onReady,
|
onReady = params.onReady,
|
||||||
onChange = params.onChange;
|
onChange = params.onChange,
|
||||||
|
readOnly = params.readOnly;
|
||||||
|
|
||||||
function removeField(fld) {
|
function removeField(fld) {
|
||||||
//set our model to the last change in CodeMirror and then destroy CodeMirror
|
//set our model to the last change in CodeMirror and then destroy CodeMirror
|
||||||
@@ -35,8 +36,7 @@ export default
|
|||||||
|
|
||||||
function createField(onChange, onReady, fld) {
|
function createField(onChange, onReady, fld) {
|
||||||
//hide the textarea and show a fresh CodeMirror with the current mode (json or yaml)
|
//hide the textarea and show a fresh CodeMirror with the current mode (json or yaml)
|
||||||
|
scope[fld + 'codeMirror'] = AngularCodeMirror(readOnly);
|
||||||
scope[fld + 'codeMirror'] = AngularCodeMirror();
|
|
||||||
scope[fld + 'codeMirror'].addModes($AnsibleConfig.variable_edit_modes);
|
scope[fld + 'codeMirror'].addModes($AnsibleConfig.variable_edit_modes);
|
||||||
scope[fld + 'codeMirror'].showTextArea({
|
scope[fld + 'codeMirror'].showTextArea({
|
||||||
scope: scope,
|
scope: scope,
|
||||||
|
|||||||
@@ -75,6 +75,9 @@ export default
|
|||||||
case 'missing':
|
case 'missing':
|
||||||
result = 'Missing. Click for details';
|
result = 'Missing. Click for details';
|
||||||
break;
|
break;
|
||||||
|
case 'canceled':
|
||||||
|
result = 'Canceled. Click for details';
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -242,7 +242,7 @@ function adhocController($q, $scope, $location, $stateParams,
|
|||||||
Rest.post(data)
|
Rest.post(data)
|
||||||
.success(function (data) {
|
.success(function (data) {
|
||||||
Wait('stop');
|
Wait('stop');
|
||||||
$location.path("/ad_hoc_commands/" + data.id);
|
$state.go('adHocJobStdout', {id: data.id});
|
||||||
})
|
})
|
||||||
.error(function (data, status) {
|
.error(function (data, status) {
|
||||||
ProcessErrors($scope, data, status, adhocForm, {
|
ProcessErrors($scope, data, status, adhocForm, {
|
||||||
|
|||||||
@@ -151,6 +151,7 @@
|
|||||||
{status_tooltip: group_status.tooltip},
|
{status_tooltip: group_status.tooltip},
|
||||||
{launch_tooltip: group_status.launch_tip},
|
{launch_tooltip: group_status.launch_tip},
|
||||||
{launch_class: group_status.launch_class},
|
{launch_class: group_status.launch_class},
|
||||||
|
{group_schedule_tooltip: group_status.schedule_tip},
|
||||||
{hosts_status_tip: hosts_status.tooltip},
|
{hosts_status_tip: hosts_status.tooltip},
|
||||||
{hosts_status_class: hosts_status.class},
|
{hosts_status_class: hosts_status.class},
|
||||||
{source: group.summary_fields.inventory_source ? group.summary_fields.inventory_source.source : null},
|
{source: group.summary_fields.inventory_source ? group.summary_fields.inventory_source.source : null},
|
||||||
|
|||||||
@@ -641,7 +641,7 @@ export default
|
|||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
//scope.setSearchAll('host');
|
//scope.setSearchAll('host');
|
||||||
ParseTypeChange({ scope: scope, field_id: 'pre-formatted-variables' });
|
ParseTypeChange({ scope: scope, field_id: 'pre-formatted-variables', readOnly: true });
|
||||||
scope.$emit('LoadPlays', data.related.job_events);
|
scope.$emit('LoadPlays', data.related.job_events);
|
||||||
})
|
})
|
||||||
.error(function(data, status) {
|
.error(function(data, status) {
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.LabelList-tagContainer,
|
.LabelList-tagContainer,
|
||||||
.LabelList-seeMore {
|
.LabelList-seeMoreLess {
|
||||||
display: flex;
|
display: flex;
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
}
|
}
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.LabelList-seeMore {
|
.LabelList-seeMoreLess {
|
||||||
color: @default-link;
|
color: @default-link;
|
||||||
margin: 4px 0px;
|
margin: 4px 0px;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
@@ -37,7 +37,7 @@
|
|||||||
font-size: 11px;
|
font-size: 11px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.LabelList-seeMore:hover {
|
.LabelList-seeMoreLess:hover {
|
||||||
color: @default-link-hov;
|
color: @default-link-hov;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -47,6 +47,13 @@ export default
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
scope.seeLess = function() {
|
||||||
|
// Trim the labels array back down to 10 items
|
||||||
|
scope.labels = scope.labels.slice(0, 10);
|
||||||
|
// Re-set the seeMoreInteractive flag so that the "See More" will be displayed
|
||||||
|
scope.seeMoreInactive = true;
|
||||||
|
};
|
||||||
|
|
||||||
scope.deleteLabel = function(templateId, templateName, labelId, labelName) {
|
scope.deleteLabel = function(templateId, templateName, labelId, labelName) {
|
||||||
var action = function () {
|
var action = function () {
|
||||||
$('#prompt-modal').modal('hide');
|
$('#prompt-modal').modal('hide');
|
||||||
@@ -56,13 +63,13 @@ export default
|
|||||||
Rest.setUrl(url);
|
Rest.setUrl(url);
|
||||||
Rest.post({"disassociate": true, "id": labelId})
|
Rest.post({"disassociate": true, "id": labelId})
|
||||||
.success(function () {
|
.success(function () {
|
||||||
scope.search("job_template");
|
scope.search("job_template", scope.$parent.job_template_page);
|
||||||
Wait('stop');
|
Wait('stop');
|
||||||
})
|
})
|
||||||
.error(function (data, status) {
|
.error(function (data, status) {
|
||||||
Wait('stop');
|
Wait('stop');
|
||||||
ProcessErrors(scope, data, status, null, { hdr: 'Error!',
|
ProcessErrors(scope, data, status, null, { hdr: 'Error!',
|
||||||
msg: 'Could not disacssociate label from JT. Call to ' + url + ' failed. DELETE returned status: ' + status });
|
msg: 'Could not disassociate label from JT. Call to ' + url + ' failed. DELETE returned status: ' + status });
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -86,6 +93,7 @@ export default
|
|||||||
scope.count = null;
|
scope.count = null;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,5 +8,7 @@
|
|||||||
<span class="LabelList-name">{{ label.name }}</span>
|
<span class="LabelList-name">{{ label.name }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="LabelList-seeMore" ng-show="count > 10 && seeMoreInactive"
|
<div class="LabelList-seeMoreLess" ng-show="count > 10 && seeMoreInactive"
|
||||||
ng-click="seeMore()">View More</div>
|
ng-click="seeMore()">View More</div>
|
||||||
|
<div class="LabelList-seeMoreLess" ng-show="count > 10 && !seeMoreInactive"
|
||||||
|
ng-click="seeLess()">View Less</div>
|
||||||
|
|||||||
@@ -314,7 +314,7 @@ export default
|
|||||||
ngClick: 'submitQuestion($event)',
|
ngClick: 'submitQuestion($event)',
|
||||||
ngDisabled: true,
|
ngDisabled: true,
|
||||||
'class': 'btn btn-sm Form-saveButton',
|
'class': 'btn btn-sm Form-saveButton',
|
||||||
label: '{{editQuestionIndex === null ? "ADD" : "UPDATE"}}'
|
label: '{{editQuestionIndex === null ? "+ ADD" : "UPDATE"}}'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -48,9 +48,6 @@ export default
|
|||||||
columnClass: 'col-lg-2 col-md-3 col-sm-4 col-xs-6',
|
columnClass: 'col-lg-2 col-md-3 col-sm-4 col-xs-6',
|
||||||
ngClick: "viewJobDetails(all_job)",
|
ngClick: "viewJobDetails(all_job)",
|
||||||
defaultSearchField: true,
|
defaultSearchField: true,
|
||||||
awToolTip: "{{ all_job.name | sanitize }}",
|
|
||||||
dataTipWatch: 'all_job.name',
|
|
||||||
dataPlacement: 'top'
|
|
||||||
},
|
},
|
||||||
type: {
|
type: {
|
||||||
label: 'Type',
|
label: 'Type',
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ export default
|
|||||||
ngClick:"viewJobDetails(completed_job)",
|
ngClick:"viewJobDetails(completed_job)",
|
||||||
searchable: true,
|
searchable: true,
|
||||||
searchType: 'select',
|
searchType: 'select',
|
||||||
|
defaultSearchField: true,
|
||||||
nosort: true,
|
nosort: true,
|
||||||
searchOptions: [
|
searchOptions: [
|
||||||
{ label: "Success", value: "successful" },
|
{ label: "Success", value: "successful" },
|
||||||
@@ -54,8 +55,8 @@ export default
|
|||||||
name: {
|
name: {
|
||||||
label: 'Name',
|
label: 'Name',
|
||||||
columnClass: 'col-lg-4 col-md-4 col-sm-4 col-xs-6',
|
columnClass: 'col-lg-4 col-md-4 col-sm-4 col-xs-6',
|
||||||
|
searchable: false,
|
||||||
ngClick: "viewJobDetails(completed_job)",
|
ngClick: "viewJobDetails(completed_job)",
|
||||||
defaultSearchField: true,
|
|
||||||
awToolTip: "{{ completed_job.name | sanitize }}",
|
awToolTip: "{{ completed_job.name | sanitize }}",
|
||||||
dataPlacement: 'top'
|
dataPlacement: 'top'
|
||||||
},
|
},
|
||||||
@@ -64,7 +65,7 @@ export default
|
|||||||
ngBind: 'completed_job.type_label',
|
ngBind: 'completed_job.type_label',
|
||||||
link: false,
|
link: false,
|
||||||
columnClass: "col-lg-2 col-md-2 hidden-sm hidden-xs",
|
columnClass: "col-lg-2 col-md-2 hidden-sm hidden-xs",
|
||||||
searchable: true,
|
searchable: false,
|
||||||
searchType: 'select',
|
searchType: 'select',
|
||||||
searchOptions: [] // populated via GetChoices() in controller
|
searchOptions: [] // populated via GetChoices() in controller
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -36,6 +36,8 @@ export default ['Wait', 'GetBasePath', 'ProcessErrors', 'Rest',
|
|||||||
disassociate: 1
|
disassociate: 1
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
// Show the working spinner
|
||||||
|
Wait('start');
|
||||||
Rest.setUrl(url);
|
Rest.setUrl(url);
|
||||||
Rest.post(params)
|
Rest.post(params)
|
||||||
.success( function(data) {
|
.success( function(data) {
|
||||||
@@ -43,9 +45,8 @@ export default ['Wait', 'GetBasePath', 'ProcessErrors', 'Rest',
|
|||||||
scope.$emit(callback, data.id);
|
scope.$emit(callback, data.id);
|
||||||
notifier[column] = !notifier[column];
|
notifier[column] = !notifier[column];
|
||||||
}
|
}
|
||||||
else {
|
// Hide the working spinner
|
||||||
Wait('stop');
|
Wait('stop');
|
||||||
}
|
|
||||||
})
|
})
|
||||||
.error( function(data, status) {
|
.error( function(data, status) {
|
||||||
ProcessErrors(scope, data, status, null, { hdr: 'Error!',
|
ProcessErrors(scope, data, status, null, { hdr: 'Error!',
|
||||||
|
|||||||
@@ -334,11 +334,8 @@ export default ['$scope', '$rootScope', '$location', '$log',
|
|||||||
|
|
||||||
$scope.editSchedules = function(id) {
|
$scope.editSchedules = function(id) {
|
||||||
var project = Find({ list: $scope.projects, key: 'id', val: id });
|
var project = Find({ list: $scope.projects, key: 'id', val: id });
|
||||||
if (project.scm_type === "Manual" || Empty(project.scm_type)) {
|
if (!(project.scm_type === "Manual" || Empty(project.scm_type)) && !(project.status === 'updating' || project.status === 'running' || project.status === 'pending')) {
|
||||||
// Nothing to do
|
$state.go('projectSchedules', {id: id});
|
||||||
}
|
|
||||||
else {
|
|
||||||
$location.path('/projects/' + id + '/schedules');
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -134,6 +134,7 @@ angular.module('Utilities', ['RestServices', 'Utilities', 'sanitizeFilter'])
|
|||||||
});
|
});
|
||||||
$(document).bind('keydown', function (e) {
|
$(document).bind('keydown', function (e) {
|
||||||
if (e.keyCode === 27 || e.keyCode === 13) {
|
if (e.keyCode === 27 || e.keyCode === 13) {
|
||||||
|
e.preventDefault();
|
||||||
$('#alert-modal2').modal('hide');
|
$('#alert-modal2').modal('hide');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -161,6 +162,7 @@ angular.module('Utilities', ['RestServices', 'Utilities', 'sanitizeFilter'])
|
|||||||
});
|
});
|
||||||
$(document).bind('keydown', function (e) {
|
$(document).bind('keydown', function (e) {
|
||||||
if (e.keyCode === 27 || e.keyCode === 13) {
|
if (e.keyCode === 27 || e.keyCode === 13) {
|
||||||
|
e.preventDefault();
|
||||||
$('#alert-modal').modal('hide');
|
$('#alert-modal').modal('hide');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -390,46 +390,57 @@ angular.module('AWDirectives', ['RestServices', 'Utilities', 'JobsHelper'])
|
|||||||
|
|
||||||
// lookup Validate lookup value against API
|
// lookup Validate lookup value against API
|
||||||
//
|
//
|
||||||
.directive('awlookup', ['Rest', function(Rest) {
|
.directive('awlookup', ['Rest', '$timeout', function(Rest, $timeout) {
|
||||||
return {
|
return {
|
||||||
require: 'ngModel',
|
require: 'ngModel',
|
||||||
link: function(scope, elm, attrs, ctrl) {
|
link: function(scope, elm, attrs, ctrl) {
|
||||||
|
|
||||||
|
var restTimeout;
|
||||||
|
|
||||||
ctrl.$parsers.unshift( function(viewValue) {
|
ctrl.$parsers.unshift( function(viewValue) {
|
||||||
if (viewValue !== '' && viewValue !== null) {
|
if (viewValue !== '' && viewValue !== null) {
|
||||||
var url = elm.attr('data-url');
|
var url = elm.attr('data-url');
|
||||||
url = url.replace(/\:value/, encodeURI(viewValue));
|
url = url.replace(/\:value/, encodeURI(viewValue));
|
||||||
scope[elm.attr('data-source')] = null;
|
scope[elm.attr('data-source')] = null;
|
||||||
Rest.setUrl(url);
|
if(restTimeout) {
|
||||||
Rest.get().then( function(data) {
|
$timeout.cancel(restTimeout);
|
||||||
var results = data.data.results;
|
}
|
||||||
if (results.length > 0) {
|
restTimeout = $timeout( function(){
|
||||||
scope[elm.attr('data-source')] = results[0].id;
|
Rest.setUrl(url);
|
||||||
|
Rest.get().then( function(data) {
|
||||||
|
var results = data.data.results;
|
||||||
|
if (results.length > 0) {
|
||||||
|
scope[elm.attr('data-source')] = results[0].id;
|
||||||
|
|
||||||
// For user lookups the API endpoint doesn't
|
// For user lookups the API endpoint doesn't
|
||||||
// have a `name` property, so this is `undefined`
|
// have a `name` property, so this is `undefined`
|
||||||
// which causes the input to clear after typing
|
// which causes the input to clear after typing
|
||||||
// a valid value O_o
|
// a valid value O_o
|
||||||
//
|
//
|
||||||
// Only assign if there is a value, so that we avoid
|
// Only assign if there is a value, so that we avoid
|
||||||
// this situation.
|
// this situation.
|
||||||
//
|
//
|
||||||
// TODO: Evaluate if assigning name on the scope is
|
// TODO: Evaluate if assigning name on the scope is
|
||||||
// even necessary at all.
|
// even necessary at all.
|
||||||
//
|
//
|
||||||
if (!_.isEmpty(results[0].name)) {
|
if (!_.isEmpty(results[0].name)) {
|
||||||
scope[elm.attr('name')] = results[0].name;
|
scope[elm.attr('name')] = results[0].name;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctrl.$setValidity('required', true);
|
||||||
|
ctrl.$setValidity('awlookup', true);
|
||||||
|
return viewValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctrl.$setValidity('required', true);
|
ctrl.$setValidity('required', true);
|
||||||
ctrl.$setValidity('awlookup', true);
|
ctrl.$setValidity('awlookup', false);
|
||||||
return viewValue;
|
return undefined;
|
||||||
}
|
});
|
||||||
ctrl.$setValidity('required', true);
|
}, 750);
|
||||||
ctrl.$setValidity('awlookup', false);
|
|
||||||
return undefined;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
if(restTimeout) {
|
||||||
|
$timeout.cancel(restTimeout);
|
||||||
|
}
|
||||||
ctrl.$setValidity('awlookup', true);
|
ctrl.$setValidity('awlookup', true);
|
||||||
scope[elm.attr('data-source')] = null;
|
scope[elm.attr('data-source')] = null;
|
||||||
}
|
}
|
||||||
@@ -477,7 +488,8 @@ angular.module('AWDirectives', ['RestServices', 'Utilities', 'JobsHelper'])
|
|||||||
return {
|
return {
|
||||||
link: function(scope, element, attrs) {
|
link: function(scope, element, attrs) {
|
||||||
var delay = (attrs.delay !== undefined && attrs.delay !== null) ? attrs.delay : ($AnsibleConfig) ? $AnsibleConfig.tooltip_delay : {show: 500, hide: 100},
|
var delay = (attrs.delay !== undefined && attrs.delay !== null) ? attrs.delay : ($AnsibleConfig) ? $AnsibleConfig.tooltip_delay : {show: 500, hide: 100},
|
||||||
placement;
|
placement,
|
||||||
|
stateChangeWatcher;
|
||||||
if (attrs.awTipPlacement) {
|
if (attrs.awTipPlacement) {
|
||||||
placement = attrs.awTipPlacement;
|
placement = attrs.awTipPlacement;
|
||||||
}
|
}
|
||||||
@@ -493,6 +505,22 @@ angular.module('AWDirectives', ['RestServices', 'Utilities', 'JobsHelper'])
|
|||||||
template = '<div class="tooltip Tooltip" role="tooltip"><div class="tooltip-arrow Tooltip-arrow"></div><div class="tooltip-inner Tooltip-inner"></div></div>';
|
template = '<div class="tooltip Tooltip" role="tooltip"><div class="tooltip-arrow Tooltip-arrow"></div><div class="tooltip-inner Tooltip-inner"></div></div>';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This block helps clean up tooltips that may get orphaned by a click event
|
||||||
|
$(element).on('mouseenter', function() {
|
||||||
|
if(stateChangeWatcher) {
|
||||||
|
// Un-bind - we don't want a bunch of listeners firing
|
||||||
|
stateChangeWatcher();
|
||||||
|
}
|
||||||
|
stateChangeWatcher = scope.$on('$stateChangeStart', function() {
|
||||||
|
// Go ahead and force the tooltip setTimeout to expire (if it hasn't already fired)
|
||||||
|
$(element).tooltip('hide');
|
||||||
|
// Clean up any existing tooltips including this one
|
||||||
|
$('.tooltip').each(function() {
|
||||||
|
$(this).remove();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
$(element).on('hidden.bs.tooltip', function( ) {
|
$(element).on('hidden.bs.tooltip', function( ) {
|
||||||
// TB3RC1 is leaving behind tooltip <div> elements. This will remove them
|
// TB3RC1 is leaving behind tooltip <div> elements. This will remove them
|
||||||
// after a tooltip fades away. If not, they lay overtop of other elements and
|
// after a tooltip fades away. If not, they lay overtop of other elements and
|
||||||
|
|||||||
@@ -1487,6 +1487,8 @@ angular.module('FormGenerator', [GeneratorHelpers.name, 'Utilities', listGenerat
|
|||||||
"ng-show='is_system_auditor'>Auditor</span>";
|
"ng-show='is_system_auditor'>Auditor</span>";
|
||||||
html+= "<span class=\"Form-title--is_ldap_user\" "+
|
html+= "<span class=\"Form-title--is_ldap_user\" "+
|
||||||
"ng-show='ldap_user'>LDAP</span>";
|
"ng-show='ldap_user'>LDAP</span>";
|
||||||
|
html+= "<span class=\"Form-title--is_external_account\" "+
|
||||||
|
"ng-show='external_account'>{{external_account}}</span>";
|
||||||
}
|
}
|
||||||
html += "</div>\n";
|
html += "</div>\n";
|
||||||
html += "<div class=\"Form-header--fields\">";
|
html += "<div class=\"Form-header--fields\">";
|
||||||
|
|||||||
@@ -466,7 +466,7 @@ export default ['$location', '$compile', '$rootScope', 'SearchWidget', 'Paginate
|
|||||||
innerTable += "ng-class-odd=\"'List-tableRow--oddRow'\" ";
|
innerTable += "ng-class-odd=\"'List-tableRow--oddRow'\" ";
|
||||||
innerTable += "ng-class-even=\"'List-tableRow--evenRow'\" ";
|
innerTable += "ng-class-even=\"'List-tableRow--evenRow'\" ";
|
||||||
innerTable += "ng-repeat=\"" + list.iterator + " in " + list.name;
|
innerTable += "ng-repeat=\"" + list.iterator + " in " + list.name;
|
||||||
innerTable += (list.trackBy) ? " track by " + list.trackBy : " track by $index";
|
innerTable += (list.trackBy) ? " track by " + list.trackBy : "";
|
||||||
innerTable += (list.orderBy) ? " | orderBy:'" + list.orderBy + "'" : "";
|
innerTable += (list.orderBy) ? " | orderBy:'" + list.orderBy + "'" : "";
|
||||||
innerTable += (list.filterBy) ? " | filter: " + list.filterBy : "";
|
innerTable += (list.filterBy) ? " | filter: " + list.filterBy : "";
|
||||||
innerTable += "\">\n";
|
innerTable += "\">\n";
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ export function JobStdoutController ($rootScope, $scope, $state, $stateParams,
|
|||||||
$scope.limit = data.limit;
|
$scope.limit = data.limit;
|
||||||
$scope.verbosity = data.verbosity;
|
$scope.verbosity = data.verbosity;
|
||||||
$scope.job_tags = data.job_tags;
|
$scope.job_tags = data.job_tags;
|
||||||
|
$scope.job.module_name = data.module_name;
|
||||||
if (data.extra_vars) {
|
if (data.extra_vars) {
|
||||||
$scope.variables = ParseVariableString(data.extra_vars);
|
$scope.variables = ParseVariableString(data.extra_vars);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user