From 7b1008a08df38cb8455fcf6dd3ba8fdcdc42d0be Mon Sep 17 00:00:00 2001 From: John Mitchell Date: Tue, 3 May 2016 11:53:52 -0400 Subject: [PATCH] org update linkouts work --- awx/ui/client/legacy-styles/lists.less | 4 + awx/ui/client/src/app.js | 25 --- awx/ui/client/src/forms/Organizations.js | 94 ------------ .../edit/organizations-edit.controller.js | 2 + .../client/src/organizations/linkout/main.js | 8 + .../organizations-linkout.controller.js | 81 ++++++++++ .../organizations-linkout.partial.html | 4 + .../linkout/organizations-linkout.route.js | 143 ++++++++++++++++++ .../list/organizations-list.controller.js | 32 ++-- .../list/organizations-list.partial.html | 5 +- awx/ui/client/src/organizations/main.js | 2 + 11 files changed, 266 insertions(+), 134 deletions(-) create mode 100644 awx/ui/client/src/organizations/linkout/main.js create mode 100644 awx/ui/client/src/organizations/linkout/organizations-linkout.controller.js create mode 100644 awx/ui/client/src/organizations/linkout/organizations-linkout.partial.html create mode 100644 awx/ui/client/src/organizations/linkout/organizations-linkout.route.js diff --git a/awx/ui/client/legacy-styles/lists.less b/awx/ui/client/legacy-styles/lists.less index 3c257e525c..d1bc0806d7 100644 --- a/awx/ui/client/legacy-styles/lists.less +++ b/awx/ui/client/legacy-styles/lists.less @@ -166,6 +166,10 @@ table, tbody { border-radius: 5px; } +.List-titleBadge--selected { + background-color: @default-link; +} + .List-titleText { color: @list-title-txt; font-size: 14px; diff --git a/awx/ui/client/src/app.js b/awx/ui/client/src/app.js index d57b217fee..2d09976b43 100644 --- a/awx/ui/client/src/app.js +++ b/awx/ui/client/src/app.js @@ -312,31 +312,6 @@ var tower = angular.module('Tower', [ templateUrl: urlPrefix + 'partials/projects.html', controller: OrganizationsAdd }). - - state('organizationAdmins', { - url: '/organizations/:organization_id/admins', - templateUrl: urlPrefix + 'partials/organizations.html', - controller: AdminsList - }). - - state('organizationUsers', { - url:'/organizations/:organization_id/users', - templateUrl: urlPrefix + 'partials/users.html', - controller: UsersList - }). - - state('organizationUserAdd', { - url: '/organizations/:organization_id/users/add', - templateUrl: urlPrefix + 'partials/users.html', - controller: UsersAdd - }). - - state('organizationUserEdit', { - url: '/organizations/:organization_id/users/:user_id', - templateUrl: urlPrefix + 'partials/users.html', - controller: UsersEdit - }). - state('teams', { url: '/teams', templateUrl: urlPrefix + 'partials/teams.html', diff --git a/awx/ui/client/src/forms/Organizations.js b/awx/ui/client/src/forms/Organizations.js index 18ff618a57..218b39f76b 100644 --- a/awx/ui/client/src/forms/Organizations.js +++ b/awx/ui/client/src/forms/Organizations.js @@ -46,100 +46,6 @@ export default }, related: { - - users: { - type: 'collection', - title: 'Users', - iterator: 'user', - index: false, - open: false, - - actions: { - add: { - ngClick: "add('users')", - label: 'Add', - awToolTip: 'Add a new user', - actionClass: 'btn List-buttonSubmit', - buttonContent: '+ ADD' - } - }, - - fields: { - username: { - key: true, - label: 'Username' - }, - first_name: { - label: 'First Name' - }, - last_name: { - label: 'Last Name' - } - }, - - fieldActions: { - edit: { - label: 'Edit', - ngClick: "edit('users', user.id, user.username)", - icon: 'icon-edit', - 'class': 'btn-default', - awToolTip: 'Edit user' - }, - "delete": { - label: 'Delete', - ngClick: "delete('users', user.id, user.username, 'user')", - icon: 'icon-trash', - "class": 'btn-danger', - awToolTip: 'Remove user' - } - } - }, - - admins: { // Assumes a plural name (e.g. things) - type: 'collection', - title: 'Administrators', - iterator: 'admin', // Singular form of name (e.g. thing) - index: false, - open: false, // Open accordion on load? - base: '/users', - actions: { // Actions displayed top right of list - add: { - ngClick: "add('admins')", - label: 'Add', - awToolTip: 'Add new administrator', - actionClass: 'btn List-buttonSubmit', - buttonContent: '+ ADD' - } - }, - fields: { - username: { - key: true, - label: 'Username' - }, - first_name: { - label: 'First Name' - }, - last_name: { - label: 'Last Name' - } - }, - fieldActions: { // Actions available on each row - edit: { - label: 'Edit', - ngClick: "edit('users', admin.id, admin.username)", - icon: 'icon-edit', - awToolTip: 'Edit administrator', - 'class': 'btn-default' - }, - "delete": { - label: 'Delete', - ngClick: "delete('admins', admin.id, admin.username, 'administrator')", - icon: 'icon-trash', - "class": 'btn-danger', - awToolTip: 'Remove administrator' - } - } - }, permissions: { type: 'collection', title: 'Permissions', diff --git a/awx/ui/client/src/organizations/edit/organizations-edit.controller.js b/awx/ui/client/src/organizations/edit/organizations-edit.controller.js index 22d7abdcac..aa6f727b86 100644 --- a/awx/ui/client/src/organizations/edit/organizations-edit.controller.js +++ b/awx/ui/client/src/organizations/edit/organizations-edit.controller.js @@ -25,6 +25,8 @@ export default ['$scope', '$rootScope', '$compile', '$location', id = $stateParams.organization_id, relatedSets = {}; + $scope.$parent.activeMode = 'edit'; + $scope.$emit("HideOrgListHeader"); $scope.$emit("ReloadOrganzationCards", id); diff --git a/awx/ui/client/src/organizations/linkout/main.js b/awx/ui/client/src/organizations/linkout/main.js new file mode 100644 index 0000000000..ed07ead60a --- /dev/null +++ b/awx/ui/client/src/organizations/linkout/main.js @@ -0,0 +1,8 @@ +import routes from './organizations-linkout.route'; + +export default angular.module('organizationsLinkout', []) + .run(['$stateExtender', function($stateExtender) { + routes.forEach(function(route) { + $stateExtender.addState(route); + }); + }]); diff --git a/awx/ui/client/src/organizations/linkout/organizations-linkout.controller.js b/awx/ui/client/src/organizations/linkout/organizations-linkout.controller.js new file mode 100644 index 0000000000..7d47f544b2 --- /dev/null +++ b/awx/ui/client/src/organizations/linkout/organizations-linkout.controller.js @@ -0,0 +1,81 @@ +export default ['$scope', '$stateParams', '$state', 'Rest', 'UserList', 'InventoryList', 'JobTemplateList', 'TeamList', 'ProjectList', 'generateList', 'SearchInit', 'PaginateInit', function($scope, $stateParams, $state, Rest, UserList, InventoryList, JobTemplateList, TeamList, ProjectList, GenerateList, SearchInit, PaginateInit) { + + var getList = function(mode) { + var list = {}; + if (mode === 'users') { + list = _.cloneDeep(UserList); + list.actions.add.buttonContent = '+ ADD user'; + } else if (mode === 'inventories') { + list = _.cloneDeep(InventoryList); + delete list.actions.add; + } else if (mode === 'job_templates') { + list = _.cloneDeep(JobTemplateList); + delete list.actions.add; + } else if (mode === 'teams') { + list = _.cloneDeep(TeamList); + delete list.actions.add; + } else if (mode === 'projects') { + list = _.cloneDeep(ProjectList); + delete list.actions.add; + } else if (mode === 'admins') { + list = _.cloneDeep(UserList); + list.actions.add.buttonContent = '+ ADD administrator'; + } + return list; + }; + + var getUrl = function(mode, data) { + var url = ""; + if (mode === 'users') { + url = data.related.users; + } else if (mode === 'inventories') { + url = data.related.inventories; + } else if (mode === 'job_templates') { + url = "/api/v1/job_templates/?project__organization=" + data.id; + } else if (mode === 'teams') { + url = data.related.teams; + } else if (mode === 'projects') { + url = data.related.projects; + } else if (mode === 'admins') { + url = data.related.admins; + } + return url; + }; + + Rest.setUrl("/api/v1/organizations/" + $stateParams.organization_id); + Rest.get() + .success(function (data) { + // include name of item in listTitle + var mode = $state.current.name.split(".")[1], + listTitle = data.name + + "
" + + mode.replace('_', ' '), + list, + url, + generator = GenerateList; + $scope.$parent.hideListHeader = true; + $scope.$parent.activeCard = parseInt($stateParams.organization_id); + $scope.$parent.activeMode = mode; + + list = getList(mode); + list.listTitle = listTitle; + + url = getUrl(mode, data); + + generator + .inject(list, { mode: 'edit', scope: $scope }); + + SearchInit({ + scope: $scope, + set: mode, + list: list, + url: url + }); + PaginateInit({ + scope: $scope, + list: list, + url: url + }); + $scope.search(list.iterator); + }); +}]; diff --git a/awx/ui/client/src/organizations/linkout/organizations-linkout.partial.html b/awx/ui/client/src/organizations/linkout/organizations-linkout.partial.html new file mode 100644 index 0000000000..0de1feedc6 --- /dev/null +++ b/awx/ui/client/src/organizations/linkout/organizations-linkout.partial.html @@ -0,0 +1,4 @@ +
+
+
+
diff --git a/awx/ui/client/src/organizations/linkout/organizations-linkout.route.js b/awx/ui/client/src/organizations/linkout/organizations-linkout.route.js new file mode 100644 index 0000000000..448a635fc4 --- /dev/null +++ b/awx/ui/client/src/organizations/linkout/organizations-linkout.route.js @@ -0,0 +1,143 @@ +/************************************************* + * Copyright (c) 2016 Ansible, Inc. + * + * All Rights Reserved + *************************************************/ + +import {templateUrl} from '../../shared/template-url/template-url.factory'; +import OrganizationsLinkout from './organizations-linkout.controller'; + +export default [ + { + name: 'organizations.users', + route: '/:organization_id/users', + templateUrl: templateUrl('organizations/linkout/organizations-linkout'), + controller: OrganizationsLinkout, + data: { + activityStream: true, + activityStreamTarget: 'organization' + }, + ncyBreadcrumb: { + parent: function($scope) { + $scope.$parent.$emit("ReloadOrgListView"); + return "setup"; + }, + label: "ORGANIZATIONS" + }, + resolve: { + features: ['FeaturesService', function(FeaturesService) { + return FeaturesService.get(); + }] + } + }, + { + name: 'organizations.teams', + route: '/:organization_id/teams', + templateUrl: templateUrl('organizations/linkout/organizations-linkout'), + controller: OrganizationsLinkout, + data: { + activityStream: true, + activityStreamTarget: 'organization' + }, + ncyBreadcrumb: { + parent: function($scope) { + $scope.$parent.$emit("ReloadOrgListView"); + return "setup"; + }, + label: "ORGANIZATIONS" + }, + resolve: { + features: ['FeaturesService', function(FeaturesService) { + return FeaturesService.get(); + }] + } + }, + { + name: 'organizations.inventories', + route: '/:organization_id/inventories', + templateUrl: templateUrl('organizations/linkout/organizations-linkout'), + controller: OrganizationsLinkout, + data: { + activityStream: true, + activityStreamTarget: 'organization' + }, + ncyBreadcrumb: { + parent: function($scope) { + $scope.$parent.$emit("ReloadOrgListView"); + return "setup"; + }, + label: "ORGANIZATIONS" + }, + resolve: { + features: ['FeaturesService', function(FeaturesService) { + return FeaturesService.get(); + }] + } + }, + { + name: 'organizations.projects', + route: '/:organization_id/projects', + templateUrl: templateUrl('organizations/linkout/organizations-linkout'), + controller: OrganizationsLinkout, + data: { + activityStream: true, + activityStreamTarget: 'organization' + }, + ncyBreadcrumb: { + parent: function($scope) { + $scope.$parent.$emit("ReloadOrgListView"); + return "setup"; + }, + label: "ORGANIZATIONS" + }, + resolve: { + features: ['FeaturesService', function(FeaturesService) { + return FeaturesService.get(); + }] + } + }, + { + name: 'organizations.job_templates', + route: '/:organization_id/job_templates', + templateUrl: templateUrl('organizations/linkout/organizations-linkout'), + controller: OrganizationsLinkout, + data: { + activityStream: true, + activityStreamTarget: 'organization' + }, + ncyBreadcrumb: { + parent: function($scope) { + $scope.$parent.$emit("ReloadOrgListView"); + return "setup"; + }, + label: "ORGANIZATIONS" + }, + resolve: { + features: ['FeaturesService', function(FeaturesService) { + return FeaturesService.get(); + }] + } + }, + { + name: 'organizations.admins', + route: '/:organization_id/admins', + templateUrl: templateUrl('organizations/linkout/organizations-linkout'), + controller: OrganizationsLinkout, + data: { + activityStream: true, + activityStreamTarget: 'organization' + }, + ncyBreadcrumb: { + parent: function($scope) { + $scope.$parent.$emit("ReloadOrgListView"); + return "setup"; + }, + label: "ORGANIZATIONS" + }, + resolve: { + features: ['FeaturesService', function(FeaturesService) { + return FeaturesService.get(); + }] + } + } +]; diff --git a/awx/ui/client/src/organizations/list/organizations-list.controller.js b/awx/ui/client/src/organizations/list/organizations-list.controller.js index cd6f85a6f7..0b73fdf75d 100644 --- a/awx/ui/client/src/organizations/list/organizations-list.controller.js +++ b/awx/ui/client/src/organizations/list/organizations-list.controller.js @@ -48,7 +48,7 @@ export default ['$stateParams', '$scope', '$rootScope', '$location', var parseCardData = function(cards) { return cards.map(function(card) { - var val = {}; + var val = {}, url = '/#/organizations/' + card.id + '/'; val.name = card.name; val.id = card.id; if (card.id + "" === cards.activeCard) { @@ -57,34 +57,40 @@ export default ['$stateParams', '$scope', '$rootScope', '$location', val.description = card.description || undefined; val.links = []; val.links.push({ - href: card.related.users, + href: url + 'users', name: "USERS", - count: card.summary_fields.related_field_counts.users + count: card.summary_fields.related_field_counts.users, + activeMode: 'users' }); val.links.push({ - href: card.related.teams, + href: url + 'teams', name: "TEAMS", - count: card.summary_fields.related_field_counts.teams + count: card.summary_fields.related_field_counts.teams, + activeMode: 'teams' }); val.links.push({ - href: card.related.inventories, + href: url + 'inventories', name: "INVENTORIES", - count: card.summary_fields.related_field_counts.inventories + count: card.summary_fields.related_field_counts.inventories, + activeMode: 'inventories' }); val.links.push({ - href: card.related.projects, + href: url + 'projects', name: "PROJECTS", - count: card.summary_fields.related_field_counts.projects + count: card.summary_fields.related_field_counts.projects, + activeMode: 'projects' }); val.links.push({ - href: card.related.job_templates, + href: url + 'job_templates', name: "JOB TEMPLATES", - count: card.summary_fields.related_field_counts.job_templates + count: card.summary_fields.related_field_counts.job_templates, + activeMode: 'job_templates' }); val.links.push({ - href: card.related.admins, + href: url + 'admins', name: "ADMINS", - count: card.summary_fields.related_field_counts.admins + count: card.summary_fields.related_field_counts.admins, + activeMode: 'admins' }); return val; }); diff --git a/awx/ui/client/src/organizations/list/organizations-list.partial.html b/awx/ui/client/src/organizations/list/organizations-list.partial.html index 73bfa908e9..8a7948f6a1 100644 --- a/awx/ui/client/src/organizations/list/organizations-list.partial.html +++ b/awx/ui/client/src/organizations/list/organizations-list.partial.html @@ -28,7 +28,7 @@