Merge pull request #1951 from jakemcdermott/job-results/strings

organize and translate job output and workflow results strings
This commit is contained in:
Jake McDermott
2018-05-25 11:34:18 -04:00
committed by GitHub
14 changed files with 299 additions and 173 deletions

View File

@@ -27,7 +27,7 @@ function getStatusDetails (jobStatus) {
const choices = mapChoices(resource.model.options('actions.GET.status.choices')); const choices = mapChoices(resource.model.options('actions.GET.status.choices'));
const label = 'Status'; const label = strings.get('labels.STATUS');
const icon = `fa icon-job-${unmapped}`; const icon = `fa icon-job-${unmapped}`;
const value = choices[unmapped]; const value = choices[unmapped];
@@ -36,15 +36,14 @@ function getStatusDetails (jobStatus) {
function getStartDetails (started) { function getStartDetails (started) {
const unfiltered = started || resource.model.get('started'); const unfiltered = started || resource.model.get('started');
const label = strings.get('labels.STARTED');
const label = 'Started';
let value; let value;
if (unfiltered) { if (unfiltered) {
value = $filter('longDate')(unfiltered); value = $filter('longDate')(unfiltered);
} else { } else {
value = 'Not Started'; value = strings.get('details.NOT_STARTED');
} }
return { label, value }; return { label, value };
@@ -52,15 +51,14 @@ function getStartDetails (started) {
function getFinishDetails (finished) { function getFinishDetails (finished) {
const unfiltered = finished || resource.model.get('finished'); const unfiltered = finished || resource.model.get('finished');
const label = strings.get('labels.FINISHED');
const label = 'Finished';
let value; let value;
if (unfiltered) { if (unfiltered) {
value = $filter('longDate')(unfiltered); value = $filter('longDate')(unfiltered);
} else { } else {
value = 'Not Finished'; value = strings.get('details.NOT_FINISHED');
} }
return { label, value }; return { label, value };
@@ -68,7 +66,7 @@ function getFinishDetails (finished) {
function getModuleArgDetails () { function getModuleArgDetails () {
const value = resource.model.get('module_args'); const value = resource.model.get('module_args');
const label = 'Module Args'; const label = strings.get('labels.MODULE_ARGS');
if (!value) { if (!value) {
return null; return null;
@@ -86,7 +84,7 @@ function getJobTypeDetails () {
const choices = mapChoices(resource.model.options('actions.GET.job_type.choices')); const choices = mapChoices(resource.model.options('actions.GET.job_type.choices'));
const label = 'Job Type'; const label = strings.get('labels.JOB_TYPE');
const value = choices[unmapped]; const value = choices[unmapped];
return { label, value }; return { label, value };
@@ -101,7 +99,7 @@ function getVerbosityDetails () {
const choices = mapChoices(resource.model.options('actions.GET.verbosity.choices')); const choices = mapChoices(resource.model.options('actions.GET.verbosity.choices'));
const label = 'Verbosity'; const label = strings.get('labels.VERBOSITY');
const value = choices[verbosity]; const value = choices[verbosity];
return { label, value }; return { label, value };
@@ -115,7 +113,7 @@ function getSourceWorkflowJobDetails () {
} }
const link = `/#/workflows/${sourceWorkflowJob.id}`; const link = `/#/workflows/${sourceWorkflowJob.id}`;
const tooltip = strings.get('resourceTooltips.SOURCE_WORKFLOW_JOB'); const tooltip = strings.get('tooltips.SOURCE_WORKFLOW_JOB');
return { link, tooltip }; return { link, tooltip };
} }
@@ -127,10 +125,10 @@ function getJobTemplateDetails () {
return null; return null;
} }
const label = 'Job Template'; const label = strings.get('labels.JOB_TEMPLATE');
const link = `/#/templates/job_template/${jobTemplate.id}`; const link = `/#/templates/job_template/${jobTemplate.id}`;
const value = $filter('sanitize')(jobTemplate.name); const value = $filter('sanitize')(jobTemplate.name);
const tooltip = strings.get('resourceTooltips.JOB_TEMPLATE'); const tooltip = strings.get('tooltips.JOB_TEMPLATE');
return { label, link, value, tooltip }; return { label, link, value, tooltip };
} }
@@ -172,8 +170,8 @@ function getInventoryJobNameDetails () {
const name = resource.model.get('name'); const name = resource.model.get('name');
const id = resource.model.get('id'); const id = resource.model.get('id');
const label = 'Name'; const label = strings.get('labels.NAME');
const tooltip = strings.get('resourceTooltips.INVENTORY'); const tooltip = strings.get('tooltips.INVENTORY');
const value = `${id} - ${$filter('sanitize')(name)}`; const value = `${id} - ${$filter('sanitize')(name)}`;
const link = `/#/inventories/inventory/${inventoryId}`; const link = `/#/inventories/inventory/${inventoryId}`;
@@ -188,7 +186,7 @@ function getInventorySourceDetails () {
const { source } = resource.model.get('summary_fields.inventory_source'); const { source } = resource.model.get('summary_fields.inventory_source');
const choices = mapChoices(resource.model.options('actions.GET.source.choices')); const choices = mapChoices(resource.model.options('actions.GET.source.choices'));
const label = 'Source'; const label = strings.get('labels.SOURCE');
const value = choices[source]; const value = choices[source];
return { label, value }; return { label, value };
@@ -199,7 +197,7 @@ function getOverwriteDetails () {
return null; return null;
} }
const label = 'Overwrite'; const label = strings.get('labels.OVERWRITE');
const value = resource.model.get('overwrite'); const value = resource.model.get('overwrite');
return { label, value }; return { label, value };
@@ -210,7 +208,7 @@ function getOverwriteVarsDetails () {
return null; return null;
} }
const label = 'Overwrite Vars'; const label = strings.get('labels.OVERWRITE_VARS');
const value = resource.model.get('overwrite_vars'); const value = resource.model.get('overwrite_vars');
return { label, value }; return { label, value };
@@ -221,7 +219,7 @@ function getLicenseErrorDetails () {
return null; return null;
} }
const label = 'License Error'; const label = strings.get('labels.LICENSE_ERROR');
const value = resource.model.get('license_error'); const value = resource.model.get('license_error');
return { label, value }; return { label, value };
@@ -230,7 +228,6 @@ function getLicenseErrorDetails () {
function getLaunchedByDetails () { function getLaunchedByDetails () {
const createdBy = resource.model.get('summary_fields.created_by'); const createdBy = resource.model.get('summary_fields.created_by');
const jobTemplate = resource.model.get('summary_fields.job_template'); const jobTemplate = resource.model.get('summary_fields.job_template');
const relatedSchedule = resource.model.get('related.schedule'); const relatedSchedule = resource.model.get('related.schedule');
const schedule = resource.model.get('summary_fields.schedule'); const schedule = resource.model.get('summary_fields.schedule');
@@ -238,18 +235,18 @@ function getLaunchedByDetails () {
return null; return null;
} }
const label = 'Launched By'; const label = strings.get('labels.LAUNCHED_BY');
let link; let link;
let tooltip; let tooltip;
let value; let value;
if (createdBy) { if (createdBy) {
tooltip = strings.get('resourceTooltips.USER'); tooltip = strings.get('tooltips.USER');
link = `/#/users/${createdBy.id}`; link = `/#/users/${createdBy.id}`;
value = $filter('sanitize')(createdBy.username); value = $filter('sanitize')(createdBy.username);
} else if (relatedSchedule && jobTemplate) { } else if (relatedSchedule && jobTemplate) {
tooltip = strings.get('resourceTooltips.SCHEDULE'); tooltip = strings.get('tooltips.SCHEDULE');
link = `/#/templates/job_template/${jobTemplate.id}/schedules/${schedule.id}`; link = `/#/templates/job_template/${jobTemplate.id}/schedules/${schedule.id}`;
value = $filter('sanitize')(schedule.name); value = $filter('sanitize')(schedule.name);
} else { } else {
@@ -268,8 +265,8 @@ function getInventoryDetails () {
return null; return null;
} }
const label = 'Inventory'; const label = strings.get('labels.INVENTORY');
const tooltip = strings.get('resourceTooltips.INVENTORY'); const tooltip = strings.get('tooltips.INVENTORY');
const value = $filter('sanitize')(inventory.name); const value = $filter('sanitize')(inventory.name);
let link; let link;
@@ -290,10 +287,10 @@ function getProjectDetails () {
return null; return null;
} }
const label = 'Project'; const label = strings.get('labels.PROJECT');
const link = `/#/projects/${project.id}`; const link = `/#/projects/${project.id}`;
const value = $filter('sanitize')(project.name); const value = $filter('sanitize')(project.name);
const tooltip = strings.get('resourceTooltips.PROJECT'); const tooltip = strings.get('tooltips.PROJECT');
return { label, link, value, tooltip }; return { label, link, value, tooltip };
} }
@@ -318,13 +315,13 @@ function getProjectUpdateDetails (updateId) {
} }
const link = `/#/jobs/project/${jobId}`; const link = `/#/jobs/project/${jobId}`;
const tooltip = strings.get('resourceTooltips.PROJECT_UPDATE'); const tooltip = strings.get('tooltips.PROJECT_UPDATE');
return { link, tooltip }; return { link, tooltip };
} }
function getSCMRevisionDetails () { function getSCMRevisionDetails () {
const label = 'Revision'; const label = strings.get('labels.SCM_REVISION');
const value = resource.model.get('scm_revision'); const value = resource.model.get('scm_revision');
if (!value) { if (!value) {
@@ -335,7 +332,7 @@ function getSCMRevisionDetails () {
} }
function getPlaybookDetails () { function getPlaybookDetails () {
const label = 'Playbook'; const label = strings.get('labels.PLAYBOOK');
const value = resource.model.get('playbook'); const value = resource.model.get('playbook');
if (!value) { if (!value) {
@@ -353,7 +350,7 @@ function getJobExplanationDetails () {
} }
const limit = 150; const limit = 150;
const label = 'Explanation'; const label = strings.get('labels.JOB_EXPLANATION');
let more = explanation; let more = explanation;
@@ -380,7 +377,7 @@ function getResultTracebackDetails () {
} }
const limit = 150; const limit = 150;
const label = 'Error Details'; const label = strings.get('labels.RESULT_TRACEBACK');
const more = traceback; const more = traceback;
const less = $filter('limitTo')(more, limit); const less = $filter('limitTo')(more, limit);
@@ -398,25 +395,25 @@ function getCredentialDetails () {
return null; return null;
} }
let label = 'Credential'; let label = strings.get('labels.CREDENTIAL');
if (resource.type === 'playbook') { if (resource.type === 'playbook') {
label = 'Machine Credential'; label = strings.get('labels.MACHINE_CREDENTIAL');
} }
if (resource.type === 'inventory') { if (resource.type === 'inventory') {
label = 'Source Credential'; label = strings.get('labels.SOURCE_CREDENTIAL');
} }
const link = `/#/credentials/${credential.id}`; const link = `/#/credentials/${credential.id}`;
const tooltip = strings.get('resourceTooltips.CREDENTIAL'); const tooltip = strings.get('tooltips.CREDENTIAL');
const value = $filter('sanitize')(credential.name); const value = $filter('sanitize')(credential.name);
return { label, link, tooltip, value }; return { label, link, tooltip, value };
} }
function getForkDetails () { function getForkDetails () {
const label = 'Forks'; const label = strings.get('labels.FORKS');
const value = resource.model.get('forks'); const value = resource.model.get('forks');
if (!value) { if (!value) {
@@ -427,7 +424,7 @@ function getForkDetails () {
} }
function getLimitDetails () { function getLimitDetails () {
const label = 'Limit'; const label = strings.get('labels.LIMIT');
const value = resource.model.get('limit'); const value = resource.model.get('limit');
if (!value) { if (!value) {
@@ -444,13 +441,13 @@ function getInstanceGroupDetails () {
return null; return null;
} }
const label = 'Instance Group'; const label = strings.get('labels.INSTANCE_GROUP');
const value = $filter('sanitize')(instanceGroup.name); const value = $filter('sanitize')(instanceGroup.name);
let isolated = null; let isolated = null;
if (instanceGroup.controller_id) { if (instanceGroup.controller_id) {
isolated = 'Isolated'; isolated = strings.get('details.ISOLATED');
} }
return { label, value, isolated }; return { label, value, isolated };
@@ -471,7 +468,7 @@ function getJobTagDetails () {
return null; return null;
} }
const label = 'Job Tags'; const label = strings.get('labels.JOB_TAGS');
const more = false; const more = false;
const value = jobTags.map($filter('sanitize')); const value = jobTags.map($filter('sanitize'));
@@ -494,8 +491,8 @@ function getSkipTagDetails () {
return null; return null;
} }
const label = 'Skip Tags';
const more = false; const more = false;
const label = strings.get('labels.SKIP_TAGS');
const value = skipTags.map($filter('sanitize')); const value = skipTags.map($filter('sanitize'));
return { label, more, value }; return { label, more, value };
@@ -508,8 +505,8 @@ function getExtraVarsDetails () {
return null; return null;
} }
const label = 'Extra Variables'; const label = strings.get('labels.EXTRA_VARS');
const tooltip = 'Read-only view of extra variables added to the job template.'; const tooltip = strings.get('tooltips.EXTRA_VARS');
const value = parse(extraVars); const value = parse(extraVars);
const disabled = true; const disabled = true;
@@ -523,7 +520,7 @@ function getLabelDetails () {
return null; return null;
} }
const label = 'Labels'; const label = strings.get('labels.LABELS');
const more = false; const more = false;
const value = jobLabels.map(({ name }) => name).map($filter('sanitize')); const value = jobLabels.map(({ name }) => name).map($filter('sanitize'));
@@ -663,6 +660,7 @@ function JobDetailsController (
vm.$onInit = () => { vm.$onInit = () => {
resource = this.resource; // eslint-disable-line prefer-destructuring resource = this.resource; // eslint-disable-line prefer-destructuring
vm.strings = strings;
vm.status = getStatusDetails(); vm.status = getStatusDetails();
vm.started = getStartDetails(); vm.started = getStartDetails();
@@ -726,7 +724,7 @@ JobDetailsController.$inject = [
'$state', '$state',
'ProcessErrors', 'ProcessErrors',
'Prompt', 'Prompt',
'JobStrings', 'OutputStrings',
'Wait', 'Wait',
'ParseVariableString', 'ParseVariableString',
'JobStatusService', 'JobStatusService',

View File

@@ -1,6 +1,6 @@
<!-- todo: styling, css etc. - disposition according to project lib conventions --> <!-- todo: styling, css etc. - disposition according to project lib conventions -->
<div class="JobResults-panelHeader"> <div class="JobResults-panelHeader">
<div class="JobResults-panelHeaderText" translate> DETAILS</div> <div class="JobResults-panelHeaderText"> {{:: vm.strings.get('details.HEADER')}}</div>
<!-- LEFT PANE HEADER ACTIONS --> <!-- LEFT PANE HEADER ACTIONS -->
<div class="JobResults-panelHeaderButtonActions"> <div class="JobResults-panelHeaderButtonActions">
<!-- RELAUNCH ACTION --> <!-- RELAUNCH ACTION -->
@@ -14,7 +14,7 @@
ng-show="vm.status.value === 'Pending' || ng-show="vm.status.value === 'Pending' ||
vm.status.value === 'Waiting' || vm.status.value === 'Waiting' ||
vm.status.value === 'Running'" vm.status.value === 'Running'"
aw-tool-tip="{{'Cancel' | translate }}" aw-tool-tip="{{:: vm.strings.get('tooltips.CANCEL') }}"
data-original-title="" data-original-title=""
title=""> title="">
<i class="fa fa-minus-circle"></i> <i class="fa fa-minus-circle"></i>
@@ -31,7 +31,7 @@
vm.status.value === 'Failed' || vm.status.value === 'Failed' ||
vm.status.value === 'Error' || vm.status.value === 'Error' ||
vm.status.value === 'Canceled')" vm.status.value === 'Canceled')"
aw-tool-tip="{{ 'Delete' | translate }}" aw-tool-tip="{{:: vm.strings.get('tooltips.DELETE') }}"
data-original-title="" data-original-title=""
title=""> title="">
<i class="fa fa-trash-o"></i> <i class="fa fa-trash-o"></i>
@@ -71,7 +71,7 @@
<span ng-show="vm.jobExplanation.hasMoreToShow" <span ng-show="vm.jobExplanation.hasMoreToShow"
class="JobResults-seeMoreLess" class="JobResults-seeMoreLess"
ng-click="vm.jobExplanation.showMore = true"> ng-click="vm.jobExplanation.showMore = true">
Show More {{:: vm.strings.get('details.SHOW_MORE') }}
</span> </span>
</div> </div>
<div class="JobResults-resultRowText" <div class="JobResults-resultRowText"
@@ -79,7 +79,7 @@
{{ vm.jobExplanation.more }} {{ vm.jobExplanation.more }}
<span class="JobResults-seeMoreLess" <span class="JobResults-seeMoreLess"
ng-click="vm.jobExplanation.showMore = false"> ng-click="vm.jobExplanation.showMore = false">
Show Less {{:: vm.strings.get('details.SHOW_LESS') }}
</span> </span>
</div> </div>
</div> </div>
@@ -124,7 +124,7 @@
<span ng-show="vm.resultTraceback.hasMoreToShow" <span ng-show="vm.resultTraceback.hasMoreToShow"
class="JobResults-seeMoreLess" class="JobResults-seeMoreLess"
ng-click="vm.resultTraceback.showMore = true"> ng-click="vm.resultTraceback.showMore = true">
Show More {{:: vm.strings.get('details.SHOW_MORE') }}
</span> </span>
</div> </div>
<div class="JobResults-resultRowText" <div class="JobResults-resultRowText"
@@ -132,7 +132,7 @@
{{ vm.resultTraceback.more }} {{ vm.resultTraceback.more }}
<span class="JobResults-seeMoreLess" <span class="JobResults-seeMoreLess"
ng-click="vm.resultTraceback.showMore = false"> ng-click="vm.resultTraceback.showMore = false">
Show Less {{:: vm.strings.get('details.SHOW_LESS') }}
</span> </span>
</div> </div>
</div> </div>
@@ -298,14 +298,14 @@
ng-show="vm.labels.more" ng-show="vm.labels.more"
href="" href=""
ng-click="vm.toggleLabels()"> ng-click="vm.toggleLabels()">
<span translate>{{ vm.labels.label }}</span> <span>{{ vm.labels.label }}</span>
<i class="JobResults-expandArrow fa fa-caret-right"></i> <i class="JobResults-expandArrow fa fa-caret-right"></i>
</a> </a>
<a class="JobResults-resultRowLabel JobResults-resultRowLabel--fullWidth" <a class="JobResults-resultRowLabel JobResults-resultRowLabel--fullWidth"
ng-show="!vm.labels.more" ng-show="!vm.labels.more"
href="" href=""
ng-click="vm.toggleLabels()"> ng-click="vm.toggleLabels()">
<span translate>{{ vm.labels.label }}</span> <span>{{ vm.labels.label }}</span>
<i class="JobResults-expandArrow fa fa-caret-down"></i> <i class="JobResults-expandArrow fa fa-caret-down"></i>
</a> </a>
</div> </div>
@@ -323,14 +323,14 @@
ng-show="vm.jobTags.more" ng-show="vm.jobTags.more"
href="" href=""
ng-click="vm.toggleJobTags()"> ng-click="vm.toggleJobTags()">
<span translate>{{ vm.jobTags.label }}</span> <span>{{ vm.jobTags.label }}</span>
<i class="JobResults-expandArrow fa fa-caret-right"></i> <i class="JobResults-expandArrow fa fa-caret-right"></i>
</a> </a>
<a class="JobResults-resultRowLabel JobResults-resultRowLabel--fullWidth" <a class="JobResults-resultRowLabel JobResults-resultRowLabel--fullWidth"
ng-show="!vm.jobTags.more" ng-show="!vm.jobTags.more"
href="" href=""
ng-click="vm.toggleJobTags()"> ng-click="vm.toggleJobTags()">
<span translate>{{ vm.jobTags.label }}</span> <span>{{ vm.jobTags.label }}</span>
<i class="JobResults-expandArrow fa fa-caret-down"></i> <i class="JobResults-expandArrow fa fa-caret-down"></i>
</a> </a>
</div> </div>
@@ -348,14 +348,14 @@
ng-show="vm.skipTags.more" ng-show="vm.skipTags.more"
href="" href=""
ng-click="vm.toggleSkipTags()"> ng-click="vm.toggleSkipTags()">
<span translate>{{ vm.skipTags.label }}</span> <span>{{ vm.skipTags.label }}</span>
<i class="JobResults-expandArrow fa fa-caret-right"></i> <i class="JobResults-expandArrow fa fa-caret-right"></i>
</a> </a>
<a class="JobResults-resultRowLabel JobResults-resultRowLabel--fullWidth" <a class="JobResults-resultRowLabel JobResults-resultRowLabel--fullWidth"
ng-show="!vm.skipTags.more" ng-show="!vm.skipTags.more"
href="" href=""
ng-click="vm.toggleSkipTags()"> ng-click="vm.toggleSkipTags()">
<span translate>{{ vm.skipTags.label }}</span> <span>{{ vm.skipTags.label }}</span>
<i class="JobResults-expandArrow fa fa-caret-down"></i> <i class="JobResults-expandArrow fa fa-caret-down"></i>
</a> </a>
</div> </div>

View File

@@ -1,6 +1,8 @@
let $compile; let $compile;
let $filter;
let $q; let $q;
let $scope; let $scope;
let page; let page;
let render; let render;
let resource; let resource;
@@ -13,29 +15,34 @@ let streaming;
let listeners = []; let listeners = [];
function JobsIndexController ( function JobsIndexController (
_$compile_,
_$filter_,
_$q_,
_$scope_,
_resource_, _resource_,
_page_, _page_,
_scroll_, _scroll_,
_render_, _render_,
_engine_, _engine_,
_$scope_,
_$compile_,
_$q_,
_status_, _status_,
_strings_,
) { ) {
vm = this || {}; vm = this || {};
$compile = _$compile_; $compile = _$compile_;
$scope = _$scope_; $filter = _$filter_;
$q = _$q_; $q = _$q_;
resource = _resource_; $scope = _$scope_;
resource = _resource_;
page = _page_; page = _page_;
scroll = _scroll_; scroll = _scroll_;
render = _render_; render = _render_;
engine = _engine_; engine = _engine_;
status = _status_; status = _status_;
vm.strings = _strings_;
// Development helper(s) // Development helper(s)
vm.clear = devClear; vm.clear = devClear;
@@ -45,7 +52,7 @@ function JobsIndexController (
// Panel // Panel
vm.resource = resource; vm.resource = resource;
vm.title = resource.model.get('name'); vm.title = $filter('sanitize')(resource.model.get('name'));
// Stdout Navigation // Stdout Navigation
vm.scroll = { vm.scroll = {
@@ -386,15 +393,17 @@ function devClear () {
// } // }
JobsIndexController.$inject = [ JobsIndexController.$inject = [
'$compile',
'$filter',
'$q',
'$scope',
'resource', 'resource',
'JobPageService', 'JobPageService',
'JobScrollService', 'JobScrollService',
'JobRenderService', 'JobRenderService',
'JobEventEngine', 'JobEventEngine',
'$scope',
'$compile',
'$q',
'JobStatusService', 'JobStatusService',
'OutputStrings',
]; ];
module.exports = JobsIndexController; module.exports = JobsIndexController;

View File

@@ -1,7 +1,7 @@
import atLibModels from '~models'; import atLibModels from '~models';
import atLibComponents from '~components'; import atLibComponents from '~components';
import Strings from '~features/output/jobs.strings'; import Strings from '~features/output/output.strings';
import Controller from '~features/output/index.controller'; import Controller from '~features/output/index.controller';
import PageService from '~features/output/page.service'; import PageService from '~features/output/page.service';
import RenderService from '~features/output/render.service'; import RenderService from '~features/output/render.service';
@@ -241,7 +241,7 @@ function JobsRun ($stateRegistry, $filter, strings) {
$stateRegistry.register(state); $stateRegistry.register(state);
} }
JobsRun.$inject = ['$stateRegistry', '$filter', 'JobStrings']; JobsRun.$inject = ['$stateRegistry', '$filter', 'OutputStrings'];
angular angular
.module(MODULE_NAME, [ .module(MODULE_NAME, [
@@ -249,7 +249,7 @@ angular
atLibComponents, atLibComponents,
HostEvent HostEvent
]) ])
.service('JobStrings', Strings) .service('OutputStrings', Strings)
.service('JobPageService', PageService) .service('JobPageService', PageService)
.service('JobScrollService', ScrollService) .service('JobScrollService', ScrollService)
.service('JobRenderService', RenderService) .service('JobRenderService', RenderService)

View File

@@ -55,7 +55,7 @@
<div ng-show="vm.scroll.showBackToTop" class="at-Stdout-menuBottom"> <div ng-show="vm.scroll.showBackToTop" class="at-Stdout-menuBottom">
<div class="at-Stdout-menuIconGroup" ng-click="vm.scroll.home()"> <div class="at-Stdout-menuIconGroup" ng-click="vm.scroll.home()">
<p class="pull-left"><i class="fa fa-angle-double-up"></i></p> <p class="pull-left"><i class="fa fa-angle-double-up"></i></p>
<p class="pull-right">Back to Top</p> <p class="pull-right">{{:: vm.strings.get('stdout.BACK_TO_TOP') }}</p>
</div> </div>
<div class="at-u-clear"></div> <div class="at-u-clear"></div>

View File

@@ -1,35 +0,0 @@
function JobsStrings (BaseString) {
BaseString.call(this, 'jobs');
const { t } = this;
const ns = this.jobs;
ns.state = {
BREADCRUMB_DEFAULT: t.s('RESULTS'),
};
ns.status = {
RUNNING: t.s('The host status bar will update when the job is complete.'),
UNAVAILABLE: t.s('Host status information for this job is unavailable.'),
};
ns.resourceTooltips = {
USER: t.s('View the User'),
SCHEDULE: t.s('View the Schedule'),
INVENTORY: t.s('View the Inventory'),
CREDENTIAL: t.s('View the Credential'),
JOB_TEMPLATE: t.s('View the Job Template'),
SOURCE_WORKFLOW_JOB: t.s('View the source Workflow Job'),
PROJECT: t.s('View the Project'),
PROJECT_UPDATE: t.s('View Project checkout results')
};
ns.expandCollapse = {
EXPAND: t.s('Expand Output'),
COLLAPSE: t.s('Collapse Output')
};
}
JobsStrings.$inject = ['BaseStringService'];
export default JobsStrings;

View File

@@ -0,0 +1,99 @@
function OutputStrings (BaseString) {
BaseString.call(this, 'output');
const { t } = this;
const ns = this.output;
ns.state = {
BREADCRUMB_DEFAULT: t.s('RESULTS'),
};
ns.status = {
RUNNING: t.s('The host status bar will update when the job is complete.'),
UNAVAILABLE: t.s('Host status information for this job is unavailable.'),
};
ns.tooltips = {
CANCEL: t.s('Cancel'),
COLLAPSE_OUTPUT: t.s('Collapse Output'),
DELETE: t.s('Delete'),
DOWNLOAD_OUTPUT: t.s('Download Output'),
CREDENTIAL: t.s('View the Credential'),
EXPAND_OUTPUT: t.s('Expand Output'),
EXTRA_VARS: t.s('Read-only view of extra variables added to the job template.'),
INVENTORY: t.s('View the Inventory'),
JOB_TEMPLATE: t.s('View the Job Template'),
PROJECT: t.s('View the Project'),
PROJECT_UPDATE: t.s('View Project checkout results'),
SCHEDULE: t.s('View the Schedule'),
SOURCE_WORKFLOW_JOB: t.s('View the source Workflow Job'),
USER: t.s('View the User'),
};
ns.details = {
HEADER: t.s('Details'),
ISOLATED: t.s('Isolated'),
NOT_FINISHED: t.s('Not Finished'),
NOT_STARTED: t.s('Not Started'),
SHOW_LESS: t.s('Show Less'),
SHOW_MORE: t.s('Show More'),
};
ns.labels = {
CREDENTIAL: t.s('Credential'),
EXTRA_VARS: t.s('Extra Variables'),
FINISHED: t.s('Finished'),
FORKS: t.s('Forks'),
INSTANCE_GROUP: t.s('Instance Group'),
INVENTORY: t.s('Inventory'),
JOB_EXPLANATION: t.s('Explanation'),
JOB_TAGS: t.s('Job Tags'),
JOB_TEMPLATE: t.s('Job Template'),
JOB_TYPE: t.s('Job Type'),
LABELS: t.s('Labels'),
LAUNCHED_BY: t.s('Launched By'),
LICENSE_ERROR: t.s('License Error'),
LIMIT: t.s('Limit'),
MACHINE_CREDENTIAL: t.s('Machine Credential'),
MODULE_ARGS: t.s('Module Args'),
NAME: t.s('Name'),
OVERWRITE: t.s('Overwrite'),
OVERWRITE_VARS: t.s('Overwrite Vars'),
PLAYBOOK: t.s('Playbook'),
PROJECT: t.s('Project'),
RESULT_TRACEBACK: t.s('Error Details'),
SCM_REVISION: t.s('Revision'),
SKIP_TAGS: t.s('Skip Tags'),
SOURCE: t.s('Source'),
SOURCE_CREDENTIAL: t.s('Source Credential'),
STARTED: t.s('Started'),
STATUS: t.s('Status'),
VERBOSITY: t.s('Verbosity'),
};
ns.search = {
ADDITIONAL_INFORMATION_HEADER: t.s('ADDITIONAL_INFORMATION'),
ADDITIONAL_INFORMATION: t.s('For additional information on advanced search search syntax please see the Ansible Tower'),
CLEAR_ALL: t.s('CLEAR ALL'),
DOCUMENTATION: t.s('documentation'),
EXAMPLES: t.s('EXAMPLES'),
FIELDS: t.s('FIELDS'),
KEY: t.s('KEY'),
PLACEHOLDER_DEFAULT: t.s('SEARCH'),
PLACEHOLDER_RUNNING: t.s('JOB IS STILL RUNNING'),
REJECT_DEFAULT: t.s('Failed to update search results.'),
REJECT_INVALID: t.s('Invalid search filter provided.'),
};
ns.stats = {
ELAPSED: t.s('Elapsed'),
};
ns.stdout = {
BACK_TO_TOP: t.s('Back to Top'),
};
}
OutputStrings.$inject = ['BaseStringService'];
export default OutputStrings;

View File

@@ -3,14 +3,11 @@ const templateUrl = require('~features/output/search.partial.html');
const searchReloadOptions = { inherit: false, location: 'replace' }; const searchReloadOptions = { inherit: false, location: 'replace' };
const searchKeyExamples = ['host_name:localhost', 'task:set', 'created:>=2000-01-01']; const searchKeyExamples = ['host_name:localhost', 'task:set', 'created:>=2000-01-01'];
const searchKeyFields = ['changed', 'created', 'failed', 'host_name', 'stdout', 'task', 'role', 'playbook', 'play']; const searchKeyFields = ['changed', 'created', 'failed', 'host_name', 'stdout', 'task', 'role', 'playbook', 'play'];
const searchKeyDocLink = 'https://docs.ansible.com/ansible-tower/3.3.0/html/userguide/search_sort.html';
const PLACEHOLDER_RUNNING = 'CANNOT SEARCH RUNNING JOB';
const PLACEHOLDER_DEFAULT = 'SEARCH';
const REJECT_DEFAULT = 'Failed to update search results.';
const REJECT_INVALID = 'Invalid search filter provided.';
let $state; let $state;
let qs; let qs;
let strings;
let vm; let vm;
@@ -32,7 +29,7 @@ function getSearchTags (queryset) {
.filter(tag => !tag.startsWith('order_by')); .filter(tag => !tag.startsWith('order_by'));
} }
function reloadQueryset (queryset, rejection = REJECT_DEFAULT) { function reloadQueryset (queryset, rejection = strings.get('search.REJECT_DEFAULT')) {
const params = angular.copy($state.params); const params = angular.copy($state.params);
const currentTags = vm.tags; const currentTags = vm.tags;
@@ -72,23 +69,25 @@ function submitSearch () {
const searchInputQueryset = qs.getSearchInputQueryset(vm.value, isFilterable); const searchInputQueryset = qs.getSearchInputQueryset(vm.value, isFilterable);
const modifiedQueryset = qs.mergeQueryset(currentQueryset, searchInputQueryset); const modifiedQueryset = qs.mergeQueryset(currentQueryset, searchInputQueryset);
reloadQueryset(modifiedQueryset, REJECT_INVALID); reloadQueryset(modifiedQueryset, strings.get('search.REJECT_INVALID'));
} }
function clearSearch () { function clearSearch () {
reloadQueryset(); reloadQueryset();
} }
function JobSearchController (_$state_, _qs_, { subscribe }) { function JobSearchController (_$state_, _qs_, _strings_, { subscribe }) {
$state = _$state_; $state = _$state_;
qs = _qs_; qs = _qs_;
strings = _strings_;
vm = this || {}; vm = this || {};
vm.strings = strings;
vm.examples = searchKeyExamples; vm.examples = searchKeyExamples;
vm.fields = searchKeyFields; vm.fields = searchKeyFields;
vm.docLink = searchKeyDocLink;
vm.relatedFields = []; vm.relatedFields = [];
vm.placeholder = PLACEHOLDER_DEFAULT;
vm.clearSearch = clearSearch; vm.clearSearch = clearSearch;
vm.toggleSearchKey = toggleSearchKey; vm.toggleSearchKey = toggleSearchKey;
@@ -103,11 +102,12 @@ function JobSearchController (_$state_, _qs_, { subscribe }) {
vm.key = false; vm.key = false;
vm.rejected = false; vm.rejected = false;
vm.disabled = true; vm.disabled = true;
vm.running = false;
vm.tags = getSearchTags(getCurrentQueryset()); vm.tags = getSearchTags(getCurrentQueryset());
unsubscribe = subscribe(({ running }) => { unsubscribe = subscribe(({ running }) => {
vm.disabled = running; vm.disabled = running;
vm.placeholder = running ? PLACEHOLDER_RUNNING : PLACEHOLDER_DEFAULT; vm.running = running;
}); });
}; };
@@ -119,6 +119,7 @@ function JobSearchController (_$state_, _qs_, { subscribe }) {
JobSearchController.$inject = [ JobSearchController.$inject = [
'$state', '$state',
'QuerySet', 'QuerySet',
'OutputStrings',
'JobStatusService', 'JobStatusService',
]; ];

View File

@@ -5,7 +5,8 @@
class="form-control at-Input" class="form-control at-Input"
ng-class="{ 'at-Input--rejected': vm.rejected }" ng-class="{ 'at-Input--rejected': vm.rejected }"
ng-model="vm.value" ng-model="vm.value"
ng-attr-placeholder="{{ vm.placeholder }}" ng-attr-placeholder="{{ vm.running ? vm.strings.get('search.PLACEHOLDER_RUNNING') :
vm.strings.get('search.PLACEHOLDER_DEFAULT') }}"
ng-disabled="vm.disabled"> ng-disabled="vm.disabled">
<span class="input-group-btn"> <span class="input-group-btn">
<button class="btn at-ButtonHollow--default at-Input-button" <button class="btn at-ButtonHollow--default at-Input-button"
@@ -18,13 +19,15 @@
ng-if="vm.key" ng-if="vm.key"
ng-disabled="vm.disabled" ng-disabled="vm.disabled"
ng-click="vm.toggleSearchKey()" ng-click="vm.toggleSearchKey()"
type="button"> key type="button">
{{:: vm.strings.get('search.KEY') }}
</button> </button>
<button class="btn at-ButtonHollow--default at-Input-button" <button class="btn at-ButtonHollow--default at-Input-button"
ng-if="!vm.key" ng-if="!vm.key"
ng-disabled="vm.disabled" ng-disabled="vm.disabled"
ng-click="vm.toggleSearchKey()" ng-click="vm.toggleSearchKey()"
type="button"> key type="button">
{{:: vm.strings.get('search.KEY') }}
</button> </button>
</span> </span>
</div> </div>
@@ -40,25 +43,31 @@
<i class="fa fa-times LabelList-tagDelete"></i> <i class="fa fa-times LabelList-tagDelete"></i>
</div> </div>
</div> </div>
<div><a href class="jobz-searchClearAll" ng-click="vm.clearSearch()" ng-show="!(vm.tags | isEmpty)">CLEAR ALL</a></div> <div><a href class="jobz-searchClearAll" ng-click="vm.clearSearch()" ng-show="!(vm.tags | isEmpty)">
{{:: vm.strings.get('search.CLEAR_ALL') }}
</a></div>
</div> </div>
<div class="jobz-searchKeyPaneContainer" ng-show="vm.key"> <div class="jobz-searchKeyPaneContainer" ng-show="vm.key">
<div class="jobz-searchKeyPane"> <div class="jobz-searchKeyPane">
<div class="SmartSearch-keyRow"> <div class="SmartSearch-keyRow">
<div class="SmartSearch-examples"> <div class="SmartSearch-examples">
<div class="SmartSearch-examples--title"><b>EXAMPLES:</b></div> <div class="SmartSearch-examples--title">
<div class="SmartSearch-examples--search" ng-repeat="tag in vm.examples"> {{ tag }}</div> <b>{{:: vm.strings.get('search.EXAMPLES') }}:</b>
</div>
<div class="SmartSearch-examples--search" ng-repeat="tag in vm.examples">{{ tag }}</div>
</div> </div>
</div> </div>
<div class="SmartSearch-keyRow"> <div class="SmartSearch-keyRow">
<b>FIELDS:</b> <b>{{:: vm.strings.get('search.FIELDS') }}:</b>
<span ng-repeat="field in vm.fields">{{ field }}<span ng-if="!$last">, </span></span> <span ng-repeat="field in vm.fields">{{ field }}<span ng-if="!$last">, </span></span>
</div> </div>
<div class="SmartSearch-keyRow"> <div class="SmartSearch-keyRow">
<b>ADDITIONAL INFORMATION:</b> <b>{{:: vm.strings.get('search.ADDITIONAL_INFORMATION_HEADER') }}:</b>
For additional information on advanced search search syntax please see the Ansible Tower {{:: vm.strings.get('search.ADDITIONAL_INFORMATION') }}
<a ng-attr-href="undefined" target="_blank">documentation</a>. <a ng-attr-href="{{ vm.docLink }}" target="_blank">
{{:: vm.strings.get('search.DOCUMENTATION') }}.
</a>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -11,6 +11,7 @@ function createStatsBarTooltip (key, count) {
function JobStatsController (strings, { subscribe }) { function JobStatsController (strings, { subscribe }) {
vm = this || {}; vm = this || {};
vm.strings = strings;
let unsubscribe; let unsubscribe;
@@ -21,7 +22,9 @@ function JobStatsController (strings, { subscribe }) {
vm.$onInit = () => { vm.$onInit = () => {
vm.download = vm.resource.model.get('related.stdout'); vm.download = vm.resource.model.get('related.stdout');
vm.toggleStdoutFullscreenTooltip = strings.get('expandCollapse.EXPAND'); vm.tooltips.toggleExpand = vm.expanded ?
strings.get('tooltips.COLLAPSE_OUTPUT') :
strings.get('tooltips.EXPAND_OUTPUT');
unsubscribe = subscribe(({ running, elapsed, counts, stats, hosts }) => { unsubscribe = subscribe(({ running, elapsed, counts, stats, hosts }) => {
vm.plays = counts.plays; vm.plays = counts.plays;
@@ -52,14 +55,14 @@ function JobStatsController (strings, { subscribe }) {
vm.toggleExpanded = () => { vm.toggleExpanded = () => {
vm.expanded = !vm.expanded; vm.expanded = !vm.expanded;
vm.toggleStdoutFullscreenTooltip = vm.expanded ? vm.tooltips.toggleExpand = vm.expanded ?
strings.get('expandCollapse.COLLAPSE') : strings.get('tooltips.COLLAPSE_OUTPUT') :
strings.get('expandCollapse.EXPAND'); strings.get('tooltips.EXPAND_OUTPUT');
}; };
} }
JobStatsController.$inject = [ JobStatsController.$inject = [
'JobStrings', 'OutputStrings',
'JobStatusService', 'JobStatusService',
]; ];

View File

@@ -12,7 +12,7 @@
<span ng-show="!vm.hosts" class="at-Panel-headingTitleBadge">...</span> <span ng-show="!vm.hosts" class="at-Panel-headingTitleBadge">...</span>
<span ng-show="vm.hosts" class="at-Panel-headingTitleBadge">{{ vm.hosts }}</span> <span ng-show="vm.hosts" class="at-Panel-headingTitleBadge">{{ vm.hosts }}</span>
<span class="at-Panel-label">elapsed</span> <span class="at-Panel-label">{{:: vm.strings.get('stats.ELAPSED') }}</span>
<span ng-show="!vm.elapsed" class="at-Panel-headingTitleBadge">...</span> <span ng-show="!vm.elapsed" class="at-Panel-headingTitleBadge">...</span>
<span ng-show="vm.elapsed" class="at-Panel-headingTitleBadge"> <span ng-show="vm.elapsed" class="at-Panel-headingTitleBadge">
{{ vm.elapsed * 1000 | duration: "hh:mm:ss" }} {{ vm.elapsed * 1000 | duration: "hh:mm:ss" }}
@@ -20,16 +20,15 @@
<a ng-show="vm.download && !vm.running" href="{{ vm.download }}?format=txt_download"> <a ng-show="vm.download && !vm.running" href="{{ vm.download }}?format=txt_download">
<button class="btn at-Input-button at-u-noBorder" <button class="btn at-Input-button at-u-noBorder"
aw-tool-tip="{{ standardOutTooltip }}" aw-tool-tip="{{:: vm.strings.get('tooltips.DOWNLOAD_OUTPUT') }}"
data-tip-watch="standardOutTooltip"
data-placement="top"> data-placement="top">
<i class="fa fa-download"></i> <i class="fa fa-download"></i>
</button> </button>
</a> </a>
<button class="btn at-Input-button at-u-noBorder" <button class="btn at-Input-button at-u-noBorder"
aw-tool-tip="{{ vm.toggleStdoutFullscreenTooltip }}" aw-tool-tip="{{ vm.tooltips.toggleExpand }}"
data-tip-watch="vm.toggleStdoutFullscreenTooltip" data-tip-watch="vm.tooltips.toggleExpand"
data-placement="top" data-placement="top"
ng-class="{'at-Input-button--active': vm.expanded}" ng-class="{'at-Input-button--active': vm.expanded}"
ng-click="vm.toggleExpanded()"> ng-click="vm.toggleExpanded()">

View File

@@ -154,6 +154,11 @@ function JobStatusService (moment, message) {
const isExpectingStats = this.isExpectingStatsEvent(); const isExpectingStats = this.isExpectingStatsEvent();
const isIncomplete = _.includes(INCOMPLETE, status); const isIncomplete = _.includes(INCOMPLETE, status);
const isFinished = _.includes(FINISHED, status); const isFinished = _.includes(FINISHED, status);
const isAlreadyFinished = _.includes(FINISHED, this.state.status);
if (isAlreadyFinished) {
return;
}
if ((isExpectingStats && isIncomplete) || (!isExpectingStats && isFinished)) { if ((isExpectingStats && isIncomplete) || (!isExpectingStats && isFinished)) {
if (this.latestTime) { if (this.latestTime) {

View File

@@ -31,9 +31,49 @@ export default ['workflowData', 'workflowResultsService', 'workflowDataOptions',
$scope.scheduled_by_link = getLink('schedule'); $scope.scheduled_by_link = getLink('schedule');
$scope.cloud_credential_link = getLink('cloud_credential'); $scope.cloud_credential_link = getLink('cloud_credential');
$scope.network_credential_link = getLink('network_credential'); $scope.network_credential_link = getLink('network_credential');
$scope.strings = {
tooltips: {
RELAUNCH: i18n._('Relaunch using the same parameters'),
CANCEL: i18n._('Cancel'),
DELETE: i18n._('Delete'),
EDIT_USER: i18n._('Edit the user'),
EDIT_WORKFLOW: i18n._('Edit the workflow job template'),
EDIT_SCHEDULE: i18n._('Edit the schedule'),
TOGGLE_STDOUT_FULLSCREEN: i18n._('Expand Output'),
STATUS: '' // re-assigned elsewhere
},
labels: {
TEMPLATE: i18n._('Template'),
LAUNCHED_BY: i18n._('Launched By'),
STARTED: i18n._('Started'),
FINISHED: i18n._('Finished'),
LABELS: i18n._('Labels'),
STATUS: '', // re-assigned elsewhere
JOB_TYPE: '', // re-assigned elsewhere
VERBOSITY: '', // re-assigned elsewhere
},
details: {
HEADER: i18n._('DETAILS'),
NOT_FINISHED: i18n._('Not Finished'),
NOT_STARTED: i18n._('Not Started'),
},
results: {
TOTAL_JOBS: i18n._('Total Jobs'),
ELAPSED: i18n._('Elapsed'),
},
legend: {
ON_SUCCESS: i18n._('On Success'),
ON_FAIL: i18n._('On Fail'),
ALWAYS: i18n._('Always'),
PROJECT_SYNC: i18n._('Project Sync'),
INVENTORY_SYNC: i18n._('Inventory Sync'),
KEY: i18n._('KEY'),
}
};
}; };
var getLabels = function() { var getLabelsAndTooltips = function() {
var getLabel = function(key) { var getLabel = function(key) {
if ($scope.workflowOptions && $scope.workflowOptions[key]) { if ($scope.workflowOptions && $scope.workflowOptions[key]) {
return $scope.workflowOptions[key].choices return $scope.workflowOptions[key].choices
@@ -44,9 +84,10 @@ export default ['workflowData', 'workflowResultsService', 'workflowDataOptions',
} }
}; };
$scope.status_label = getLabel('status'); $scope.strings.labels.STATUS = getLabel('status');
$scope.type_label = getLabel('job_type'); $scope.strings.tooltips.STATUS = `Job ${$scope.strings.labels.STATUS}`;
$scope.verbosity_label = getLabel('verbosity'); $scope.strings.labels.JOB_TYPE = getLabel('job_type');
$scope.strings.labels.VERBOSITY = getLabel('verbosity');
}; };
var updateWorkflowJobElapsedTimer = function(time) { var updateWorkflowJobElapsedTimer = function(time) {
@@ -72,14 +113,11 @@ export default ['workflowData', 'workflowResultsService', 'workflowDataOptions',
$scope.workflow_job_template_link = `/#/templates/workflow_job_template/${$scope.workflow.summary_fields.workflow_job_template.id}`; $scope.workflow_job_template_link = `/#/templates/workflow_job_template/${$scope.workflow.summary_fields.workflow_job_template.id}`;
} }
// stdout full screen toggle tooltip text
$scope.toggleStdoutFullscreenTooltip = i18n._("Expand Output");
// turn related api browser routes into front end routes // turn related api browser routes into front end routes
getLinks(); getLinks();
// use options labels to manipulate display of details // use options labels to manipulate display of details
getLabels(); getLabelsAndTooltips();
// set up a read only code mirror for extra vars // set up a read only code mirror for extra vars
$scope.variables = ParseVariableString($scope.workflow.extra_vars); $scope.variables = ParseVariableString($scope.workflow.extra_vars);

View File

@@ -15,7 +15,7 @@
<div class="WorkflowResults-panelHeader"> <div class="WorkflowResults-panelHeader">
<div <div
class="WorkflowResults-panelHeaderText"> class="WorkflowResults-panelHeaderText">
DETAILS {{ strings.details.HEADER }}
</div> </div>
<!-- LEFT PANE HEADER ACTIONS --> <!-- LEFT PANE HEADER ACTIONS -->
@@ -26,7 +26,7 @@
data-placement="top" data-placement="top"
mode="all" mode="all"
ng-click="relaunchJob()" ng-click="relaunchJob()"
aw-tool-tip="{{'Relaunch using the same parameters'|translate}}" aw-tool-tip="{{ strings.tooltips.RELAUNCH }}"
data-original-title="" data-original-title=""
title=""> title="">
<i class="icon-launch"></i> <i class="icon-launch"></i>
@@ -39,7 +39,7 @@
ng-click="cancelJob()" ng-click="cancelJob()"
ng-show="workflow.status == 'running' || ng-show="workflow.status == 'running' ||
workflow.status=='pending' " workflow.status=='pending' "
aw-tool-tip="{{'Cancel'|translate}}" aw-tool-tip="{{ strings.tooltips.CANCEL }}"
data-original-title="" title=""> data-original-title="" title="">
<i class="fa fa-minus-circle"></i> <i class="fa fa-minus-circle"></i>
</button> </button>
@@ -51,7 +51,7 @@
ng-click="deleteJob()" ng-click="deleteJob()"
ng-hide="workflow.status == 'running' || ng-hide="workflow.status == 'running' ||
workflow.status == 'pending' " workflow.status == 'pending' "
aw-tool-tip="{{'Delete'|translate}}" aw-tool-tip="{{ strings.tooltips.DELETE }}"
data-original-title="" data-original-title=""
title=""> title="">
<i class="fa fa-trash-o"></i> <i class="fa fa-trash-o"></i>
@@ -71,7 +71,7 @@
<i class="WorkflowResults-statusResultIcon <i class="WorkflowResults-statusResultIcon
fa fa
icon-job-{{ workflow.status }}"> icon-job-{{ workflow.status }}">
</i> {{ status_label }} </i> {{ strings.labels.STATUS }}
</div> </div>
</div> </div>
@@ -79,10 +79,10 @@
<div class="WorkflowResults-resultRow" <div class="WorkflowResults-resultRow"
ng-show="workflow.started"> ng-show="workflow.started">
<label class="WorkflowResults-resultRowLabel"> <label class="WorkflowResults-resultRowLabel">
Started {{ strings.labels.STARTED }}
</label> </label>
<div class="WorkflowResults-resultRowText"> <div class="WorkflowResults-resultRowText">
{{ workflow.started | longDate }} {{ (workflow.started | longDate) || strings.details.NOT_STARTED }}
</div> </div>
</div> </div>
@@ -90,11 +90,11 @@
<div class="WorkflowResults-resultRow" <div class="WorkflowResults-resultRow"
ng-show="workflow.started"> ng-show="workflow.started">
<label class="WorkflowResults-resultRowLabel"> <label class="WorkflowResults-resultRowLabel">
Finished {{ strings.labels.FINISHED }}
</label> </label>
<div class="WorkflowResults-resultRowText"> <div class="WorkflowResults-resultRowText">
{{ (workflow.finished | {{ (workflow.finished |
longDate) || "Not Finished" }} longDate) || strings.details.NOT_FINISHED }}
</div> </div>
</div> </div>
@@ -102,11 +102,11 @@
<div class="WorkflowResults-resultRow" <div class="WorkflowResults-resultRow"
ng-show="workflow.summary_fields.workflow_job_template.name"> ng-show="workflow.summary_fields.workflow_job_template.name">
<label class="WorkflowResults-resultRowLabel"> <label class="WorkflowResults-resultRowLabel">
Template {{ strings.labels.TEMPLATE }}
</label> </label>
<div class="WorkflowResults-resultRowText"> <div class="WorkflowResults-resultRowText">
<a href="{{ workflow_job_template_link }}" <a href="{{ workflow_job_template_link }}"
aw-tool-tip="Edit the workflow job template" aw-tool-tip="{{ strings.tooltips.EDIT_WORKFLOW }}"
data-placement="top"> data-placement="top">
{{ workflow.summary_fields.workflow_job_template.name }} {{ workflow.summary_fields.workflow_job_template.name }}
</a> </a>
@@ -117,11 +117,11 @@
<div class="WorkflowResults-resultRow" <div class="WorkflowResults-resultRow"
ng-show="workflow.summary_fields.created_by.username"> ng-show="workflow.summary_fields.created_by.username">
<label class="WorkflowResults-resultRowLabel"> <label class="WorkflowResults-resultRowLabel">
Launched By {{ strings.labels.LAUNCHED_BY }}
</label> </label>
<div class="WorkflowResults-resultRowText"> <div class="WorkflowResults-resultRowText">
<a href="{{ created_by_link }}" <a href="{{ created_by_link }}"
aw-tool-tip="{{'Edit the User'|translate}}" aw-tool-tip="{{ strings.tooltips.EDIT_USER }}"
data-placement="top"> data-placement="top">
{{ workflow.summary_fields.created_by.username }} {{ workflow.summary_fields.created_by.username }}
</a> </a>
@@ -133,11 +133,11 @@
ng-show="workflow.summary_fields.schedule.name"> ng-show="workflow.summary_fields.schedule.name">
<label <label
class="WorkflowResults-resultRowLabel"> class="WorkflowResults-resultRowLabel">
Launched By {{ strings.labels.LAUNCHED_BY }}
</label> </label>
<div class="WorkflowResults-resultRowText"> <div class="WorkflowResults-resultRowText">
<a href="{{ scheduled_by_link }}" <a href="{{ scheduled_by_link }}"
aw-tool-tip="Edit the Schedule" aw-tool-tip="{{ strings.tooltips.EDIT_SCHEDULE }}"
data-placement="top"> data-placement="top">
{{ workflow.summary_fields.schedule.name }} {{ workflow.summary_fields.schedule.name }}
</a> </a>
@@ -163,7 +163,7 @@
ng-show="lessLabels" ng-show="lessLabels"
href="" href=""
ng-click="toggleLessLabels()"> ng-click="toggleLessLabels()">
Labels {{ strings.labels.LABELS }}
<i class="WorkflowResults-expandArrow <i class="WorkflowResults-expandArrow
fa fa-caret-right"></i> fa fa-caret-right"></i>
</a> </a>
@@ -172,7 +172,7 @@
ng-show="!lessLabels" ng-show="!lessLabels"
href="" href=""
ng-click="toggleLessLabels()"> ng-click="toggleLessLabels()">
Labels {{ strings.labels.LABELS }}
<i class="WorkflowResults-expandArrow <i class="WorkflowResults-expandArrow
fa fa-caret-down"></i> fa fa-caret-down"></i>
</a> </a>
@@ -207,7 +207,7 @@
<i class="WorkflowResults-statusResultIcon <i class="WorkflowResults-statusResultIcon
fa icon-job-{{ workflow.status }}" fa icon-job-{{ workflow.status }}"
ng-show="stdoutFullScreen" ng-show="stdoutFullScreen"
aw-tool-tip="Job {{status_label}}" aw-tool-tip="{{ strings.tooltips.STATUS }}"
aw-tip-placement="top" aw-tip-placement="top"
data-original-title> data-original-title>
</i> </i>
@@ -218,7 +218,7 @@
<div class="WorkflowResults-badgeRow"> <div class="WorkflowResults-badgeRow">
<!-- PLAYS COUNT --> <!-- PLAYS COUNT -->
<div class="WorkflowResults-badgeTitle"> <div class="WorkflowResults-badgeTitle">
Total Jobs {{ strings.results.TOTAL_JOBS }}
</div> </div>
<span class="badge List-titleBadge"> <span class="badge List-titleBadge">
{{ workflow_nodes.length || 0}} {{ workflow_nodes.length || 0}}
@@ -226,7 +226,7 @@
<!-- ELAPSED TIME --> <!-- ELAPSED TIME -->
<div class="WorkflowResults-badgeTitle"> <div class="WorkflowResults-badgeTitle">
Elapsed {{ strings.results.ELAPSED }}
</div> </div>
<span class="badge List-titleBadge"> <span class="badge List-titleBadge">
{{ workflow.elapsed * 1000 | duration: "hh:mm:ss"}} {{ workflow.elapsed * 1000 | duration: "hh:mm:ss"}}
@@ -238,8 +238,8 @@
<!-- FULL-SCREEN TOGGLE ACTION --> <!-- FULL-SCREEN TOGGLE ACTION -->
<button class="StandardOut-actionButton" <button class="StandardOut-actionButton"
aw-tool-tip="{{ toggleStdoutFullscreenTooltip }}" aw-tool-tip="{{ strings.tooltips.TOGGLE_STDOUT_FULLSCREEN }}"
data-tip-watch="toggleStdoutFullscreenTooltip" data-tip-watch="strings.tooltips.TOGGLE_STDOUT_FULLSCREEN"
data-placement="top" data-placement="top"
ng-class="{'StandardOut-actionButton--active': stdoutFullScreen}" ng-class="{'StandardOut-actionButton--active': stdoutFullScreen}"
ng-click="toggleStdoutFullscreen()"> ng-click="toggleStdoutFullscreen()">
@@ -252,26 +252,26 @@
<workflow-status-bar></workflow-status-bar> <workflow-status-bar></workflow-status-bar>
<div class="WorkflowLegend-details"> <div class="WorkflowLegend-details">
<div class="WorkflowLegend-details--left"> <div class="WorkflowLegend-details--left">
<div class="WorkflowLegend-legendItem">KEY:</div> <div class="WorkflowLegend-legendItem">{{ strings.legend.KEY }}:</div>
<div class="WorkflowLegend-legendItem"> <div class="WorkflowLegend-legendItem">
<div class="WorkflowLegend-onSuccessLegend"></div> <div class="WorkflowLegend-onSuccessLegend"></div>
<div>On Success</div> <div>{{ strings.legend.ON_SUCCESS }}</div>
</div> </div>
<div class="WorkflowLegend-legendItem"> <div class="WorkflowLegend-legendItem">
<div class="WorkflowLegend-onFailLegend"></div> <div class="WorkflowLegend-onFailLegend"></div>
<div>On Fail</div> <div>{{ strings.legend.ON_FAIL }}</div>
</div> </div>
<div class="WorkflowLegend-legendItem"> <div class="WorkflowLegend-legendItem">
<div class="WorkflowLegend-alwaysLegend"></div> <div class="WorkflowLegend-alwaysLegend"></div>
<div>Always</div> <div>{{ strings.legend.ALWAYS }}</div>
</div> </div>
<div class="WorkflowLegend-legendItem"> <div class="WorkflowLegend-legendItem">
<div class="WorkflowLegend-letterCircle">P</div> <div class="WorkflowLegend-letterCircle">P</div>
<div>Project Sync</div> <div>{{ strings.legend.PROJECT_SYNC }}</div>
</div> </div>
<div class="WorkflowLegend-legendItem"> <div class="WorkflowLegend-legendItem">
<div class="WorkflowLegend-letterCircle">I</div> <div class="WorkflowLegend-letterCircle">I</div>
<div>Inventory Sync</div> <div>{{ strings.legend.INVENTORY_SYNC }}</div>
</div> </div>
</div> </div>
<div class="WorkflowLegend-details--right"> <div class="WorkflowLegend-details--right">