From bcf768e7fc6270b6a929dd965ebe3961c6ea217e Mon Sep 17 00:00:00 2001 From: Michael Abashian Date: Mon, 14 Nov 2016 15:19:42 -0500 Subject: [PATCH 1/2] Included the workflow graph directive on the workflow details view. Re-organized the job templates directory. It's now just "templates" --- awx/ui/client/src/app.js | 8 +- .../edit/inventory-edit.controller.js | 6 +- awx/ui/client/src/lists.js | 4 +- .../lists/{JobTemplates.js => Templates.js} | 4 +- .../linkout/organizations-linkout.route.js | 6 +- .../job-template-add.controller.js | 0 .../job_templates}/add-job-template/main.js | 0 .../job-templates-copy.controller.js | 0 .../job-templates-copy.route.js | 0 .../job-templates-copy.service.js | 0 .../job_templates/copy-job-template}/main.js | 2 +- .../job-template-edit.controller.js | 0 .../job_templates}/edit-job-template/main.js | 0 .../labels/labelsList.block.less | 0 .../labels/labelsList.directive.js | 0 .../labels/labelsList.partial.html | 0 .../labels/main.js | 0 .../{job-templates => templates}/list/main.js | 6 +- .../list/templates-list.controller.js} | 14 +- .../list/templates-list.route.js} | 8 +- .../src/{job-templates => templates}/main.js | 35 ++--- .../survey-maker/main.js | 2 +- .../survey-maker/questions/edit.factory.js | 0 .../survey-maker/questions/main.js | 0 .../questions/question-scope.factory.js | 0 .../survey-maker/render/main.js | 0 .../render/multiple-choice.directive.js | 0 .../render/multiple-choice.partial.html | 0 .../render/multiselect.directive.js | 0 .../render/survey-question.directive.js | 0 .../render/survey-question.partial.html | 0 .../survey-maker/shared/main.js | 0 .../shared/question-definition.form.js | 0 .../shared/survey-controls.block.less | 0 .../survey-maker/survey-maker.block.less | 0 .../survey-maker/surveys/add.factory.js | 0 .../survey-maker/surveys/delete.factory.js | 0 .../survey-maker/surveys/edit.factory.js | 0 .../survey-maker/surveys/init.factory.js | 0 .../survey-maker/surveys/main.js | 0 .../survey-maker/surveys/show.factory.js | 0 .../templates.service.js} | 0 .../workflows}/add-workflow/main.js | 0 .../add-workflow/workflow-add.controller.js | 8 +- .../add-workflow/workflow-add.partial.html | 0 .../workflows}/edit-workflow/main.js | 0 .../edit-workflow/workflow-edit.controller.js | 22 +-- .../edit-workflow/workflow-edit.partial.html | 0 .../workflows}/workflow-chart/main.js | 2 +- .../workflow-chart/workflow-chart.block.less | 0 .../workflow-chart.directive.js | 0 .../workflows}/workflow-maker/main.js | 4 +- .../workflow-maker/workflow-maker.block.less | 0 .../workflow-maker.controller.js | 18 +-- .../workflow-maker.directive.js | 10 +- .../workflow-maker.partial.html | 0 .../workflows/workflow.service.js} | 7 +- .../workflow-results.controller.js | 130 ++++++++++++++++++ .../workflow-results.partial.html | 2 +- .../templates-list.controller-test.js} | 26 ++-- .../workflows/workflow-add.controller-test.js | 20 +-- .../workflow-maker.controller-test.js | 7 +- 62 files changed, 242 insertions(+), 109 deletions(-) rename awx/ui/client/src/lists/{JobTemplates.js => Templates.js} (97%) rename awx/ui/client/src/{job-templates => templates/job_templates}/add-job-template/job-template-add.controller.js (100%) rename awx/ui/client/src/{job-templates => templates/job_templates}/add-job-template/main.js (100%) rename awx/ui/client/src/{job-templates/copy => templates/job_templates/copy-job-template}/job-templates-copy.controller.js (100%) rename awx/ui/client/src/{job-templates/copy => templates/job_templates/copy-job-template}/job-templates-copy.route.js (100%) rename awx/ui/client/src/{job-templates/copy => templates/job_templates/copy-job-template}/job-templates-copy.service.js (100%) rename awx/ui/client/src/{job-templates/copy => templates/job_templates/copy-job-template}/main.js (92%) rename awx/ui/client/src/{job-templates => templates/job_templates}/edit-job-template/job-template-edit.controller.js (100%) rename awx/ui/client/src/{job-templates => templates/job_templates}/edit-job-template/main.js (100%) rename awx/ui/client/src/{job-templates => templates}/labels/labelsList.block.less (100%) rename awx/ui/client/src/{job-templates => templates}/labels/labelsList.directive.js (100%) rename awx/ui/client/src/{job-templates => templates}/labels/labelsList.partial.html (100%) rename awx/ui/client/src/{job-templates => templates}/labels/main.js (100%) rename awx/ui/client/src/{job-templates => templates}/list/main.js (52%) rename awx/ui/client/src/{job-templates/list/job-templates-list.controller.js => templates/list/templates-list.controller.js} (94%) rename awx/ui/client/src/{job-templates/list/job-templates-list.route.js => templates/list/templates-list.route.js} (82%) rename awx/ui/client/src/{job-templates => templates}/main.js (95%) rename awx/ui/client/src/{job-templates => templates}/survey-maker/main.js (90%) rename awx/ui/client/src/{job-templates => templates}/survey-maker/questions/edit.factory.js (100%) rename awx/ui/client/src/{job-templates => templates}/survey-maker/questions/main.js (100%) rename awx/ui/client/src/{job-templates => templates}/survey-maker/questions/question-scope.factory.js (100%) rename awx/ui/client/src/{job-templates => templates}/survey-maker/render/main.js (100%) rename awx/ui/client/src/{job-templates => templates}/survey-maker/render/multiple-choice.directive.js (100%) rename awx/ui/client/src/{job-templates => templates}/survey-maker/render/multiple-choice.partial.html (100%) rename awx/ui/client/src/{job-templates => templates}/survey-maker/render/multiselect.directive.js (100%) rename awx/ui/client/src/{job-templates => templates}/survey-maker/render/survey-question.directive.js (100%) rename awx/ui/client/src/{job-templates => templates}/survey-maker/render/survey-question.partial.html (100%) rename awx/ui/client/src/{job-templates => templates}/survey-maker/shared/main.js (100%) rename awx/ui/client/src/{job-templates => templates}/survey-maker/shared/question-definition.form.js (100%) rename awx/ui/client/src/{job-templates => templates}/survey-maker/shared/survey-controls.block.less (100%) rename awx/ui/client/src/{job-templates => templates}/survey-maker/survey-maker.block.less (100%) rename awx/ui/client/src/{job-templates => templates}/survey-maker/surveys/add.factory.js (100%) rename awx/ui/client/src/{job-templates => templates}/survey-maker/surveys/delete.factory.js (100%) rename awx/ui/client/src/{job-templates => templates}/survey-maker/surveys/edit.factory.js (100%) rename awx/ui/client/src/{job-templates => templates}/survey-maker/surveys/init.factory.js (100%) rename awx/ui/client/src/{job-templates => templates}/survey-maker/surveys/main.js (100%) rename awx/ui/client/src/{job-templates => templates}/survey-maker/surveys/show.factory.js (100%) rename awx/ui/client/src/{job-templates/job-template.service.js => templates/templates.service.js} (100%) rename awx/ui/client/src/{job-templates => templates/workflows}/add-workflow/main.js (100%) rename awx/ui/client/src/{job-templates => templates/workflows}/add-workflow/workflow-add.controller.js (96%) rename awx/ui/client/src/{job-templates => templates/workflows}/add-workflow/workflow-add.partial.html (100%) rename awx/ui/client/src/{job-templates => templates/workflows}/edit-workflow/main.js (100%) rename awx/ui/client/src/{job-templates => templates/workflows}/edit-workflow/workflow-edit.controller.js (97%) rename awx/ui/client/src/{job-templates => templates/workflows}/edit-workflow/workflow-edit.partial.html (100%) rename awx/ui/client/src/{job-templates => templates/workflows}/workflow-chart/main.js (85%) rename awx/ui/client/src/{job-templates => templates/workflows}/workflow-chart/workflow-chart.block.less (100%) rename awx/ui/client/src/{job-templates => templates/workflows}/workflow-chart/workflow-chart.directive.js (100%) rename awx/ui/client/src/{job-templates => templates/workflows}/workflow-maker/main.js (74%) rename awx/ui/client/src/{job-templates => templates/workflows}/workflow-maker/workflow-maker.block.less (100%) rename awx/ui/client/src/{job-templates => templates/workflows}/workflow-maker/workflow-maker.controller.js (97%) rename awx/ui/client/src/{job-templates => templates/workflows}/workflow-maker/workflow-maker.directive.js (86%) rename awx/ui/client/src/{job-templates => templates/workflows}/workflow-maker/workflow-maker.partial.html (100%) rename awx/ui/client/src/{job-templates/workflow-maker/workflow-help.service.js => templates/workflows/workflow.service.js} (94%) rename awx/ui/tests/spec/{job-templates/job-templates-list.controller-test.js => templates/templates-list.controller-test.js} (87%) diff --git a/awx/ui/client/src/app.js b/awx/ui/client/src/app.js index 3174bc6b98..52c09ded9e 100644 --- a/awx/ui/client/src/app.js +++ b/awx/ui/client/src/app.js @@ -67,7 +67,7 @@ import moment from './shared/moment/main'; import login from './login/main'; import activityStream from './activity-stream/main'; import standardOut from './standard-out/main'; -import JobTemplates from './job-templates/main'; +import Templates from './templates/main'; import credentials from './credentials/main'; import { ProjectsList, ProjectsAdd, ProjectsEdit } from './controllers/Projects'; import { UsersList, UsersAdd, UsersEdit } from './controllers/Users'; @@ -126,7 +126,7 @@ var tower = angular.module('Tower', [ jobSubmission.name, notifications.name, standardOut.name, - JobTemplates.name, + Templates.name, portalMode.name, config.name, credentials.name, @@ -135,7 +135,7 @@ var tower = angular.module('Tower', [ 'OrganizationFormDefinition', 'UserFormDefinition', 'OrganizationListDefinition', - 'jobTemplates', + 'templates', 'UserListDefinition', 'UserHelper', 'PromptDialog', @@ -158,7 +158,7 @@ var tower = angular.module('Tower', [ 'TeamHelper', 'CredentialsListDefinition', 'CredentialFormDefinition', - 'JobTemplatesListDefinition', + 'TemplatesListDefinition', 'PortalJobTemplatesListDefinition', 'JobTemplateFormDefinition', 'JobTemplatesHelper', diff --git a/awx/ui/client/src/inventories/edit/inventory-edit.controller.js b/awx/ui/client/src/inventories/edit/inventory-edit.controller.js index 697bfdd949..ba6de0f183 100644 --- a/awx/ui/client/src/inventories/edit/inventory-edit.controller.js +++ b/awx/ui/client/src/inventories/edit/inventory-edit.controller.js @@ -14,7 +14,7 @@ function InventoriesEdit($scope, $rootScope, $compile, $location, $log, $stateParams, InventoryForm, Rest, Alert, ProcessErrors, ClearScope, GetBasePath, ParseTypeChange, Wait, ToJSON, ParseVariableString, Prompt, InitiatePlaybookRun, - JobTemplateService, $state, $filter) { + TemplatesService, $state, $filter) { // Inject dynamic view var defaultUrl = GetBasePath('inventory'), @@ -146,7 +146,7 @@ function InventoriesEdit($scope, $rootScope, $compile, $location, action = function () { $('#prompt-modal').modal('hide'); Wait('start'); - JobTemplateService.deleteJobTemplate(id) + TemplatesService.deleteJobTemplate(id) .success(function () { $('#prompt-modal').modal('hide'); // @issue: OLD SEARCH @@ -174,5 +174,5 @@ export default ['$scope', '$rootScope', '$compile', '$location', '$log', '$stateParams', 'InventoryForm', 'Rest', 'Alert', 'ProcessErrors', 'ClearScope', 'GetBasePath', 'ParseTypeChange', 'Wait', 'ToJSON', 'ParseVariableString', 'Prompt', 'InitiatePlaybookRun', - 'JobTemplateService', '$state', '$filter', InventoriesEdit, + 'TemplatesService', '$state', '$filter', InventoriesEdit, ]; diff --git a/awx/ui/client/src/lists.js b/awx/ui/client/src/lists.js index f7b0288822..3a02e6a127 100644 --- a/awx/ui/client/src/lists.js +++ b/awx/ui/client/src/lists.js @@ -16,7 +16,6 @@ import InventoryHosts from "./lists/InventoryHosts"; import InventorySources from "./lists/InventorySources"; import JobEvents from "./lists/JobEvents"; import JobHosts from "./lists/JobHosts"; -import JobTemplates from "./lists/JobTemplates"; import Jobs from "./lists/Jobs"; import Organizations from "./lists/Organizations"; import PortalJobTemplates from "./lists/PortalJobTemplates"; @@ -27,6 +26,7 @@ import ScheduledJobs from "./lists/ScheduledJobs"; import Schedules from "./lists/Schedules"; import Streams from "./lists/Streams"; import Teams from "./lists/Teams"; +import Templates from "./lists/Templates"; import Users from "./lists/Users"; export @@ -42,7 +42,6 @@ export InventorySources, JobEvents, JobHosts, - JobTemplates, Jobs, Organizations, PortalJobTemplates, @@ -53,5 +52,6 @@ export Schedules, Streams, Teams, + Templates, Users }; diff --git a/awx/ui/client/src/lists/JobTemplates.js b/awx/ui/client/src/lists/Templates.js similarity index 97% rename from awx/ui/client/src/lists/JobTemplates.js rename to awx/ui/client/src/lists/Templates.js index 0713402775..7979c46f8e 100644 --- a/awx/ui/client/src/lists/JobTemplates.js +++ b/awx/ui/client/src/lists/Templates.js @@ -6,8 +6,8 @@ export default - angular.module('JobTemplatesListDefinition', []) - .factory('JobTemplateList', ['i18n', function(i18n) { + angular.module('TemplatesListDefinition', []) + .factory('TemplateList', ['i18n', function(i18n) { return { name: 'templates', diff --git a/awx/ui/client/src/organizations/linkout/organizations-linkout.route.js b/awx/ui/client/src/organizations/linkout/organizations-linkout.route.js index c22b3c1049..3f65c144ab 100644 --- a/awx/ui/client/src/organizations/linkout/organizations-linkout.route.js +++ b/awx/ui/client/src/organizations/linkout/organizations-linkout.route.js @@ -288,13 +288,15 @@ export default [{ features: ['FeaturesService', function(FeaturesService) { return FeaturesService.get(); }], - OrgJobTemplateList: ['JobTemplateList', 'GetBasePath', '$stateParams', function(JobTemplateList) { - let list = _.cloneDeep(JobTemplateList); + OrgJobTemplateList: ['TemplateList', 'GetBasePath', '$stateParams', function(TemplateList) { + let list = _.cloneDeep(TemplateList); delete list.actions; // @issue Why is the delete action unavailable in this view? delete list.fieldActions.delete; list.emptyListText = "This list is populated by job templates added from the Job Templates section"; list.searchSize = "col-lg-12 col-md-12 col-sm-12 col-xs-12"; + list.iterator = 'job_template'; + list.name = 'job_templates'; return list; }], OrgJobTemplateDataset: ['OrgJobTemplateList', 'QuerySet', '$stateParams', 'GetBasePath', diff --git a/awx/ui/client/src/job-templates/add-job-template/job-template-add.controller.js b/awx/ui/client/src/templates/job_templates/add-job-template/job-template-add.controller.js similarity index 100% rename from awx/ui/client/src/job-templates/add-job-template/job-template-add.controller.js rename to awx/ui/client/src/templates/job_templates/add-job-template/job-template-add.controller.js diff --git a/awx/ui/client/src/job-templates/add-job-template/main.js b/awx/ui/client/src/templates/job_templates/add-job-template/main.js similarity index 100% rename from awx/ui/client/src/job-templates/add-job-template/main.js rename to awx/ui/client/src/templates/job_templates/add-job-template/main.js diff --git a/awx/ui/client/src/job-templates/copy/job-templates-copy.controller.js b/awx/ui/client/src/templates/job_templates/copy-job-template/job-templates-copy.controller.js similarity index 100% rename from awx/ui/client/src/job-templates/copy/job-templates-copy.controller.js rename to awx/ui/client/src/templates/job_templates/copy-job-template/job-templates-copy.controller.js diff --git a/awx/ui/client/src/job-templates/copy/job-templates-copy.route.js b/awx/ui/client/src/templates/job_templates/copy-job-template/job-templates-copy.route.js similarity index 100% rename from awx/ui/client/src/job-templates/copy/job-templates-copy.route.js rename to awx/ui/client/src/templates/job_templates/copy-job-template/job-templates-copy.route.js diff --git a/awx/ui/client/src/job-templates/copy/job-templates-copy.service.js b/awx/ui/client/src/templates/job_templates/copy-job-template/job-templates-copy.service.js similarity index 100% rename from awx/ui/client/src/job-templates/copy/job-templates-copy.service.js rename to awx/ui/client/src/templates/job_templates/copy-job-template/job-templates-copy.service.js diff --git a/awx/ui/client/src/job-templates/copy/main.js b/awx/ui/client/src/templates/job_templates/copy-job-template/main.js similarity index 92% rename from awx/ui/client/src/job-templates/copy/main.js rename to awx/ui/client/src/templates/job_templates/copy-job-template/main.js index fbccc713e4..1c6cda958a 100644 --- a/awx/ui/client/src/job-templates/copy/main.js +++ b/awx/ui/client/src/templates/job_templates/copy-job-template/main.js @@ -9,7 +9,7 @@ import route from './job-templates-copy.route'; import service from './job-templates-copy.service'; export default - angular.module('jobTemplates.copy', []) + angular.module('templates.copy', []) .service('jobTemplateCopyService', service) .controller('jobTemplateCopyController', controller) .run(['$stateExtender', function($stateExtender) { diff --git a/awx/ui/client/src/job-templates/edit-job-template/job-template-edit.controller.js b/awx/ui/client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js similarity index 100% rename from awx/ui/client/src/job-templates/edit-job-template/job-template-edit.controller.js rename to awx/ui/client/src/templates/job_templates/edit-job-template/job-template-edit.controller.js diff --git a/awx/ui/client/src/job-templates/edit-job-template/main.js b/awx/ui/client/src/templates/job_templates/edit-job-template/main.js similarity index 100% rename from awx/ui/client/src/job-templates/edit-job-template/main.js rename to awx/ui/client/src/templates/job_templates/edit-job-template/main.js diff --git a/awx/ui/client/src/job-templates/labels/labelsList.block.less b/awx/ui/client/src/templates/labels/labelsList.block.less similarity index 100% rename from awx/ui/client/src/job-templates/labels/labelsList.block.less rename to awx/ui/client/src/templates/labels/labelsList.block.less diff --git a/awx/ui/client/src/job-templates/labels/labelsList.directive.js b/awx/ui/client/src/templates/labels/labelsList.directive.js similarity index 100% rename from awx/ui/client/src/job-templates/labels/labelsList.directive.js rename to awx/ui/client/src/templates/labels/labelsList.directive.js diff --git a/awx/ui/client/src/job-templates/labels/labelsList.partial.html b/awx/ui/client/src/templates/labels/labelsList.partial.html similarity index 100% rename from awx/ui/client/src/job-templates/labels/labelsList.partial.html rename to awx/ui/client/src/templates/labels/labelsList.partial.html diff --git a/awx/ui/client/src/job-templates/labels/main.js b/awx/ui/client/src/templates/labels/main.js similarity index 100% rename from awx/ui/client/src/job-templates/labels/main.js rename to awx/ui/client/src/templates/labels/main.js diff --git a/awx/ui/client/src/job-templates/list/main.js b/awx/ui/client/src/templates/list/main.js similarity index 52% rename from awx/ui/client/src/job-templates/list/main.js rename to awx/ui/client/src/templates/list/main.js index 95ef62cac5..d802c64814 100644 --- a/awx/ui/client/src/job-templates/list/main.js +++ b/awx/ui/client/src/templates/list/main.js @@ -4,8 +4,8 @@ * All Rights Reserved *************************************************/ -import controller from './job-templates-list.controller'; +import controller from './templates-list.controller'; export default - angular.module('jobTemplatesList', []) - .controller('JobTemplatesListController', controller); + angular.module('templatesList', []) + .controller('TemplatesListController', controller); diff --git a/awx/ui/client/src/job-templates/list/job-templates-list.controller.js b/awx/ui/client/src/templates/list/templates-list.controller.js similarity index 94% rename from awx/ui/client/src/job-templates/list/job-templates-list.controller.js rename to awx/ui/client/src/templates/list/templates-list.controller.js index ab807971de..7c81887c40 100644 --- a/awx/ui/client/src/job-templates/list/job-templates-list.controller.js +++ b/awx/ui/client/src/templates/list/templates-list.controller.js @@ -5,18 +5,18 @@ *************************************************/ export default ['$scope', '$rootScope', '$location', '$stateParams', 'Rest', 'Alert', - 'JobTemplateList', 'Prompt', 'ClearScope', 'ProcessErrors', 'GetBasePath', - 'InitiatePlaybookRun', 'Wait', '$state', '$filter', 'Dataset', 'rbacUiControlService', 'JobTemplateService', + 'TemplateList', 'Prompt', 'ClearScope', 'ProcessErrors', 'GetBasePath', + 'InitiatePlaybookRun', 'Wait', '$state', '$filter', 'Dataset', 'rbacUiControlService', 'TemplatesService', 'QuerySet', function( $scope, $rootScope, $location, $stateParams, Rest, Alert, - JobTemplateList, Prompt, ClearScope, ProcessErrors, GetBasePath, - InitiatePlaybookRun, Wait, $state, $filter, Dataset, rbacUiControlService, JobTemplateService, + TemplateList, Prompt, ClearScope, ProcessErrors, GetBasePath, + InitiatePlaybookRun, Wait, $state, $filter, Dataset, rbacUiControlService, TemplatesService, qs ) { ClearScope(); - var list = JobTemplateList; + var list = TemplateList; init(); @@ -95,7 +95,7 @@ export default ['$scope', '$rootScope', '$location', '$stateParams', 'Rest', 'Al $('#prompt-modal').modal('hide'); Wait('start'); if(template.type && (template.type === 'Workflow Job Template' || template.type === 'workflow_job_template')) { - JobTemplateService.deleteWorkflowJobTemplate(template.id) + TemplatesService.deleteWorkflowJobTemplate(template.id) .then(function () { handleSuccessfulDelete(); }, function (data) { @@ -105,7 +105,7 @@ export default ['$scope', '$rootScope', '$location', '$stateParams', 'Rest', 'Al }); } else if(template.type && (template.type === 'Job Template' || template.type === 'job_template')) { - JobTemplateService.deleteJobTemplate(template.id) + TemplatesService.deleteJobTemplate(template.id) .then(function () { handleSuccessfulDelete(); }, function (data) { diff --git a/awx/ui/client/src/job-templates/list/job-templates-list.route.js b/awx/ui/client/src/templates/list/templates-list.route.js similarity index 82% rename from awx/ui/client/src/job-templates/list/job-templates-list.route.js rename to awx/ui/client/src/templates/list/templates-list.route.js index 3e64e8cd1a..84c6108863 100644 --- a/awx/ui/client/src/job-templates/list/job-templates-list.route.js +++ b/awx/ui/client/src/templates/list/templates-list.route.js @@ -27,10 +27,10 @@ export default { searchPrefix: 'template', views: { '@': { - controller: 'JobTemplatesListController', - templateProvider: function(JobTemplateList, generateList) { + controller: 'TemplatesListController', + templateProvider: function(TemplateList, generateList) { let html = generateList.build({ - list: JobTemplateList, + list: TemplateList, mode: 'edit' }); html = generateList.wrapPanel(html); @@ -39,7 +39,7 @@ export default { } }, resolve: { - Dataset: ['JobTemplateList', 'QuerySet', '$stateParams', 'GetBasePath', + Dataset: ['TemplateList', 'QuerySet', '$stateParams', 'GetBasePath', function(list, qs, $stateParams, GetBasePath) { let path = GetBasePath(list.basePath) || GetBasePath(list.name); return qs.search(path, $stateParams[`${list.iterator}_search`]); diff --git a/awx/ui/client/src/job-templates/main.js b/awx/ui/client/src/templates/main.js similarity index 95% rename from awx/ui/client/src/job-templates/main.js rename to awx/ui/client/src/templates/main.js index ad80b12967..06ad97905f 100644 --- a/awx/ui/client/src/job-templates/main.js +++ b/awx/ui/client/src/templates/main.js @@ -4,26 +4,27 @@ * All Rights Reserved *************************************************/ -import jobTemplateService from './job-template.service'; - +import templatesService from './templates.service'; import surveyMaker from './survey-maker/main'; -import jobTemplatesList from './list/main'; -import jobTemplatesAdd from './add-job-template/main'; -import jobTemplatesEdit from './edit-job-template/main'; -import jobTemplatesCopy from './copy/main'; -import workflowAdd from './add-workflow/main'; -import workflowEdit from './edit-workflow/main'; +import templatesList from './list/main'; +import jobTemplatesAdd from './job_templates/add-job-template/main'; +import jobTemplatesEdit from './job_templates/edit-job-template/main'; +import jobTemplatesCopy from './job_templates/copy-job-template/main'; +import workflowAdd from './workflows/add-workflow/main'; +import workflowEdit from './workflows/edit-workflow/main'; import labels from './labels/main'; -import workflowChart from './workflow-chart/main'; -import workflowMaker from './workflow-maker/main'; -import jobTemplatesListRoute from './list/job-templates-list.route'; +import workflowChart from './workflows/workflow-chart/main'; +import workflowMaker from './workflows/workflow-maker/main'; +import templatesListRoute from './list/templates-list.route'; +import workflowService from './workflows/workflow.service'; export default -angular.module('jobTemplates', [surveyMaker.name, jobTemplatesList.name, jobTemplatesAdd.name, +angular.module('templates', [surveyMaker.name, templatesList.name, jobTemplatesAdd.name, jobTemplatesEdit.name, jobTemplatesCopy.name, labels.name, workflowAdd.name, workflowEdit.name, workflowChart.name, workflowMaker.name ]) - .service('JobTemplateService', jobTemplateService) + .service('TemplatesService', templatesService) + .service('WorkflowHelpService', workflowService) .config(['$stateProvider', 'stateDefinitionsProvider', '$stateExtenderProvider', function($stateProvider, stateDefinitionsProvider, $stateExtenderProvider) { let stateTree, addJobTemplate, editJobTemplate, addWorkflow, editWorkflow, @@ -332,9 +333,9 @@ angular.module('jobTemplates', [surveyMaker.name, jobTemplatesList.name, jobTemp return qs.search(path, $stateParams[`${list.iterator}_search`]); } ], - WorkflowMakerJobTemplateList: ['JobTemplateList', - (JobTemplateList) => { - let list = _.cloneDeep(JobTemplateList); + WorkflowMakerJobTemplateList: ['TemplateList', + (TemplateList) => { + let list = _.cloneDeep(TemplateList); delete list.fields.type; delete list.fields.description; delete list.fields.smart_status; @@ -472,7 +473,7 @@ angular.module('jobTemplates', [surveyMaker.name, jobTemplatesList.name, jobTemp states: _.reduce(generated, (result, definition) => { return result.concat(definition.states); }, [ - stateExtender.buildDefinition(jobTemplatesListRoute), + stateExtender.buildDefinition(templatesListRoute), stateExtender.buildDefinition(workflowMaker), stateExtender.buildDefinition(inventoryLookup), stateExtender.buildDefinition(credentialLookup) diff --git a/awx/ui/client/src/job-templates/survey-maker/main.js b/awx/ui/client/src/templates/survey-maker/main.js similarity index 90% rename from awx/ui/client/src/job-templates/survey-maker/main.js rename to awx/ui/client/src/templates/survey-maker/main.js index d6ac9de3b8..1d41e63aef 100644 --- a/awx/ui/client/src/job-templates/survey-maker/main.js +++ b/awx/ui/client/src/templates/survey-maker/main.js @@ -5,7 +5,7 @@ import render from './render/main'; import shared from './shared/main'; export default - angular.module('jobTemplates.surveyMaker', + angular.module('templates.surveyMaker', [ listGenerator.name, questions.name, surveys.name, diff --git a/awx/ui/client/src/job-templates/survey-maker/questions/edit.factory.js b/awx/ui/client/src/templates/survey-maker/questions/edit.factory.js similarity index 100% rename from awx/ui/client/src/job-templates/survey-maker/questions/edit.factory.js rename to awx/ui/client/src/templates/survey-maker/questions/edit.factory.js diff --git a/awx/ui/client/src/job-templates/survey-maker/questions/main.js b/awx/ui/client/src/templates/survey-maker/questions/main.js similarity index 100% rename from awx/ui/client/src/job-templates/survey-maker/questions/main.js rename to awx/ui/client/src/templates/survey-maker/questions/main.js diff --git a/awx/ui/client/src/job-templates/survey-maker/questions/question-scope.factory.js b/awx/ui/client/src/templates/survey-maker/questions/question-scope.factory.js similarity index 100% rename from awx/ui/client/src/job-templates/survey-maker/questions/question-scope.factory.js rename to awx/ui/client/src/templates/survey-maker/questions/question-scope.factory.js diff --git a/awx/ui/client/src/job-templates/survey-maker/render/main.js b/awx/ui/client/src/templates/survey-maker/render/main.js similarity index 100% rename from awx/ui/client/src/job-templates/survey-maker/render/main.js rename to awx/ui/client/src/templates/survey-maker/render/main.js diff --git a/awx/ui/client/src/job-templates/survey-maker/render/multiple-choice.directive.js b/awx/ui/client/src/templates/survey-maker/render/multiple-choice.directive.js similarity index 100% rename from awx/ui/client/src/job-templates/survey-maker/render/multiple-choice.directive.js rename to awx/ui/client/src/templates/survey-maker/render/multiple-choice.directive.js diff --git a/awx/ui/client/src/job-templates/survey-maker/render/multiple-choice.partial.html b/awx/ui/client/src/templates/survey-maker/render/multiple-choice.partial.html similarity index 100% rename from awx/ui/client/src/job-templates/survey-maker/render/multiple-choice.partial.html rename to awx/ui/client/src/templates/survey-maker/render/multiple-choice.partial.html diff --git a/awx/ui/client/src/job-templates/survey-maker/render/multiselect.directive.js b/awx/ui/client/src/templates/survey-maker/render/multiselect.directive.js similarity index 100% rename from awx/ui/client/src/job-templates/survey-maker/render/multiselect.directive.js rename to awx/ui/client/src/templates/survey-maker/render/multiselect.directive.js diff --git a/awx/ui/client/src/job-templates/survey-maker/render/survey-question.directive.js b/awx/ui/client/src/templates/survey-maker/render/survey-question.directive.js similarity index 100% rename from awx/ui/client/src/job-templates/survey-maker/render/survey-question.directive.js rename to awx/ui/client/src/templates/survey-maker/render/survey-question.directive.js diff --git a/awx/ui/client/src/job-templates/survey-maker/render/survey-question.partial.html b/awx/ui/client/src/templates/survey-maker/render/survey-question.partial.html similarity index 100% rename from awx/ui/client/src/job-templates/survey-maker/render/survey-question.partial.html rename to awx/ui/client/src/templates/survey-maker/render/survey-question.partial.html diff --git a/awx/ui/client/src/job-templates/survey-maker/shared/main.js b/awx/ui/client/src/templates/survey-maker/shared/main.js similarity index 100% rename from awx/ui/client/src/job-templates/survey-maker/shared/main.js rename to awx/ui/client/src/templates/survey-maker/shared/main.js diff --git a/awx/ui/client/src/job-templates/survey-maker/shared/question-definition.form.js b/awx/ui/client/src/templates/survey-maker/shared/question-definition.form.js similarity index 100% rename from awx/ui/client/src/job-templates/survey-maker/shared/question-definition.form.js rename to awx/ui/client/src/templates/survey-maker/shared/question-definition.form.js diff --git a/awx/ui/client/src/job-templates/survey-maker/shared/survey-controls.block.less b/awx/ui/client/src/templates/survey-maker/shared/survey-controls.block.less similarity index 100% rename from awx/ui/client/src/job-templates/survey-maker/shared/survey-controls.block.less rename to awx/ui/client/src/templates/survey-maker/shared/survey-controls.block.less diff --git a/awx/ui/client/src/job-templates/survey-maker/survey-maker.block.less b/awx/ui/client/src/templates/survey-maker/survey-maker.block.less similarity index 100% rename from awx/ui/client/src/job-templates/survey-maker/survey-maker.block.less rename to awx/ui/client/src/templates/survey-maker/survey-maker.block.less diff --git a/awx/ui/client/src/job-templates/survey-maker/surveys/add.factory.js b/awx/ui/client/src/templates/survey-maker/surveys/add.factory.js similarity index 100% rename from awx/ui/client/src/job-templates/survey-maker/surveys/add.factory.js rename to awx/ui/client/src/templates/survey-maker/surveys/add.factory.js diff --git a/awx/ui/client/src/job-templates/survey-maker/surveys/delete.factory.js b/awx/ui/client/src/templates/survey-maker/surveys/delete.factory.js similarity index 100% rename from awx/ui/client/src/job-templates/survey-maker/surveys/delete.factory.js rename to awx/ui/client/src/templates/survey-maker/surveys/delete.factory.js diff --git a/awx/ui/client/src/job-templates/survey-maker/surveys/edit.factory.js b/awx/ui/client/src/templates/survey-maker/surveys/edit.factory.js similarity index 100% rename from awx/ui/client/src/job-templates/survey-maker/surveys/edit.factory.js rename to awx/ui/client/src/templates/survey-maker/surveys/edit.factory.js diff --git a/awx/ui/client/src/job-templates/survey-maker/surveys/init.factory.js b/awx/ui/client/src/templates/survey-maker/surveys/init.factory.js similarity index 100% rename from awx/ui/client/src/job-templates/survey-maker/surveys/init.factory.js rename to awx/ui/client/src/templates/survey-maker/surveys/init.factory.js diff --git a/awx/ui/client/src/job-templates/survey-maker/surveys/main.js b/awx/ui/client/src/templates/survey-maker/surveys/main.js similarity index 100% rename from awx/ui/client/src/job-templates/survey-maker/surveys/main.js rename to awx/ui/client/src/templates/survey-maker/surveys/main.js diff --git a/awx/ui/client/src/job-templates/survey-maker/surveys/show.factory.js b/awx/ui/client/src/templates/survey-maker/surveys/show.factory.js similarity index 100% rename from awx/ui/client/src/job-templates/survey-maker/surveys/show.factory.js rename to awx/ui/client/src/templates/survey-maker/surveys/show.factory.js diff --git a/awx/ui/client/src/job-templates/job-template.service.js b/awx/ui/client/src/templates/templates.service.js similarity index 100% rename from awx/ui/client/src/job-templates/job-template.service.js rename to awx/ui/client/src/templates/templates.service.js diff --git a/awx/ui/client/src/job-templates/add-workflow/main.js b/awx/ui/client/src/templates/workflows/add-workflow/main.js similarity index 100% rename from awx/ui/client/src/job-templates/add-workflow/main.js rename to awx/ui/client/src/templates/workflows/add-workflow/main.js diff --git a/awx/ui/client/src/job-templates/add-workflow/workflow-add.controller.js b/awx/ui/client/src/templates/workflows/add-workflow/workflow-add.controller.js similarity index 96% rename from awx/ui/client/src/job-templates/add-workflow/workflow-add.controller.js rename to awx/ui/client/src/templates/workflows/add-workflow/workflow-add.controller.js index fd51a4adc1..11c7e35a5c 100644 --- a/awx/ui/client/src/job-templates/add-workflow/workflow-add.controller.js +++ b/awx/ui/client/src/templates/workflows/add-workflow/workflow-add.controller.js @@ -6,11 +6,11 @@ export default [ '$scope', 'WorkflowForm', 'GenerateForm', 'Alert', 'ProcessErrors', 'ClearScope', - 'Wait', '$state', 'CreateSelect2', 'JobTemplateService', 'ToJSON', + 'Wait', '$state', 'CreateSelect2', 'TemplatesService', 'ToJSON', 'ParseTypeChange', 'OrganizationList', '$q', 'Rest', 'GetBasePath', function( $scope, WorkflowForm, GenerateForm, Alert, ProcessErrors, ClearScope, - Wait, $state, CreateSelect2, JobTemplateService, ToJSON, + Wait, $state, CreateSelect2, TemplatesService, ToJSON, ParseTypeChange, OrganizationList, $q, Rest, GetBasePath ) { @@ -45,7 +45,7 @@ }); // Go out and grab the possible labels - JobTemplateService.getLabelOptions() + TemplatesService.getLabelOptions() .then(function(data){ $scope.labelOptions = data; // select2-ify the labels input @@ -98,7 +98,7 @@ .filter("[data-label-is-present=true]") .map((i, val) => ({name: $(val).text()})); - JobTemplateService.createWorkflowJobTemplate(data) + TemplatesService.createWorkflowJobTemplate(data) .then(function(data) { let orgDefer = $q.defer(); diff --git a/awx/ui/client/src/job-templates/add-workflow/workflow-add.partial.html b/awx/ui/client/src/templates/workflows/add-workflow/workflow-add.partial.html similarity index 100% rename from awx/ui/client/src/job-templates/add-workflow/workflow-add.partial.html rename to awx/ui/client/src/templates/workflows/add-workflow/workflow-add.partial.html diff --git a/awx/ui/client/src/job-templates/edit-workflow/main.js b/awx/ui/client/src/templates/workflows/edit-workflow/main.js similarity index 100% rename from awx/ui/client/src/job-templates/edit-workflow/main.js rename to awx/ui/client/src/templates/workflows/edit-workflow/main.js diff --git a/awx/ui/client/src/job-templates/edit-workflow/workflow-edit.controller.js b/awx/ui/client/src/templates/workflows/edit-workflow/workflow-edit.controller.js similarity index 97% rename from awx/ui/client/src/job-templates/edit-workflow/workflow-edit.controller.js rename to awx/ui/client/src/templates/workflows/edit-workflow/workflow-edit.controller.js index c666f44815..c4cf1c13e3 100644 --- a/awx/ui/client/src/job-templates/edit-workflow/workflow-edit.controller.js +++ b/awx/ui/client/src/templates/workflows/edit-workflow/workflow-edit.controller.js @@ -8,12 +8,12 @@ [ '$scope', '$stateParams', 'WorkflowForm', 'GenerateForm', 'Alert', 'ProcessErrors', 'ClearScope', 'GetBasePath', '$q', 'ParseTypeChange', 'Wait', 'Empty', 'ToJSON', 'initSurvey', '$state', 'CreateSelect2', 'ParseVariableString', - 'JobTemplateService', 'OrganizationList', 'Rest', + 'TemplatesService', 'OrganizationList', 'Rest', function( $scope, $stateParams, WorkflowForm, GenerateForm, Alert, ProcessErrors, ClearScope, GetBasePath, $q, ParseTypeChange, Wait, Empty, ToJSON, SurveyControllerInit, $state, CreateSelect2, ParseVariableString, - JobTemplateService, OrganizationList, Rest + TemplatesService, OrganizationList, Rest ) {window.state = $state; ClearScope(); @@ -192,7 +192,7 @@ }); // Get the workflow nodes - JobTemplateService.getWorkflowJobTemplateNodes(id) + TemplatesService.getWorkflowJobTemplateNodes(id) .then(function(data){ let nodesArray = data.data.results; @@ -251,7 +251,7 @@ }); // Go out and GET the workflow job temlate data needed to populate the form - JobTemplateService.getWorkflowJobTemplate(id) + TemplatesService.getWorkflowJobTemplate(id) .then(function(data){ let workflowJobTemplateData = data.data; $scope.workflow_job_template_obj = workflowJobTemplateData; @@ -392,7 +392,7 @@ if(params.node.isNew) { - JobTemplateService.addWorkflowNode({ + TemplatesService.addWorkflowNode({ url: generatePostUrl(), data: buildSendableNodeData() }) @@ -500,7 +500,7 @@ // these promise arrays to play nicely. I tried to just append // a single promise to deletePromises but it just wasn't working let editWorkflowJobTemplate = [id].map(function(id) { - return JobTemplateService.updateWorkflowJobTemplate({ + return TemplatesService.updateWorkflowJobTemplate({ id: id, data: data }); @@ -510,7 +510,7 @@ let completionCallback = function() { let disassociatePromises = $scope.disassociateRequests.map(function(request) { - return JobTemplateService.disassociateWorkflowNode({ + return TemplatesService.disassociateWorkflowNode({ parentId: request.parentId, nodeId: request.nodeId, edge: request.edge @@ -518,7 +518,7 @@ }); let editNodePromises = $scope.editRequests.map(function(request) { - return JobTemplateService.editWorkflowNode({ + return TemplatesService.editWorkflowNode({ id: request.id, data: request.data }); @@ -528,7 +528,7 @@ .then(function() { let associatePromises = $scope.associateRequests.map(function(request) { - return JobTemplateService.associateWorkflowNode({ + return TemplatesService.associateWorkflowNode({ parentId: request.parentId, nodeId: request.nodeId, edge: request.edge @@ -536,7 +536,7 @@ }); let deletePromises = $scope.workflowTree.data.deletedNodes.map(function(nodeId) { - return JobTemplateService.deleteWorkflowJobTemplateNode(nodeId); + return TemplatesService.deleteWorkflowJobTemplateNode(nodeId); }); $q.all(associatePromises.concat(deletePromises)) @@ -634,7 +634,7 @@ else { let deletePromises = $scope.workflowTree.data.deletedNodes.map(function(nodeId) { - return JobTemplateService.deleteWorkflowJobTemplateNode(nodeId); + return TemplatesService.deleteWorkflowJobTemplateNode(nodeId); }); $q.all(deletePromises.concat(editWorkflowJobTemplate)) diff --git a/awx/ui/client/src/job-templates/edit-workflow/workflow-edit.partial.html b/awx/ui/client/src/templates/workflows/edit-workflow/workflow-edit.partial.html similarity index 100% rename from awx/ui/client/src/job-templates/edit-workflow/workflow-edit.partial.html rename to awx/ui/client/src/templates/workflows/edit-workflow/workflow-edit.partial.html diff --git a/awx/ui/client/src/job-templates/workflow-chart/main.js b/awx/ui/client/src/templates/workflows/workflow-chart/main.js similarity index 85% rename from awx/ui/client/src/job-templates/workflow-chart/main.js rename to awx/ui/client/src/templates/workflows/workflow-chart/main.js index 76f0484889..2b1851a972 100644 --- a/awx/ui/client/src/job-templates/workflow-chart/main.js +++ b/awx/ui/client/src/templates/workflows/workflow-chart/main.js @@ -7,5 +7,5 @@ import workflowChart from './workflow-chart.directive'; export default - angular.module('jobTemplatesWorkflowChart', []) + angular.module('workflowChart', []) .directive('workflowChart', workflowChart); diff --git a/awx/ui/client/src/job-templates/workflow-chart/workflow-chart.block.less b/awx/ui/client/src/templates/workflows/workflow-chart/workflow-chart.block.less similarity index 100% rename from awx/ui/client/src/job-templates/workflow-chart/workflow-chart.block.less rename to awx/ui/client/src/templates/workflows/workflow-chart/workflow-chart.block.less diff --git a/awx/ui/client/src/job-templates/workflow-chart/workflow-chart.directive.js b/awx/ui/client/src/templates/workflows/workflow-chart/workflow-chart.directive.js similarity index 100% rename from awx/ui/client/src/job-templates/workflow-chart/workflow-chart.directive.js rename to awx/ui/client/src/templates/workflows/workflow-chart/workflow-chart.directive.js diff --git a/awx/ui/client/src/job-templates/workflow-maker/main.js b/awx/ui/client/src/templates/workflows/workflow-maker/main.js similarity index 74% rename from awx/ui/client/src/job-templates/workflow-maker/main.js rename to awx/ui/client/src/templates/workflows/workflow-maker/main.js index 8266617679..821dfe18aa 100644 --- a/awx/ui/client/src/job-templates/workflow-maker/main.js +++ b/awx/ui/client/src/templates/workflows/workflow-maker/main.js @@ -1,10 +1,8 @@ -import helper from './workflow-help.service'; import workflowMaker from './workflow-maker.directive'; import WorkflowMakerController from './workflow-maker.controller'; export default - angular.module('jobTemplates.workflowMaker', []) - .service('WorkflowHelpService', helper) + angular.module('templates.workflowMaker', []) // In order to test this controller I had to expose it at the module level // like so. Is this correct? Is there a better pattern for doing this? .controller('WorkflowMakerController', WorkflowMakerController) diff --git a/awx/ui/client/src/job-templates/workflow-maker/workflow-maker.block.less b/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.block.less similarity index 100% rename from awx/ui/client/src/job-templates/workflow-maker/workflow-maker.block.less rename to awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.block.less diff --git a/awx/ui/client/src/job-templates/workflow-maker/workflow-maker.controller.js b/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.controller.js similarity index 97% rename from awx/ui/client/src/job-templates/workflow-maker/workflow-maker.controller.js rename to awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.controller.js index 01cc4441c2..2a53614137 100644 --- a/awx/ui/client/src/job-templates/workflow-maker/workflow-maker.controller.js +++ b/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.controller.js @@ -4,12 +4,12 @@ * All Rights Reserved *************************************************/ -export default ['$scope', 'WorkflowHelpService', 'generateList', 'JobTemplateList', 'ProjectList', - 'GetBasePath', 'Wait', 'JobTemplateService', '$state', +export default ['$scope', 'WorkflowHelpService', 'generateList', 'TemplateList', 'ProjectList', + 'GetBasePath', 'Wait', 'TemplatesService', '$state', 'ProcessErrors', 'InventorySourcesList', 'CreateSelect2', 'WorkflowMakerForm', 'GenerateForm', 'InventoryList', 'CredentialList', '$q', - function($scope, WorkflowHelpService, GenerateList, JobTemplateList, ProjectList, - GetBasePath, Wait, JobTemplateService, $state, + function($scope, WorkflowHelpService, GenerateList, TemplateList, ProjectList, + GetBasePath, Wait, TemplatesService, $state, ProcessErrors, InventorySourcesList, CreateSelect2, WorkflowMakerForm, GenerateForm, InventoryList, CredentialList, $q) { @@ -59,11 +59,11 @@ export default ['$scope', 'WorkflowHelpService', 'generateList', 'JobTemplateLis $scope.closeWorkflowMaker = function() { // Revert the data to the master which was created when the dialog was opened $scope.treeData.data = angular.copy($scope.treeDataMaster); - WorkflowHelpService.closeDialog(); + $scope.closeDialog(); }; $scope.saveWorkflowMaker = function() { - WorkflowHelpService.closeDialog(); + $scope.closeDialog(); }; /* ADD NODE FUNCTIONS */ @@ -348,7 +348,7 @@ export default ['$scope', 'WorkflowHelpService', 'generateList', 'JobTemplateLis // This is a node that we got back from the api with an incomplete // unified job template so we're going to pull down the whole object - JobTemplateService.getUnifiedJobTemplate($scope.nodeBeingEdited.unifiedJobTemplate.id) + TemplatesService.getUnifiedJobTemplate($scope.nodeBeingEdited.unifiedJobTemplate.id) .then(function(data) { $scope.nodeBeingEdited.unifiedJobTemplate = _.clone(data.data.results[0]); @@ -358,12 +358,12 @@ export default ['$scope', 'WorkflowHelpService', 'generateList', 'JobTemplateLis let retrievingInventory = false; if ($scope.nodeBeingEdited.unifiedJobTemplate.ask_credential_on_launch && $scope.nodeBeingEdited.originalNodeObj.credential) { - defers.push(JobTemplateService.getCredential($scope.nodeBeingEdited.originalNodeObj.credential)); + defers.push(TemplatesService.getCredential($scope.nodeBeingEdited.originalNodeObj.credential)); retrievingCredential = true; } if ($scope.nodeBeingEdited.unifiedJobTemplate.ask_inventory_on_launch && $scope.nodeBeingEdited.originalNodeObj.inventory) { - defers.push(JobTemplateService.getInventory($scope.nodeBeingEdited.originalNodeObj.inventory)); + defers.push(TemplatesService.getInventory($scope.nodeBeingEdited.originalNodeObj.inventory)); retrievingInventory = true; } diff --git a/awx/ui/client/src/job-templates/workflow-maker/workflow-maker.directive.js b/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.directive.js similarity index 86% rename from awx/ui/client/src/job-templates/workflow-maker/workflow-maker.directive.js rename to awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.directive.js index 95da492a14..3e001d2817 100644 --- a/awx/ui/client/src/job-templates/workflow-maker/workflow-maker.directive.js +++ b/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.directive.js @@ -6,8 +6,8 @@ import workflowMakerController from './workflow-maker.controller'; -export default ['templateUrl', 'CreateDialog', 'Wait', - function(templateUrl, CreateDialog, Wait) { +export default ['templateUrl', 'CreateDialog', 'Wait', '$state', + function(templateUrl, CreateDialog, Wait, $state) { return { scope: { treeData: '=', @@ -49,6 +49,12 @@ export default ['templateUrl', 'CreateDialog', 'Wait', scope.$broadcast("refreshWorkflowChart"); }); + + scope.closeDialog = function() { + $('#workflow-modal-dialog').dialog('destroy'); + + $state.go('^'); + }; } }; } diff --git a/awx/ui/client/src/job-templates/workflow-maker/workflow-maker.partial.html b/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.partial.html similarity index 100% rename from awx/ui/client/src/job-templates/workflow-maker/workflow-maker.partial.html rename to awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.partial.html diff --git a/awx/ui/client/src/job-templates/workflow-maker/workflow-help.service.js b/awx/ui/client/src/templates/workflows/workflow.service.js similarity index 94% rename from awx/ui/client/src/job-templates/workflow-maker/workflow-help.service.js rename to awx/ui/client/src/templates/workflows/workflow.service.js index 25b889e4fd..65d0807424 100644 --- a/awx/ui/client/src/job-templates/workflow-maker/workflow-help.service.js +++ b/awx/ui/client/src/templates/workflows/workflow.service.js @@ -1,10 +1,5 @@ -export default ['CreateDialog', 'Wait', '$q', '$state', function(CreateDialog, Wait, $q, $state){ +export default [function(){ return { - closeDialog: function() { - $('#workflow-modal-dialog').dialog('destroy'); - - $state.go('^'); - }, searchTree: function(params) { // params.element // params.matchingId diff --git a/awx/ui/client/src/workflow-results/workflow-results.controller.js b/awx/ui/client/src/workflow-results/workflow-results.controller.js index d3f6eb4da9..212907e936 100644 --- a/awx/ui/client/src/workflow-results/workflow-results.controller.js +++ b/awx/ui/client/src/workflow-results/workflow-results.controller.js @@ -92,6 +92,136 @@ export default ['workflowData', $scope.stdoutArr = []; + $scope.treeData = { + data: { + id: 1, + canDelete: false, + canEdit: false, + canAddTo: true, + isStartNode: true, + unifiedJobTemplate: { + name: "Workflow Launch" + }, + children: [], + deletedNodes: [], + totalNodes: 0 + }, + nextIndex: 2 + }; + + function buildBranch(params) { + // params.nodeId + // params.parentId + // params.edgeType + // params.nodesObj + // params.isRoot + + let treeNode = { + children: [], + c: "#D7D7D7", + id: $scope.treeData.nextIndex, + nodeId: params.nodeId, + canDelete: true, + canEdit: true, + canAddTo: true, + placeholder: false, + edgeType: params.edgeType, + unifiedJobTemplate: _.clone(params.nodesObj[params.nodeId].summary_fields.unified_job_template), + isNew: false, + edited: false, + originalEdge: params.edgeType, + originalNodeObj: _.clone(params.nodesObj[params.nodeId]), + promptValues: {}, + isRoot: params.isRoot ? params.isRoot : false + }; + + $scope.treeData.data.totalNodes++; + + $scope.treeData.nextIndex++; + + if(params.parentId) { + treeNode.originalParentId = params.parentId; + } + + // Loop across the success nodes and add them recursively + _.forEach(params.nodesObj[params.nodeId].success_nodes, function(successNodeId) { + treeNode.children.push(buildBranch({ + nodeId: successNodeId, + parentId: params.nodeId, + edgeType: "success", + nodesObj: params.nodesObj + })); + }); + + // failure nodes + _.forEach(params.nodesObj[params.nodeId].failure_nodes, function(failureNodesId) { + treeNode.children.push(buildBranch({ + nodeId: failureNodesId, + parentId: params.nodeId, + edgeType: "failure", + nodesObj: params.nodesObj + })); + }); + + // always nodes + _.forEach(params.nodesObj[params.nodeId].always_nodes, function(alwaysNodesId) { + treeNode.children.push(buildBranch({ + nodeId: alwaysNodesId, + parentId: params.nodeId, + edgeType: "always", + nodesObj: params.nodesObj + })); + }); + + return treeNode; + } + + + let nodesArray = $scope.workflow_nodes; + let nodesObj = {}; + let nonRootNodeIds = []; + let allNodeIds = []; + + // Determine which nodes are root nodes + _.forEach(nodesArray, function(node) { + nodesObj[node.id] = _.clone(node); + + allNodeIds.push(node.id); + + _.forEach(node.success_nodes, function(nodeId){ + nonRootNodeIds.push(nodeId); + }); + _.forEach(node.failure_nodes, function(nodeId){ + nonRootNodeIds.push(nodeId); + }); + _.forEach(node.always_nodes, function(nodeId){ + nonRootNodeIds.push(nodeId); + }); + }); + + let rootNodes = _.difference(allNodeIds, nonRootNodeIds); + + // Loop across the root nodes and re-build the tree + _.forEach(rootNodes, function(rootNodeId) { + let branch = buildBranch({ + nodeId: rootNodeId, + edgeType: "always", + nodesObj: nodesObj, + isRoot: true + }); + + $scope.treeData.data.children.push(branch); + }); + + // TODO: I think that the workflow chart directive (and eventually d3) is meddling with + // this treeData object and removing the children object for some reason (?) + // This happens on occasion and I think is a race condition (?) + if(!$scope.treeData.data.children) { + $scope.treeData.data.children = []; + } + + $scope.canAddWorkflowJobTemplate = false; + // EVENT STUFF BELOW // just putting the event queue on scope so it can be inspected in the diff --git a/awx/ui/client/src/workflow-results/workflow-results.partial.html b/awx/ui/client/src/workflow-results/workflow-results.partial.html index 9612719221..616b035d02 100644 --- a/awx/ui/client/src/workflow-results/workflow-results.partial.html +++ b/awx/ui/client/src/workflow-results/workflow-results.partial.html @@ -228,7 +228,7 @@ - + diff --git a/awx/ui/tests/spec/job-templates/job-templates-list.controller-test.js b/awx/ui/tests/spec/templates/templates-list.controller-test.js similarity index 87% rename from awx/ui/tests/spec/job-templates/job-templates-list.controller-test.js rename to awx/ui/tests/spec/templates/templates-list.controller-test.js index 5d542622cd..837b42ff12 100644 --- a/awx/ui/tests/spec/job-templates/job-templates-list.controller-test.js +++ b/awx/ui/tests/spec/templates/templates-list.controller-test.js @@ -1,11 +1,11 @@ 'use strict'; -describe('Controller: JobTemplatesList', () => { +describe('Controller: TemplatesList', () => { // Setup let scope, rootScope, state, - JobTemplatesListController, + TemplatesListController, ClearScope, GetChoices, Alert, @@ -14,13 +14,13 @@ describe('Controller: JobTemplatesList', () => { rbacUiControlService, canAddDeferred, q, - JobTemplateService, + TemplatesService, deleteWorkflowJobTemplateDeferred, deleteJobTemplateDeferred, Dataset; beforeEach(angular.mock.module('Tower')); - beforeEach(angular.mock.module('jobTemplates', ($provide) => { + beforeEach(angular.mock.module('templates', ($provide) => { state = jasmine.createSpyObj('state', [ '$get', @@ -38,7 +38,7 @@ describe('Controller: JobTemplatesList', () => { } }; - JobTemplateService = { + TemplatesService = { deleteWorkflowJobTemplate: function(){ return angular.noop; }, @@ -85,10 +85,10 @@ describe('Controller: JobTemplatesList', () => { rbacUiControlService.canAdd = jasmine.createSpy('canAdd').and.returnValue(canAddDeferred.promise); - JobTemplateService.deleteWorkflowJobTemplate = jasmine.createSpy('deleteWorkflowJobTemplate').and.returnValue(deleteWorkflowJobTemplateDeferred.promise); - JobTemplateService.deleteJobTemplate = jasmine.createSpy('deleteJobTemplate').and.returnValue(deleteJobTemplateDeferred.promise); + TemplatesService.deleteWorkflowJobTemplate = jasmine.createSpy('deleteWorkflowJobTemplate').and.returnValue(deleteWorkflowJobTemplateDeferred.promise); + TemplatesService.deleteJobTemplate = jasmine.createSpy('deleteJobTemplate').and.returnValue(deleteJobTemplateDeferred.promise); - JobTemplatesListController = $controller('JobTemplatesListController', { + TemplatesListController = $controller('TemplatesListController', { $scope: scope, $rootScope: rootScope, $state: state, @@ -98,7 +98,7 @@ describe('Controller: JobTemplatesList', () => { Prompt: Prompt, InitiatePlaybookRun: InitiatePlaybookRun, rbacUiControlService: rbacUiControlService, - JobTemplateService: JobTemplateService, + TemplatesService: TemplatesService, Dataset: Dataset }); })); @@ -163,7 +163,7 @@ describe('Controller: JobTemplatesList', () => { expect(Prompt).toHaveBeenCalled(); }); - it('should call JobTemplateService.deleteWorkflowJobTemplate when the user takes affirmative action on the delete modal and type = "Workflow Job Template"', ()=>{ + it('should call TemplatesService.deleteWorkflowJobTemplate when the user takes affirmative action on the delete modal and type = "Workflow Job Template"', ()=>{ // Note that Prompt has been mocked up above to immediately call the callback function that gets passed in // which is how we access the private function in the controller @@ -174,10 +174,10 @@ describe('Controller: JobTemplatesList', () => { }; scope.deleteJobTemplate(testTemplate); - expect(JobTemplateService.deleteWorkflowJobTemplate).toHaveBeenCalled(); + expect(TemplatesService.deleteWorkflowJobTemplate).toHaveBeenCalled(); }); - it('should call JobTemplateService.deleteJobTemplate when the user takes affirmative action on the delete modal and type = "Workflow Job Template"', ()=>{ + it('should call TemplatesService.deleteJobTemplate when the user takes affirmative action on the delete modal and type = "Workflow Job Template"', ()=>{ // Note that Prompt has been mocked up above to immediately call the callback function that gets passed in // which is how we access the private function in the controller @@ -188,7 +188,7 @@ describe('Controller: JobTemplatesList', () => { }; scope.deleteJobTemplate(testTemplate); - expect(JobTemplateService.deleteJobTemplate).toHaveBeenCalled(); + expect(TemplatesService.deleteJobTemplate).toHaveBeenCalled(); }); }); diff --git a/awx/ui/tests/spec/workflows/workflow-add.controller-test.js b/awx/ui/tests/spec/workflows/workflow-add.controller-test.js index a631ac66ff..35f85ad80b 100644 --- a/awx/ui/tests/spec/workflows/workflow-add.controller-test.js +++ b/awx/ui/tests/spec/workflows/workflow-add.controller-test.js @@ -8,7 +8,7 @@ describe('Controller: WorkflowAdd', () => { ClearScope, Alert, GenerateForm, - JobTemplateService, + TemplatesService, q, getLabelsDeferred, createWorkflowJobTemplateDeferred, @@ -20,7 +20,7 @@ describe('Controller: WorkflowAdd', () => { ToJSON; beforeEach(angular.mock.module('Tower')); - beforeEach(angular.mock.module('jobTemplates', ($provide) => { + beforeEach(angular.mock.module('templates', ($provide) => { state = jasmine.createSpyObj('state', [ '$get', @@ -35,7 +35,7 @@ describe('Controller: WorkflowAdd', () => { 'applyDefaults' ]); - JobTemplateService = { + TemplatesService = { getLabelOptions: function(){ return angular.noop; }, @@ -79,8 +79,8 @@ describe('Controller: WorkflowAdd', () => { ParseTypeChange = _ParseTypeChange_; ToJSON = _ToJSON_; - JobTemplateService.getLabelOptions = jasmine.createSpy('getLabelOptions').and.returnValue(getLabelsDeferred.promise); - JobTemplateService.createWorkflowJobTemplate = jasmine.createSpy('createWorkflowJobTemplate').and.returnValue(createWorkflowJobTemplateDeferred.promise); + TemplatesService.getLabelOptions = jasmine.createSpy('getLabelOptions').and.returnValue(getLabelsDeferred.promise); + TemplatesService.createWorkflowJobTemplate = jasmine.createSpy('createWorkflowJobTemplate').and.returnValue(createWorkflowJobTemplateDeferred.promise); WorkflowAdd = $controller('WorkflowAdd', { $scope: scope, @@ -88,7 +88,7 @@ describe('Controller: WorkflowAdd', () => { ClearScope: ClearScope, Alert: Alert, GenerateForm: GenerateForm, - JobTemplateService: JobTemplateService, + TemplatesService: TemplatesService, ProcessErrors: ProcessErrors, CreateSelect2: CreateSelect2, Wait: Wait, @@ -102,7 +102,7 @@ describe('Controller: WorkflowAdd', () => { }); it('should get/set the label options and select2-ify the input', ()=>{ - // Resolve JobTemplateService.getLabelsForJobTemplate + // Resolve TemplatesService.getLabelsForJobTemplate getLabelsDeferred.resolve({ foo: "bar" }); @@ -120,7 +120,7 @@ describe('Controller: WorkflowAdd', () => { }); it('should call ProcessErrors when getLabelsForJobTemplate returns a rejected promise', ()=>{ - // Reject JobTemplateService.getLabelsForJobTemplate + // Reject TemplatesService.getLabelsForJobTemplate getLabelsDeferred.reject({ data: "mockedData", status: 400 @@ -133,11 +133,11 @@ describe('Controller: WorkflowAdd', () => { describe('scope.formSave()', () => { - it('should call JobTemplateService.createWorkflowJobTemplate', ()=>{ + it('should call TemplatesService.createWorkflowJobTemplate', ()=>{ scope.name = "Test Workflow"; scope.description = "This is a test description"; scope.formSave(); - expect(JobTemplateService.createWorkflowJobTemplate).toHaveBeenCalledWith({ + expect(TemplatesService.createWorkflowJobTemplate).toHaveBeenCalledWith({ name: "Test Workflow", description: "This is a test description", labels: undefined, diff --git a/awx/ui/tests/spec/workflows/workflow-maker.controller-test.js b/awx/ui/tests/spec/workflows/workflow-maker.controller-test.js index 0486356249..12bbf8ef74 100644 --- a/awx/ui/tests/spec/workflows/workflow-maker.controller-test.js +++ b/awx/ui/tests/spec/workflows/workflow-maker.controller-test.js @@ -7,7 +7,7 @@ describe('Controller: WorkflowMaker', () => { WorkflowHelpService; beforeEach(angular.mock.module('Tower')); - beforeEach(angular.mock.module('jobTemplates', ($provide) => { + beforeEach(angular.mock.module('templates', ($provide) => { WorkflowHelpService = jasmine.createSpyObj('WorkflowHelpService', [ 'closeDialog', @@ -21,6 +21,7 @@ describe('Controller: WorkflowMaker', () => { beforeEach(angular.mock.inject( ($rootScope, $controller, _WorkflowHelpService_) => { scope = $rootScope.$new(); + scope.closeDialog = jasmine.createSpy(); scope.treeData = { data: { id: 1, @@ -50,9 +51,9 @@ describe('Controller: WorkflowMaker', () => { it('should close the dialog', ()=>{ scope.saveWorkflowMaker(); - expect(WorkflowHelpService.closeDialog).toHaveBeenCalled(); + expect(scope.closeDialog).toHaveBeenCalled(); }); }); - + }); From 17b4b1e7a2b0b23aef2b75b359a2576911ac9384 Mon Sep 17 00:00:00 2001 From: Michael Abashian Date: Tue, 15 Nov 2016 09:51:51 -0500 Subject: [PATCH 2/2] Moved a significant amount of the tree generation logic out to the workflow service --- .../templates/labels/labelsList.directive.js | 2 +- awx/ui/client/src/templates/main.js | 2 +- .../edit-workflow/workflow-edit.controller.js | 126 +---- .../workflow-maker.controller.js | 16 +- .../workflow-maker.directive.js | 2 +- .../templates/workflows/workflow.service.js | 133 +++++ .../workflow-results.controller.js | 475 +++++++----------- 7 files changed, 333 insertions(+), 423 deletions(-) diff --git a/awx/ui/client/src/templates/labels/labelsList.directive.js b/awx/ui/client/src/templates/labels/labelsList.directive.js index c1e4669bb0..54c49ef47c 100644 --- a/awx/ui/client/src/templates/labels/labelsList.directive.js +++ b/awx/ui/client/src/templates/labels/labelsList.directive.js @@ -12,7 +12,7 @@ export default return { restrict: 'E', scope: false, - templateUrl: templateUrl('job-templates/labels/labelsList'), + templateUrl: templateUrl('templates/labels/labelsList'), link: function(scope, element, attrs) { scope.showDelete = attrs.showDelete === 'true'; scope.seeMoreInactive = true; diff --git a/awx/ui/client/src/templates/main.js b/awx/ui/client/src/templates/main.js index 06ad97905f..5e2591b3a2 100644 --- a/awx/ui/client/src/templates/main.js +++ b/awx/ui/client/src/templates/main.js @@ -24,7 +24,7 @@ angular.module('templates', [surveyMaker.name, templatesList.name, jobTemplatesA workflowChart.name, workflowMaker.name ]) .service('TemplatesService', templatesService) - .service('WorkflowHelpService', workflowService) + .service('WorkflowService', workflowService) .config(['$stateProvider', 'stateDefinitionsProvider', '$stateExtenderProvider', function($stateProvider, stateDefinitionsProvider, $stateExtenderProvider) { let stateTree, addJobTemplate, editJobTemplate, addWorkflow, editWorkflow, diff --git a/awx/ui/client/src/templates/workflows/edit-workflow/workflow-edit.controller.js b/awx/ui/client/src/templates/workflows/edit-workflow/workflow-edit.controller.js index c4cf1c13e3..b719614929 100644 --- a/awx/ui/client/src/templates/workflows/edit-workflow/workflow-edit.controller.js +++ b/awx/ui/client/src/templates/workflows/edit-workflow/workflow-edit.controller.js @@ -8,13 +8,13 @@ [ '$scope', '$stateParams', 'WorkflowForm', 'GenerateForm', 'Alert', 'ProcessErrors', 'ClearScope', 'GetBasePath', '$q', 'ParseTypeChange', 'Wait', 'Empty', 'ToJSON', 'initSurvey', '$state', 'CreateSelect2', 'ParseVariableString', - 'TemplatesService', 'OrganizationList', 'Rest', + 'TemplatesService', 'OrganizationList', 'Rest', 'WorkflowService', function( $scope, $stateParams, WorkflowForm, GenerateForm, Alert, ProcessErrors, ClearScope, GetBasePath, $q, ParseTypeChange, Wait, Empty, ToJSON, SurveyControllerInit, $state, CreateSelect2, ParseVariableString, - TemplatesService, OrganizationList, Rest - ) {window.state = $state; + TemplatesService, OrganizationList, Rest, WorkflowService + ) { ClearScope(); @@ -40,90 +40,6 @@ $scope.associateRequests = []; $scope.disassociateRequests = []; - $scope.workflowTree = { - data: { - id: 1, - canDelete: false, - canEdit: false, - canAddTo: true, - isStartNode: true, - unifiedJobTemplate: { - name: "Workflow Launch" - }, - children: [], - deletedNodes: [], - totalNodes: 0 - }, - nextIndex: 2 - }; - - function buildBranch(params) { - // params.nodeId - // params.parentId - // params.edgeType - // params.nodesObj - // params.isRoot - - let treeNode = { - children: [], - c: "#D7D7D7", - id: $scope.workflowTree.nextIndex, - nodeId: params.nodeId, - canDelete: true, - canEdit: true, - canAddTo: true, - placeholder: false, - edgeType: params.edgeType, - unifiedJobTemplate: _.clone(params.nodesObj[params.nodeId].summary_fields.unified_job_template), - isNew: false, - edited: false, - originalEdge: params.edgeType, - originalNodeObj: _.clone(params.nodesObj[params.nodeId]), - promptValues: {}, - isRoot: params.isRoot ? params.isRoot : false - }; - - $scope.workflowTree.data.totalNodes++; - - $scope.workflowTree.nextIndex++; - - if(params.parentId) { - treeNode.originalParentId = params.parentId; - } - - // Loop across the success nodes and add them recursively - _.forEach(params.nodesObj[params.nodeId].success_nodes, function(successNodeId) { - treeNode.children.push(buildBranch({ - nodeId: successNodeId, - parentId: params.nodeId, - edgeType: "success", - nodesObj: params.nodesObj - })); - }); - - // failure nodes - _.forEach(params.nodesObj[params.nodeId].failure_nodes, function(failureNodesId) { - treeNode.children.push(buildBranch({ - nodeId: failureNodesId, - parentId: params.nodeId, - edgeType: "failure", - nodesObj: params.nodesObj - })); - }); - - // always nodes - _.forEach(params.nodesObj[params.nodeId].always_nodes, function(alwaysNodesId) { - treeNode.children.push(buildBranch({ - nodeId: alwaysNodesId, - parentId: params.nodeId, - edgeType: "always", - nodesObj: params.nodesObj - })); - }); - - return treeNode; - } - function init() { // Select2-ify the lables input @@ -195,40 +111,8 @@ TemplatesService.getWorkflowJobTemplateNodes(id) .then(function(data){ - let nodesArray = data.data.results; - let nodesObj = {}; - let nonRootNodeIds = []; - let allNodeIds = []; - - // Determine which nodes are root nodes - _.forEach(nodesArray, function(node) { - nodesObj[node.id] = _.clone(node); - - allNodeIds.push(node.id); - - _.forEach(node.success_nodes, function(nodeId){ - nonRootNodeIds.push(nodeId); - }); - _.forEach(node.failure_nodes, function(nodeId){ - nonRootNodeIds.push(nodeId); - }); - _.forEach(node.always_nodes, function(nodeId){ - nonRootNodeIds.push(nodeId); - }); - }); - - let rootNodes = _.difference(allNodeIds, nonRootNodeIds); - - // Loop across the root nodes and re-build the tree - _.forEach(rootNodes, function(rootNodeId) { - let branch = buildBranch({ - nodeId: rootNodeId, - edgeType: "always", - nodesObj: nodesObj, - isRoot: true - }); - - $scope.workflowTree.data.children.push(branch); + $scope.workflowTree = WorkflowService.buildTree({ + workflowNodes: data.data.results }); // TODO: I think that the workflow chart directive (and eventually d3) is meddling with diff --git a/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.controller.js b/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.controller.js index 2a53614137..7c7564ef40 100644 --- a/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.controller.js +++ b/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.controller.js @@ -4,11 +4,11 @@ * All Rights Reserved *************************************************/ -export default ['$scope', 'WorkflowHelpService', 'generateList', 'TemplateList', 'ProjectList', +export default ['$scope', 'WorkflowService', 'generateList', 'TemplateList', 'ProjectList', 'GetBasePath', 'Wait', 'TemplatesService', '$state', 'ProcessErrors', 'InventorySourcesList', 'CreateSelect2', 'WorkflowMakerForm', 'GenerateForm', 'InventoryList', 'CredentialList', '$q', - function($scope, WorkflowHelpService, GenerateList, TemplateList, ProjectList, + function($scope, WorkflowService, GenerateList, TemplateList, ProjectList, GetBasePath, Wait, TemplatesService, $state, ProcessErrors, InventorySourcesList, CreateSelect2, WorkflowMakerForm, GenerateForm, InventoryList, CredentialList, $q) { @@ -78,7 +78,7 @@ export default ['$scope', 'WorkflowHelpService', 'generateList', 'TemplateList', $scope.addParent = parent; $scope.betweenTwoNodes = betweenTwoNodes; - $scope.placeholderNode = WorkflowHelpService.addPlaceholderNode({ + $scope.placeholderNode = WorkflowService.addPlaceholderNode({ parent: parent, betweenTwoNodes: betweenTwoNodes, tree: $scope.treeData.data, @@ -87,7 +87,7 @@ export default ['$scope', 'WorkflowHelpService', 'generateList', 'TemplateList', $scope.treeData.nextIndex++; - let siblingConnectionTypes = WorkflowHelpService.getSiblingConnectionTypes({ + let siblingConnectionTypes = WorkflowService.getSiblingConnectionTypes({ tree: $scope.treeData.data, parentId: betweenTwoNodes ? parent.source.id : parent.id }); @@ -187,7 +187,7 @@ export default ['$scope', 'WorkflowHelpService', 'generateList', 'TemplateList', $scope.cancelNodeForm = function() { if ($scope.workflowMakerFormConfig.nodeMode === "add") { // Remove the placeholder node from the tree - WorkflowHelpService.removeNodeFromTree({ + WorkflowService.removeNodeFromTree({ tree: $scope.treeData.data, nodeToBeDeleted: $scope.placeholderNode }); @@ -212,12 +212,12 @@ export default ['$scope', 'WorkflowHelpService', 'generateList', 'TemplateList', $scope.workflowMakerFormConfig.nodeMode = "edit"; - let parent = WorkflowHelpService.searchTree({ + let parent = WorkflowService.searchTree({ element: $scope.treeData.data, matchingId: nodeToEdit.parent.id }); - $scope.nodeBeingEdited = WorkflowHelpService.searchTree({ + $scope.nodeBeingEdited = WorkflowService.searchTree({ element: parent, matchingId: nodeToEdit.id }); @@ -427,7 +427,7 @@ export default ['$scope', 'WorkflowHelpService', 'generateList', 'TemplateList', // TODO: turn this into a promise so that we can handle errors - WorkflowHelpService.removeNodeFromTree({ + WorkflowService.removeNodeFromTree({ tree: $scope.treeData.data, nodeToBeDeleted: $scope.nodeToBeDeleted }); diff --git a/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.directive.js b/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.directive.js index 3e001d2817..cccc4f638e 100644 --- a/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.directive.js +++ b/awx/ui/client/src/templates/workflows/workflow-maker/workflow-maker.directive.js @@ -14,7 +14,7 @@ export default ['templateUrl', 'CreateDialog', 'Wait', '$state', canAddWorkflowJobTemplate: '=' }, restrict: 'E', - templateUrl: templateUrl('job-templates/workflow-maker/workflow-maker'), + templateUrl: templateUrl('templates/workflows/workflow-maker/workflow-maker'), controller: workflowMakerController, link: function(scope) { CreateDialog({ diff --git a/awx/ui/client/src/templates/workflows/workflow.service.js b/awx/ui/client/src/templates/workflows/workflow.service.js index 65d0807424..1d2a102b1a 100644 --- a/awx/ui/client/src/templates/workflows/workflow.service.js +++ b/awx/ui/client/src/templates/workflows/workflow.service.js @@ -117,6 +117,139 @@ export default [function(){ } return Object.keys(siblingConnectionTypes); + }, + buildTree: function(params) { + //params.workflowNodes + + let _this = this; + + let treeData = { + data: { + id: 1, + canDelete: false, + canEdit: false, + canAddTo: true, + isStartNode: true, + unifiedJobTemplate: { + name: "Workflow Launch" + }, + children: [], + deletedNodes: [], + totalNodes: 0 + }, + nextIndex: 2 + }; + + let nodesArray = params.workflowNodes; + let nodesObj = {}; + let nonRootNodeIds = []; + let allNodeIds = []; + + // Determine which nodes are root nodes + _.forEach(nodesArray, function(node) { + nodesObj[node.id] = _.clone(node); + + allNodeIds.push(node.id); + + _.forEach(node.success_nodes, function(nodeId){ + nonRootNodeIds.push(nodeId); + }); + _.forEach(node.failure_nodes, function(nodeId){ + nonRootNodeIds.push(nodeId); + }); + _.forEach(node.always_nodes, function(nodeId){ + nonRootNodeIds.push(nodeId); + }); + }); + + let rootNodes = _.difference(allNodeIds, nonRootNodeIds); + + // Loop across the root nodes and re-build the tree + _.forEach(rootNodes, function(rootNodeId) { + let branch = _this.buildBranch({ + nodeId: rootNodeId, + edgeType: "always", + nodesObj: nodesObj, + isRoot: true, + treeData: treeData + }); + + treeData.data.children.push(branch); + }); + + return treeData; + }, + buildBranch: function(params) { + // params.nodeId + // params.parentId + // params.edgeType + // params.nodesObj + // params.isRoot + // params.treeData + + let _this = this; + + let treeNode = { + children: [], + c: "#D7D7D7", + id: params.treeData.nextIndex, + nodeId: params.nodeId, + canDelete: true, + canEdit: true, + canAddTo: true, + placeholder: false, + edgeType: params.edgeType, + unifiedJobTemplate: _.clone(params.nodesObj[params.nodeId].summary_fields.unified_job_template), + isNew: false, + edited: false, + originalEdge: params.edgeType, + originalNodeObj: _.clone(params.nodesObj[params.nodeId]), + promptValues: {}, + isRoot: params.isRoot ? params.isRoot : false + }; + + params.treeData.data.totalNodes++; + + params.treeData.nextIndex++; + + if(params.parentId) { + treeNode.originalParentId = params.parentId; + } + + // Loop across the success nodes and add them recursively + _.forEach(params.nodesObj[params.nodeId].success_nodes, function(successNodeId) { + treeNode.children.push(_this.buildBranch({ + nodeId: successNodeId, + parentId: params.nodeId, + edgeType: "success", + nodesObj: params.nodesObj, + treeData: params.treeData + })); + }); + + // failure nodes + _.forEach(params.nodesObj[params.nodeId].failure_nodes, function(failureNodesId) { + treeNode.children.push(_this.buildBranch({ + nodeId: failureNodesId, + parentId: params.nodeId, + edgeType: "failure", + nodesObj: params.nodesObj, + treeData: params.treeData + })); + }); + + // always nodes + _.forEach(params.nodesObj[params.nodeId].always_nodes, function(alwaysNodesId) { + treeNode.children.push(_this.buildBranch({ + nodeId: alwaysNodesId, + parentId: params.nodeId, + edgeType: "always", + nodesObj: params.nodesObj, + treeData: params.treeData + })); + }); + + return treeNode; } }; }]; diff --git a/awx/ui/client/src/workflow-results/workflow-results.controller.js b/awx/ui/client/src/workflow-results/workflow-results.controller.js index 212907e936..164ef5d35b 100644 --- a/awx/ui/client/src/workflow-results/workflow-results.controller.js +++ b/awx/ui/client/src/workflow-results/workflow-results.controller.js @@ -6,6 +6,7 @@ export default ['workflowData', '$scope', 'ParseTypeChange', 'ParseVariableString', + 'WorkflowService', function(workflowData, workflowResultsService, workflowDataOptions, @@ -13,306 +14,198 @@ export default ['workflowData', workflowNodes, $scope, ParseTypeChange, - ParseVariableString + ParseVariableString, + WorkflowService ) { - var getTowerLinks = function() { - var getTowerLink = function(key) { - if ($scope.workflow.related[key]) { - return '/#/' + $scope.workflow.related[key] - .split('api/v1/')[1]; - } - else { - return null; - } + + var getTowerLinks = function() { + var getTowerLink = function(key) { + if ($scope.workflow.related[key]) { + return '/#/' + $scope.workflow.related[key] + .split('api/v1/')[1]; + } + else { + return null; + } + }; + + $scope.workflow_template_link = '/#/templates/workflow_job_template/'+$scope.workflow.workflow_job_template; + $scope.created_by_link = getTowerLink('created_by'); + $scope.cloud_credential_link = getTowerLink('cloud_credential'); + $scope.network_credential_link = getTowerLink('network_credential'); }; - $scope.workflow_template_link = '/#/templates/workflow_job_template/'+$scope.workflow.workflow_job_template; - $scope.created_by_link = getTowerLink('created_by'); - $scope.cloud_credential_link = getTowerLink('cloud_credential'); - $scope.network_credential_link = getTowerLink('network_credential'); - }; + var getTowerLabels = function() { + var getTowerLabel = function(key) { + if ($scope.workflowOptions && $scope.workflowOptions[key]) { + return $scope.workflowOptions[key].choices + .filter(val => val[0] === $scope.workflow[key]) + .map(val => val[1])[0]; + } else { + return null; + } + }; - var getTowerLabels = function() { - var getTowerLabel = function(key) { - if ($scope.workflowOptions && $scope.workflowOptions[key]) { - return $scope.workflowOptions[key].choices - .filter(val => val[0] === $scope.workflow[key]) - .map(val => val[1])[0]; - } else { - return null; + $scope.status_label = getTowerLabel('status'); + $scope.type_label = getTowerLabel('job_type'); + $scope.verbosity_label = getTowerLabel('verbosity'); + }; + + function init() { + // put initially resolved request data on scope + $scope.workflow = workflowData; + $scope.workflow_nodes = workflowNodes; + $scope.workflowOptions = workflowDataOptions.actions.GET; + $scope.labels = jobLabels; + + // turn related api browser routes into tower routes + getTowerLinks(); + + // use options labels to manipulate display of details + getTowerLabels(); + + // set up a read only code mirror for extra vars + $scope.variables = ParseVariableString($scope.workflow.extra_vars); + $scope.parseType = 'yaml'; + ParseTypeChange({ scope: $scope, + field_id: 'pre-formatted-variables', + readOnly: true }); + + // Click binding for the expand/collapse button on the standard out log + $scope.stdoutFullScreen = false; + + $scope.stdoutArr = []; + + $scope.treeData = WorkflowService.buildTree({ + workflowNodes: workflowNodes + }); + + // TODO: I think that the workflow chart directive (and eventually d3) is meddling with + // this treeData object and removing the children object for some reason (?) + // This happens on occasion and I think is a race condition (?) + if(!$scope.treeData.data.children) { + $scope.treeData.data.children = []; } - }; - $scope.status_label = getTowerLabel('status'); - $scope.type_label = getTowerLabel('job_type'); - $scope.verbosity_label = getTowerLabel('verbosity'); - }; + $scope.canAddWorkflowJobTemplate = false; - // var getTotalHostCount = function(count) { - // return Object - // .keys(count).reduce((acc, i) => acc += count[i], 0); - // }; - - // put initially resolved request data on scope - $scope.workflow = workflowData; - $scope.workflow_nodes = workflowNodes; - $scope.workflowOptions = workflowDataOptions.actions.GET; - $scope.labels = jobLabels; - - // turn related api browser routes into tower routes - getTowerLinks(); - - // use options labels to manipulate display of details - getTowerLabels(); - - // set up a read only code mirror for extra vars - $scope.variables = ParseVariableString($scope.workflow.extra_vars); - $scope.parseType = 'yaml'; - ParseTypeChange({ scope: $scope, - field_id: 'pre-formatted-variables', - readOnly: true }); - - // Click binding for the expand/collapse button on the standard out log - $scope.stdoutFullScreen = false; - $scope.toggleStdoutFullscreen = function() { - $scope.stdoutFullScreen = !$scope.stdoutFullScreen; - }; - - $scope.deleteJob = function() { - workflowResultsService.deleteJob($scope.workflow); - }; - - $scope.cancelJob = function() { - workflowResultsService.cancelJob($scope.workflow); - }; - - $scope.relaunchJob = function() { - workflowResultsService.relaunchJob($scope); - }; - - $scope.stdoutArr = []; - - $scope.treeData = { - data: { - id: 1, - canDelete: false, - canEdit: false, - canAddTo: true, - isStartNode: true, - unifiedJobTemplate: { - name: "Workflow Launch" - }, - children: [], - deletedNodes: [], - totalNodes: 0 - }, - nextIndex: 2 - }; - - function buildBranch(params) { - // params.nodeId - // params.parentId - // params.edgeType - // params.nodesObj - // params.isRoot - - let treeNode = { - children: [], - c: "#D7D7D7", - id: $scope.treeData.nextIndex, - nodeId: params.nodeId, - canDelete: true, - canEdit: true, - canAddTo: true, - placeholder: false, - edgeType: params.edgeType, - unifiedJobTemplate: _.clone(params.nodesObj[params.nodeId].summary_fields.unified_job_template), - isNew: false, - edited: false, - originalEdge: params.edgeType, - originalNodeObj: _.clone(params.nodesObj[params.nodeId]), - promptValues: {}, - isRoot: params.isRoot ? params.isRoot : false - }; - - $scope.treeData.data.totalNodes++; - - $scope.treeData.nextIndex++; - - if(params.parentId) { - treeNode.originalParentId = params.parentId; } - // Loop across the success nodes and add them recursively - _.forEach(params.nodesObj[params.nodeId].success_nodes, function(successNodeId) { - treeNode.children.push(buildBranch({ - nodeId: successNodeId, - parentId: params.nodeId, - edgeType: "success", - nodesObj: params.nodesObj - })); + // var getTotalHostCount = function(count) { + // return Object + // .keys(count).reduce((acc, i) => acc += count[i], 0); + // }; + + + $scope.toggleStdoutFullscreen = function() { + $scope.stdoutFullScreen = !$scope.stdoutFullScreen; + }; + + $scope.deleteJob = function() { + workflowResultsService.deleteJob($scope.workflow); + }; + + $scope.cancelJob = function() { + workflowResultsService.cancelJob($scope.workflow); + }; + + $scope.relaunchJob = function() { + workflowResultsService.relaunchJob($scope); + }; + + // EVENT STUFF BELOW + + // just putting the event queue on scope so it can be inspected in the + // console + // $scope.event_queue = eventQueue.queue; + // $scope.defersArr = eventQueue.populateDefers; + + // This is where the async updates to the UI actually happen. + // Flow is event queue munging in the service -> $scope setting in here + // var processEvent = function(event) { + // // put the event in the queue + // eventQueue.populate(event).then(mungedEvent => { + // // make changes to ui based on the event returned from the queue + // if (mungedEvent.changes) { + // mungedEvent.changes.forEach(change => { + // // we've got a change we need to make to the UI! + // // update the necessary scope and make the change + // if (change === 'startTime' && !$scope.workflow.start) { + // $scope.workflow.start = mungedEvent.startTime; + // } + // + // if (change === 'count' && !$scope.countFinished) { + // // for all events that affect the host count, + // // update the status bar as well as the host + // // count badge + // $scope.count = mungedEvent.count; + // $scope.hostCount = getTotalHostCount(mungedEvent + // .count); + // } + // + // if (change === 'playCount') { + // $scope.playCount = mungedEvent.playCount; + // } + // + // if (change === 'taskCount') { + // $scope.taskCount = mungedEvent.taskCount; + // } + // + // if (change === 'finishedTime' && !$scope.workflow.finished) { + // $scope.workflow.finished = mungedEvent.finishedTime; + // } + // + // if (change === 'countFinished') { + // // the playbook_on_stats event actually lets + // // us know that we don't need to iteratively + // // look at event to update the host counts + // // any more. + // $scope.countFinished = true; + // } + // + // if(change === 'stdout'){ + // angular + // .element(".JobResultsStdOut-stdoutContainer") + // .append($compile(mungedEvent + // .stdout)($scope)); + // } + // }); + // } + // + // // the changes have been processed in the ui, mark it in the queue + // eventQueue.markProcessed(event); + // }); + // }; + + // PULL! grab completed event data and process each event + // TODO: implement retry logic in case one of these requests fails + // var getEvents = function(url) { + // workflowResultsService.getEvents(url) + // .then(events => { + // events.results.forEach(event => { + // // get the name in the same format as the data + // // coming over the websocket + // event.event_name = event.event; + // processEvent(event); + // }); + // if (events.next) { + // getEvents(events.next); + // } + // }); + // }; + // getEvents($scope.job.related.job_events); + + // // Processing of job_events messages from the websocket + // $scope.$on(`ws-job_events-${$scope.workflow.id}`, function(e, data) { + // processEvent(data); + // }); + + // Processing of job-status messages from the websocket + $scope.$on(`ws-jobs`, function(e, data) { + if (parseInt(data.unified_job_id, 10) === parseInt($scope.workflow.id,10)) { + $scope.workflow.status = data.status; + } }); - // failure nodes - _.forEach(params.nodesObj[params.nodeId].failure_nodes, function(failureNodesId) { - treeNode.children.push(buildBranch({ - nodeId: failureNodesId, - parentId: params.nodeId, - edgeType: "failure", - nodesObj: params.nodesObj - })); - }); - - // always nodes - _.forEach(params.nodesObj[params.nodeId].always_nodes, function(alwaysNodesId) { - treeNode.children.push(buildBranch({ - nodeId: alwaysNodesId, - parentId: params.nodeId, - edgeType: "always", - nodesObj: params.nodesObj - })); - }); - - return treeNode; - } - - - let nodesArray = $scope.workflow_nodes; - let nodesObj = {}; - let nonRootNodeIds = []; - let allNodeIds = []; - - // Determine which nodes are root nodes - _.forEach(nodesArray, function(node) { - nodesObj[node.id] = _.clone(node); - - allNodeIds.push(node.id); - - _.forEach(node.success_nodes, function(nodeId){ - nonRootNodeIds.push(nodeId); - }); - _.forEach(node.failure_nodes, function(nodeId){ - nonRootNodeIds.push(nodeId); - }); - _.forEach(node.always_nodes, function(nodeId){ - nonRootNodeIds.push(nodeId); - }); - }); - - let rootNodes = _.difference(allNodeIds, nonRootNodeIds); - - // Loop across the root nodes and re-build the tree - _.forEach(rootNodes, function(rootNodeId) { - let branch = buildBranch({ - nodeId: rootNodeId, - edgeType: "always", - nodesObj: nodesObj, - isRoot: true - }); - - $scope.treeData.data.children.push(branch); - }); - - // TODO: I think that the workflow chart directive (and eventually d3) is meddling with - // this treeData object and removing the children object for some reason (?) - // This happens on occasion and I think is a race condition (?) - if(!$scope.treeData.data.children) { - $scope.treeData.data.children = []; - } - - $scope.canAddWorkflowJobTemplate = false; - - // EVENT STUFF BELOW - - // just putting the event queue on scope so it can be inspected in the - // console - // $scope.event_queue = eventQueue.queue; - // $scope.defersArr = eventQueue.populateDefers; - - // This is where the async updates to the UI actually happen. - // Flow is event queue munging in the service -> $scope setting in here - // var processEvent = function(event) { - // // put the event in the queue - // eventQueue.populate(event).then(mungedEvent => { - // // make changes to ui based on the event returned from the queue - // if (mungedEvent.changes) { - // mungedEvent.changes.forEach(change => { - // // we've got a change we need to make to the UI! - // // update the necessary scope and make the change - // if (change === 'startTime' && !$scope.workflow.start) { - // $scope.workflow.start = mungedEvent.startTime; - // } - // - // if (change === 'count' && !$scope.countFinished) { - // // for all events that affect the host count, - // // update the status bar as well as the host - // // count badge - // $scope.count = mungedEvent.count; - // $scope.hostCount = getTotalHostCount(mungedEvent - // .count); - // } - // - // if (change === 'playCount') { - // $scope.playCount = mungedEvent.playCount; - // } - // - // if (change === 'taskCount') { - // $scope.taskCount = mungedEvent.taskCount; - // } - // - // if (change === 'finishedTime' && !$scope.workflow.finished) { - // $scope.workflow.finished = mungedEvent.finishedTime; - // } - // - // if (change === 'countFinished') { - // // the playbook_on_stats event actually lets - // // us know that we don't need to iteratively - // // look at event to update the host counts - // // any more. - // $scope.countFinished = true; - // } - // - // if(change === 'stdout'){ - // angular - // .element(".JobResultsStdOut-stdoutContainer") - // .append($compile(mungedEvent - // .stdout)($scope)); - // } - // }); - // } - // - // // the changes have been processed in the ui, mark it in the queue - // eventQueue.markProcessed(event); - // }); - // }; - - // PULL! grab completed event data and process each event - // TODO: implement retry logic in case one of these requests fails - // var getEvents = function(url) { - // workflowResultsService.getEvents(url) - // .then(events => { - // events.results.forEach(event => { - // // get the name in the same format as the data - // // coming over the websocket - // event.event_name = event.event; - // processEvent(event); - // }); - // if (events.next) { - // getEvents(events.next); - // } - // }); - // }; - // getEvents($scope.job.related.job_events); - - // // Processing of job_events messages from the websocket - // $scope.$on(`ws-job_events-${$scope.workflow.id}`, function(e, data) { - // processEvent(data); - // }); - - // Processing of job-status messages from the websocket - $scope.$on(`ws-jobs`, function(e, data) { - if (parseInt(data.unified_job_id, 10) === parseInt($scope.workflow.id,10)) { - $scope.workflow.status = data.status; - } - }); + init(); }];