mirror of
https://github.com/ansible/awx.git
synced 2026-02-25 06:56:00 -03:30
Small fixes based on PR review feedback
This commit is contained in:
@@ -379,7 +379,6 @@ table, tbody {
|
|||||||
height: 0;
|
height: 0;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
border-top: 4px dashed;
|
border-top: 4px dashed;
|
||||||
border-top: 4px solid\9;
|
|
||||||
border-right: 4px solid transparent;
|
border-right: 4px solid transparent;
|
||||||
border-left: 4px solid transparent;
|
border-left: 4px solid transparent;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -162,7 +162,6 @@ var tower = angular.module('Tower', [
|
|||||||
'ProjectsHelper',
|
'ProjectsHelper',
|
||||||
'CompletedJobsDefinition',
|
'CompletedJobsDefinition',
|
||||||
'AllJobsDefinition',
|
'AllJobsDefinition',
|
||||||
'JobFormDefinition',
|
|
||||||
'JobSummaryDefinition',
|
'JobSummaryDefinition',
|
||||||
'ParseHelper',
|
'ParseHelper',
|
||||||
'ChildrenHelper',
|
'ChildrenHelper',
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ import JobEventData from "./forms/JobEventData";
|
|||||||
import JobSummary from "./forms/JobSummary";
|
import JobSummary from "./forms/JobSummary";
|
||||||
import JobTemplates from "./forms/JobTemplates";
|
import JobTemplates from "./forms/JobTemplates";
|
||||||
import JobVarsPrompt from "./forms/JobVarsPrompt";
|
import JobVarsPrompt from "./forms/JobVarsPrompt";
|
||||||
import Jobs from "./forms/Jobs";
|
|
||||||
import LogViewerOptions from "./forms/LogViewerOptions";
|
import LogViewerOptions from "./forms/LogViewerOptions";
|
||||||
import LogViewerStatus from "./forms/LogViewerStatus";
|
import LogViewerStatus from "./forms/LogViewerStatus";
|
||||||
import Organizations from "./forms/Organizations";
|
import Organizations from "./forms/Organizations";
|
||||||
@@ -41,7 +40,6 @@ export
|
|||||||
JobSummary,
|
JobSummary,
|
||||||
JobTemplates,
|
JobTemplates,
|
||||||
JobVarsPrompt,
|
JobVarsPrompt,
|
||||||
Jobs,
|
|
||||||
LogViewerOptions,
|
LogViewerOptions,
|
||||||
LogViewerStatus,
|
LogViewerStatus,
|
||||||
Organizations,
|
Organizations,
|
||||||
|
|||||||
@@ -1,118 +0,0 @@
|
|||||||
/*************************************************
|
|
||||||
* Copyright (c) 2015 Ansible, Inc.
|
|
||||||
*
|
|
||||||
* All Rights Reserved
|
|
||||||
*************************************************/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @ngdoc function
|
|
||||||
* @name forms.function:Jobs
|
|
||||||
* @description This form is for adding/editing a Job
|
|
||||||
*/
|
|
||||||
|
|
||||||
// @issue PLEASE KILL ME I NEED TO DIE
|
|
||||||
|
|
||||||
export default
|
|
||||||
angular.module('JobFormDefinition', [])
|
|
||||||
.value('JobForm', {
|
|
||||||
|
|
||||||
addTitle: 'Create Job',
|
|
||||||
editTitle: '{{ id }} - {{ name }}',
|
|
||||||
name: 'jobs',
|
|
||||||
stateTree: 'jobs',
|
|
||||||
well: true,
|
|
||||||
base: 'jobs',
|
|
||||||
tabs: true,
|
|
||||||
|
|
||||||
navigationLinks: {
|
|
||||||
details: {
|
|
||||||
href: "/#/jobs/{{ job_id }}",
|
|
||||||
label: 'Status',
|
|
||||||
icon: 'icon-zoom-in',
|
|
||||||
active: true,
|
|
||||||
ngShow: "job_id !== null"
|
|
||||||
},
|
|
||||||
events: {
|
|
||||||
href: "/#/jobs/{{ job_id }}/job_events",
|
|
||||||
label: 'Events',
|
|
||||||
icon: 'icon-list-ul'
|
|
||||||
},
|
|
||||||
hosts: {
|
|
||||||
href: "/#/jobs/{{ job_id }}/job_host_summaries",
|
|
||||||
label: 'Host Summary',
|
|
||||||
icon: 'icon-laptop'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
fields: {
|
|
||||||
status: {
|
|
||||||
type: 'custom',
|
|
||||||
control: "<i class=\"fa icon-job-{{ status }}\"></i> {{ job_explanation }}",
|
|
||||||
readonly: true
|
|
||||||
},
|
|
||||||
result_stdout: {
|
|
||||||
label: 'Standard Out',
|
|
||||||
type: 'textarea',
|
|
||||||
readonly: true,
|
|
||||||
xtraWide: true,
|
|
||||||
rows: "{{ stdout_rows }}",
|
|
||||||
"class": 'nowrap mono-space allowresize',
|
|
||||||
ngShow: "result_stdout != ''"
|
|
||||||
},
|
|
||||||
result_traceback: {
|
|
||||||
label: 'Traceback',
|
|
||||||
type: 'textarea',
|
|
||||||
xtraWide: true,
|
|
||||||
readonly: true,
|
|
||||||
rows: "{{ traceback_rows }}",
|
|
||||||
"class": 'nowrap mono-space allowresize',
|
|
||||||
ngShow: "result_traceback != ''"
|
|
||||||
},
|
|
||||||
type: {
|
|
||||||
label: 'Job Type',
|
|
||||||
type: 'text',
|
|
||||||
readonly: true
|
|
||||||
},
|
|
||||||
launch_type: {
|
|
||||||
label: 'Launch Type',
|
|
||||||
type: 'text',
|
|
||||||
readonly: true
|
|
||||||
},
|
|
||||||
created: {
|
|
||||||
label: 'Created On',
|
|
||||||
type: 'text',
|
|
||||||
readonly: true
|
|
||||||
},
|
|
||||||
modified: {
|
|
||||||
label: 'Last Updated',
|
|
||||||
type: 'text',
|
|
||||||
readonly: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
actions: {
|
|
||||||
refresh: {
|
|
||||||
dataPlacement: 'top',
|
|
||||||
icon: "icon-refresh",
|
|
||||||
iconSize: 'large',
|
|
||||||
mode: 'all',
|
|
||||||
//ngShow: "job_status == 'pending' || job_status == 'waiting' || job_status == 'running'",
|
|
||||||
'class': 'btn-xs btn-primary',
|
|
||||||
awToolTip: "Refresh the page",
|
|
||||||
ngClick: "refresh()"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
related: {
|
|
||||||
job_template: {
|
|
||||||
type: 'collection',
|
|
||||||
title: 'Job Tempate',
|
|
||||||
iterator: 'job',
|
|
||||||
index: false,
|
|
||||||
open: false,
|
|
||||||
|
|
||||||
fields: { }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
@@ -56,7 +56,6 @@ export default
|
|||||||
sourceField: 'name',
|
sourceField: 'name',
|
||||||
ngClick: 'lookUpCredential()',
|
ngClick: 'lookUpCredential()',
|
||||||
requiredErrorMsg: "Please select a Credential.",
|
requiredErrorMsg: "Please select a Credential.",
|
||||||
column: 1,
|
|
||||||
class: 'Form-formGroup--fullWidth',
|
class: 'Form-formGroup--fullWidth',
|
||||||
awPopOver: "<p>Select the credential you want the job to use when accessing the remote hosts. Choose the credential containing " +
|
awPopOver: "<p>Select the credential you want the job to use when accessing the remote hosts. Choose the credential containing " +
|
||||||
" the username and SSH key or password that Ansible will need to log into the remote hosts.</p>",
|
" the username and SSH key or password that Ansible will need to log into the remote hosts.</p>",
|
||||||
@@ -65,7 +64,7 @@ export default
|
|||||||
dataContainer: "body",
|
dataContainer: "body",
|
||||||
ngShow: "selectedTemplate.ask_credential_on_launch",
|
ngShow: "selectedTemplate.ask_credential_on_launch",
|
||||||
awRequiredWhen: {
|
awRequiredWhen: {
|
||||||
reqExpression: 'selectedTemplate.ask_credential_on_launch'
|
reqExpression: 'selectedTemplate && selectedTemplate.ask_credential_on_launch'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
inventory: {
|
inventory: {
|
||||||
@@ -77,7 +76,6 @@ export default
|
|||||||
basePath: 'organization',
|
basePath: 'organization',
|
||||||
ngClick: 'lookUpInventory()',
|
ngClick: 'lookUpInventory()',
|
||||||
requiredErrorMsg: "Please select an Inventory.",
|
requiredErrorMsg: "Please select an Inventory.",
|
||||||
column: 1,
|
|
||||||
class: 'Form-formGroup--fullWidth',
|
class: 'Form-formGroup--fullWidth',
|
||||||
awPopOver: "<p>Select the inventory containing the hosts you want this job to manage.</p>",
|
awPopOver: "<p>Select the inventory containing the hosts you want this job to manage.</p>",
|
||||||
dataTitle: 'Inventory',
|
dataTitle: 'Inventory',
|
||||||
@@ -85,7 +83,7 @@ export default
|
|||||||
dataContainer: "body",
|
dataContainer: "body",
|
||||||
ngShow: "selectedTemplate.ask_inventory_on_launch",
|
ngShow: "selectedTemplate.ask_inventory_on_launch",
|
||||||
awRequiredWhen: {
|
awRequiredWhen: {
|
||||||
reqExpression: 'selectedTemplate.ask_inventory_on_launch'
|
reqExpression: 'selectedTemplate && selectedTemplate.ask_inventory_on_launch'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
job_type: {
|
job_type: {
|
||||||
@@ -93,7 +91,6 @@ export default
|
|||||||
type: 'select',
|
type: 'select',
|
||||||
ngOptions: 'type.label for type in job_type_options track by type.value',
|
ngOptions: 'type.label for type in job_type_options track by type.value',
|
||||||
"default": 0,
|
"default": 0,
|
||||||
column: 1,
|
|
||||||
class: 'Form-formGroup--fullWidth',
|
class: 'Form-formGroup--fullWidth',
|
||||||
awPopOver: "<p>When this template is submitted as a job, setting the type to <em>run</em> will execute the playbook, running tasks " +
|
awPopOver: "<p>When this template is submitted as a job, setting the type to <em>run</em> will execute the playbook, running tasks " +
|
||||||
" on the selected hosts.</p> <p>Setting the type to <em>check</em> will not execute the playbook. Instead, <code>ansible</code> will check playbook " +
|
" on the selected hosts.</p> <p>Setting the type to <em>check</em> will not execute the playbook. Instead, <code>ansible</code> will check playbook " +
|
||||||
@@ -104,15 +101,12 @@ export default
|
|||||||
dataContainer: "body",
|
dataContainer: "body",
|
||||||
ngShow: "selectedTemplate.ask_job_type_on_launch",
|
ngShow: "selectedTemplate.ask_job_type_on_launch",
|
||||||
awRequiredWhen: {
|
awRequiredWhen: {
|
||||||
reqExpression: 'selectedTemplate.ask_job_type_on_launch'
|
reqExpression: 'selectedTemplate && selectedTemplate.ask_job_type_on_launch'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
limit: {
|
limit: {
|
||||||
label: 'Limit',
|
label: 'Limit',
|
||||||
type: 'text',
|
type: 'text',
|
||||||
addRequired: false,
|
|
||||||
editRequired: false,
|
|
||||||
column: 1,
|
|
||||||
class: 'Form-formGroup--fullWidth',
|
class: 'Form-formGroup--fullWidth',
|
||||||
awPopOver: "<p>Provide a host pattern to further constrain the list of hosts that will be managed or affected by the playbook. " +
|
awPopOver: "<p>Provide a host pattern to further constrain the list of hosts that will be managed or affected by the playbook. " +
|
||||||
"Multiple patterns can be separated by ; : or ,</p><p>For more information and examples see " +
|
"Multiple patterns can be separated by ; : or ,</p><p>For more information and examples see " +
|
||||||
@@ -126,10 +120,7 @@ export default
|
|||||||
label: 'Job Tags',
|
label: 'Job Tags',
|
||||||
type: 'textarea',
|
type: 'textarea',
|
||||||
rows: 5,
|
rows: 5,
|
||||||
addRequired: false,
|
|
||||||
editRequired: false,
|
|
||||||
'elementClass': 'Form-textInput',
|
'elementClass': 'Form-textInput',
|
||||||
column: 2,
|
|
||||||
class: 'Form-formGroup--fullWidth',
|
class: 'Form-formGroup--fullWidth',
|
||||||
awPopOver: "<p>Provide a comma separated list of tags.</p>\n" +
|
awPopOver: "<p>Provide a comma separated list of tags.</p>\n" +
|
||||||
"<p>Tags are useful when you have a large playbook, and you want to run a specific part of a play or task.</p>" +
|
"<p>Tags are useful when you have a large playbook, and you want to run a specific part of a play or task.</p>" +
|
||||||
@@ -143,10 +134,7 @@ export default
|
|||||||
label: 'Skip Tags',
|
label: 'Skip Tags',
|
||||||
type: 'textarea',
|
type: 'textarea',
|
||||||
rows: 5,
|
rows: 5,
|
||||||
addRequired: false,
|
|
||||||
editRequired: false,
|
|
||||||
'elementClass': 'Form-textInput',
|
'elementClass': 'Form-textInput',
|
||||||
column: 2,
|
|
||||||
class: 'Form-formGroup--fullWidth',
|
class: 'Form-formGroup--fullWidth',
|
||||||
awPopOver: "<p>Provide a comma separated list of tags.</p>\n" +
|
awPopOver: "<p>Provide a comma separated list of tags.</p>\n" +
|
||||||
"<p>Skip tags are useful when you have a large playbook, and you want to skip specific parts of a play or task.</p>" +
|
"<p>Skip tags are useful when you have a large playbook, and you want to skip specific parts of a play or task.</p>" +
|
||||||
|
|||||||
@@ -36,8 +36,6 @@ export default
|
|||||||
description: {
|
description: {
|
||||||
label: 'Description',
|
label: 'Description',
|
||||||
type: 'text',
|
type: 'text',
|
||||||
addRequired: false,
|
|
||||||
editRequired: false,
|
|
||||||
column: 1
|
column: 1
|
||||||
},
|
},
|
||||||
organization: {
|
organization: {
|
||||||
@@ -58,8 +56,6 @@ export default
|
|||||||
class: 'Form-formGroup--fullWidth',
|
class: 'Form-formGroup--fullWidth',
|
||||||
ngOptions: 'label.label for label in labelOptions track by label.value',
|
ngOptions: 'label.label for label in labelOptions track by label.value',
|
||||||
multiSelect: true,
|
multiSelect: true,
|
||||||
addRequired: false,
|
|
||||||
editRequired: false,
|
|
||||||
dataTitle: 'Labels',
|
dataTitle: 'Labels',
|
||||||
dataPlacement: 'right',
|
dataPlacement: 'right',
|
||||||
awPopOver: "<p>Optional labels that describe this job template, such as 'dev' or 'test'. Labels can be used to group and filter job templates and completed jobs in the Tower display.</p>",
|
awPopOver: "<p>Optional labels that describe this job template, such as 'dev' or 'test'. Labels can be used to group and filter job templates and completed jobs in the Tower display.</p>",
|
||||||
@@ -70,8 +66,6 @@ export default
|
|||||||
type: 'textarea',
|
type: 'textarea',
|
||||||
class: 'Form-textAreaLabel Form-formGroup--fullWidth',
|
class: 'Form-textAreaLabel Form-formGroup--fullWidth',
|
||||||
rows: 6,
|
rows: 6,
|
||||||
addRequired: false,
|
|
||||||
editRequired: false,
|
|
||||||
"default": "---",
|
"default": "---",
|
||||||
column: 2,
|
column: 2,
|
||||||
awPopOver: "<p>Pass extra command line variables to the playbook. This is the <code>-e</code> or <code>--extra-vars</code> command line parameter " +
|
awPopOver: "<p>Pass extra command line variables to the playbook. This is the <code>-e</code> or <code>--extra-vars</code> command line parameter " +
|
||||||
|
|||||||
@@ -73,65 +73,4 @@ export default
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
])
|
|
||||||
|
|
||||||
.factory('TeamLookUpOrganizationInit', ['Alert', 'Rest', 'OrganizationList', 'generateList',
|
|
||||||
function (Alert, Rest, OrganizationList, GenerateList) {
|
|
||||||
return function (params) {
|
|
||||||
|
|
||||||
var scope = params.scope;
|
|
||||||
|
|
||||||
// Show pop-up to select organization
|
|
||||||
scope.lookUpOrganization = function () {
|
|
||||||
var list = OrganizationList,
|
|
||||||
listGenerator = GenerateList,
|
|
||||||
listScope = listGenerator.inject(list, { mode: 'lookup', hdr: 'Select Organization' });
|
|
||||||
|
|
||||||
listScope.selectAction = function () {
|
|
||||||
var i, found = false;
|
|
||||||
for (i = 0; i < listScope[list.name].length; i++) {
|
|
||||||
if (listScope[list.iterator + "_" + listScope[list.name][i].id + "_class"] === "success") {
|
|
||||||
found = true;
|
|
||||||
scope.organization = listScope[list.name][i].id;
|
|
||||||
scope.organization_name = listScope[list.name][i].name;
|
|
||||||
scope.team_form.$setDirty();
|
|
||||||
listGenerator.hide();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (found === false) {
|
|
||||||
Alert('No Selection', 'Click on a row to select an Organization before clicking the Select button.');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
listScope.toggle_organization = function (id) {
|
|
||||||
// when user clicks a row, remove 'success' class from all rows except clicked-on row
|
|
||||||
if (listScope[list.name]) {
|
|
||||||
for (var i = 0; i < listScope[list.name].length; i++) {
|
|
||||||
listScope[list.iterator + "_" + listScope[list.name][i].id + "_class"] = "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (id !== null && id !== undefined) {
|
|
||||||
listScope[list.iterator + "_" + id + "_class"] = "success";
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// @issue: OLD SEARCH
|
|
||||||
// SearchInit({
|
|
||||||
// scope: listScope,
|
|
||||||
// set: list.name,
|
|
||||||
// list: list,
|
|
||||||
// url: defaultUrl
|
|
||||||
// });
|
|
||||||
// PaginateInit({
|
|
||||||
// scope: listScope,
|
|
||||||
// list: list,
|
|
||||||
// url: defaultUrl,
|
|
||||||
// mode: 'lookup'
|
|
||||||
// });
|
|
||||||
// scope.search(list.iterator);
|
|
||||||
|
|
||||||
listScope.toggle_organization(scope.organization);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
/* jshint ignore:start */
|
||||||
|
|
||||||
function isString(arg) {
|
function isString(arg) {
|
||||||
return typeof arg === 'string';
|
return typeof arg === 'string';
|
||||||
}
|
}
|
||||||
@@ -45,8 +47,8 @@ export function format(f) {
|
|||||||
var args = arguments;
|
var args = arguments;
|
||||||
var len = args.length;
|
var len = args.length;
|
||||||
var str = String(f).replace(formatRegExp, function(x) {
|
var str = String(f).replace(formatRegExp, function(x) {
|
||||||
if (x === '%%') {return '%';}
|
if (x === '%%') return '%';
|
||||||
if (i >= len) {return x;}
|
if (i >= len) return x;
|
||||||
switch (x) {
|
switch (x) {
|
||||||
case '%s': return String(args[i++]);
|
case '%s': return String(args[i++]);
|
||||||
case '%d': return Number(args[i++]);
|
case '%d': return Number(args[i++]);
|
||||||
@@ -57,7 +59,6 @@ export function format(f) {
|
|||||||
} catch (_) {
|
} catch (_) {
|
||||||
return '[Circular]';
|
return '[Circular]';
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
@@ -79,7 +80,7 @@ export default
|
|||||||
return function() {
|
return function() {
|
||||||
var langInfo = $window.navigator.language ||
|
var langInfo = $window.navigator.language ||
|
||||||
$window.navigator.userLanguage;
|
$window.navigator.userLanguage;
|
||||||
//var langUrl = langInfo.replace('-', '_');
|
var langUrl = langInfo.replace('-', '_');
|
||||||
//gettextCatalog.debug = true;
|
//gettextCatalog.debug = true;
|
||||||
gettextCatalog.setCurrentLanguage(langInfo);
|
gettextCatalog.setCurrentLanguage(langInfo);
|
||||||
// TODO: the line below is commented out temporarily until
|
// TODO: the line below is commented out temporarily until
|
||||||
|
|||||||
@@ -80,14 +80,18 @@
|
|||||||
$scope.variables, true);
|
$scope.variables, true);
|
||||||
|
|
||||||
// The idea here is that we want to find the new option elements that also have a label that exists in the dom
|
// The idea here is that we want to find the new option elements that also have a label that exists in the dom
|
||||||
$("#workflow_job_template_labels > option").filter("[data-select2-tag=true]").each(function(optionIndex, option) {
|
$("#workflow_job_template_labels > option")
|
||||||
$("#workflow_job_template_labels").siblings(".select2").first().find(".select2-selection__choice").each(function(labelIndex, label) {
|
.filter("[data-select2-tag=true]")
|
||||||
if($(option).text() === $(label).attr('title')) {
|
.each(function(optionIndex, option) {
|
||||||
// Mark that the option has a label present so that we can filter by that down below
|
$("#workflow_job_template_labels")
|
||||||
$(option).attr('data-label-is-present', true);
|
.siblings(".select2").first().find(".select2-selection__choice")
|
||||||
}
|
.each(function(labelIndex, label) {
|
||||||
});
|
if($(option).text() === $(label).attr('title')) {
|
||||||
});
|
// Mark that the option has a label present so that we can filter by that down below
|
||||||
|
$(option).attr('data-label-is-present', true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
$scope.newLabels = $("#workflow_job_template_labels > option")
|
$scope.newLabels = $("#workflow_job_template_labels > option")
|
||||||
.filter("[data-select2-tag=true]")
|
.filter("[data-select2-tag=true]")
|
||||||
|
|||||||
@@ -22,9 +22,8 @@
|
|||||||
if(res.type && res.type === 'job_template') {
|
if(res.type && res.type === 'job_template') {
|
||||||
$state.go('templates.editJobTemplate', {id: res.id}, {reload: true});
|
$state.go('templates.editJobTemplate', {id: res.id}, {reload: true});
|
||||||
}
|
}
|
||||||
else if(res.type && res.type === 'workflow') {
|
// Workflow edit to be implemented post 3.1 but we'll need to handle the
|
||||||
// TODO: direct the user to the edit state for workflows
|
// state transition for that here
|
||||||
}
|
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
.error(function(res, status){
|
.error(function(res, status){
|
||||||
|
|||||||
Reference in New Issue
Block a user