diff --git a/app/app.js b/app/app.js index b81cb3a5a..ab07489e5 100644 --- a/app/app.js +++ b/app/app.js @@ -20,8 +20,6 @@ angular.module('portainer', [ 'portainer.services', 'auth', 'dashboard', - 'common.accesscontrol.panel', - 'common.accesscontrol.form', 'container', 'containerConsole', 'containerLogs', diff --git a/app/components/common/accessControlForm/accessControlForm.html b/app/components/common/accessControlForm/accessControlForm.html deleted file mode 100644 index f3bd32b7b..000000000 --- a/app/components/common/accessControlForm/accessControlForm.html +++ /dev/null @@ -1,126 +0,0 @@ -
-
- Access control -
- -
-
- - -
-
- - -
-
-
- - -
-
- - -
-
- - -
-
- - -
-
-
- - -
-
- - - You have not yet created any team. Head over the teams view to manage user teams. - - - -
-
- - -
-
- - - You have not yet created any user. Head over the users view to manage users. - - - -
-
- -
diff --git a/app/components/common/accessControlForm/accessControlFormController.js b/app/components/common/accessControlForm/accessControlFormController.js deleted file mode 100644 index 2656b900e..000000000 --- a/app/components/common/accessControlForm/accessControlFormController.js +++ /dev/null @@ -1,55 +0,0 @@ -angular.module('common.accesscontrol.form', []) -.controller('AccessControlFormController', ['$q', '$scope', '$state', 'UserService', 'ResourceControlService', 'Notifications', 'Authentication', 'ModalService', 'ControllerDataPipeline', -function ($q, $scope, $state, UserService, ResourceControlService, Notifications, Authentication, ModalService, ControllerDataPipeline) { - - $scope.availableTeams = []; - $scope.availableUsers = []; - - $scope.formValues = { - enableAccessControl: true, - Ownership_Teams: [], - Ownership_Users: [], - Ownership: 'private' - }; - - $scope.synchronizeFormData = function() { - ControllerDataPipeline.setAccessControlFormData($scope.formValues.enableAccessControl, - $scope.formValues.Ownership, $scope.formValues.Ownership_Users, $scope.formValues.Ownership_Teams); - }; - - function initAccessControlForm() { - $('#loadingViewSpinner').show(); - - var userDetails = Authentication.getUserDetails(); - var isAdmin = userDetails.role === 1 ? true: false; - $scope.isAdmin = isAdmin; - - if (isAdmin) { - $scope.formValues.Ownership = 'administrators'; - } - - $q.all({ - availableTeams: UserService.userTeams(userDetails.ID), - availableUsers: isAdmin ? UserService.users(false) : [] - }) - .then(function success(data) { - $scope.availableUsers = data.availableUsers; - - var availableTeams = data.availableTeams; - $scope.availableTeams = availableTeams; - if (!isAdmin && availableTeams.length === 1) { - $scope.formValues.Ownership_Teams = availableTeams; - } - - $scope.synchronizeFormData(); - }) - .catch(function error(err) { - Notifications.error('Failure', err, 'Unable to retrieve access control information'); - }) - .finally(function final() { - $('#loadingViewSpinner').hide(); - }); - } - - initAccessControlForm(); -}]); diff --git a/app/components/common/accessControlPanel/accessControlPanelController.js b/app/components/common/accessControlPanel/accessControlPanelController.js deleted file mode 100644 index 8283b6d97..000000000 --- a/app/components/common/accessControlPanel/accessControlPanelController.js +++ /dev/null @@ -1,158 +0,0 @@ -angular.module('common.accesscontrol.panel', []) -.controller('AccessControlPanelController', ['$q', '$scope', '$state', 'UserService', 'ResourceControlService', 'Notifications', 'Authentication', 'ModalService', 'ControllerDataPipeline', 'FormValidator', -function ($q, $scope, $state, UserService, ResourceControlService, Notifications, Authentication, ModalService, ControllerDataPipeline, FormValidator) { - - $scope.state = { - displayAccessControlPanel: false, - canEditOwnership: false, - editOwnership: false, - formValidationError: '' - }; - - $scope.formValues = { - Ownership: 'public', - Ownership_Users: [], - Ownership_Teams: [] - }; - - $scope.authorizedUsers = []; - $scope.availableUsers = []; - $scope.authorizedTeams = []; - $scope.availableTeams = []; - - $scope.confirmUpdateOwnership = function (force) { - if (!validateForm()) { - return; - } - ModalService.confirmAccessControlUpdate(function (confirmed) { - if(!confirmed) { return; } - updateOwnership(); - }); - }; - - function processOwnershipFormValues() { - var userIds = []; - angular.forEach($scope.formValues.Ownership_Users, function(user) { - userIds.push(user.Id); - }); - var teamIds = []; - angular.forEach($scope.formValues.Ownership_Teams, function(team) { - teamIds.push(team.Id); - }); - var administratorsOnly = $scope.formValues.Ownership === 'administrators' ? true : false; - - return { - ownership: $scope.formValues.Ownership, - authorizedUserIds: administratorsOnly ? [] : userIds, - authorizedTeamIds: administratorsOnly ? [] : teamIds, - administratorsOnly: administratorsOnly - }; - } - - function validateForm() { - $scope.state.formValidationError = ''; - var error = ''; - - var accessControlData = { - ownership: $scope.formValues.Ownership, - authorizedUsers: $scope.formValues.Ownership_Users, - authorizedTeams: $scope.formValues.Ownership_Teams - }; - var isAdmin = $scope.isAdmin; - error = FormValidator.validateAccessControl(accessControlData, isAdmin); - if (error) { - $scope.state.formValidationError = error; - return false; - } - return true; - } - - function updateOwnership() { - $('#loadingViewSpinner').show(); - - var accessControlData = ControllerDataPipeline.getAccessControlData(); - var resourceId = accessControlData.resourceId; - var ownershipParameters = processOwnershipFormValues(); - - ResourceControlService.applyResourceControlChange(accessControlData.resourceType, resourceId, - $scope.resourceControl, ownershipParameters) - .then(function success(data) { - Notifications.success('Access control successfully updated'); - $state.reload(); - }) - .catch(function error(err) { - Notifications.error('Failure', err, 'Unable to update access control'); - }) - .finally(function final() { - $('#loadingViewSpinner').hide(); - }); - } - - function initAccessControlPanel() { - $('#loadingViewSpinner').show(); - - var userDetails = Authentication.getUserDetails(); - var isAdmin = userDetails.role === 1 ? true: false; - var userId = userDetails.ID; - $scope.isAdmin = isAdmin; - - var accessControlData = ControllerDataPipeline.getAccessControlData(); - var resourceControl = accessControlData.resourceControl; - $scope.resourceType = accessControlData.resourceType; - $scope.resourceControl = resourceControl; - - if (isAdmin) { - if (resourceControl) { - $scope.formValues.Ownership = resourceControl.Ownership === 'private' ? 'restricted' : resourceControl.Ownership; - } else { - $scope.formValues.Ownership = 'public'; - } - } else { - $scope.formValues.Ownership = 'public'; - } - - ResourceControlService.retrieveOwnershipDetails(resourceControl) - .then(function success(data) { - $scope.authorizedUsers = data.authorizedUsers; - $scope.authorizedTeams = data.authorizedTeams; - return ResourceControlService.retrieveUserPermissionsOnResource(userId, isAdmin, resourceControl); - }) - .then(function success(data) { - $scope.state.canEditOwnership = data.isPartOfRestrictedUsers || data.isLeaderOfAnyRestrictedTeams; - $scope.state.canChangeOwnershipToTeam = data.isPartOfRestrictedUsers; - - return $q.all({ - availableUsers: isAdmin ? UserService.users(false) : [], - availableTeams: isAdmin || data.isPartOfRestrictedUsers ? UserService.userTeams(userId) : [] - }); - }) - .then(function success(data) { - $scope.availableUsers = data.availableUsers; - angular.forEach($scope.availableUsers, function(user) { - var found = _.find($scope.authorizedUsers, { Id: user.Id }); - if (found) { - user.selected = true; - } - }); - $scope.availableTeams = data.availableTeams; - angular.forEach(data.availableTeams, function(team) { - var found = _.find($scope.authorizedTeams, { Id: team.Id }); - if (found) { - team.selected = true; - } - }); - if (data.availableTeams.length === 1) { - $scope.formValues.Ownership_Teams.push(data.availableTeams[0]); - } - $scope.state.displayAccessControlPanel = true; - }) - .catch(function error(err) { - Notifications.error('Failure', err, 'Unable to retrieve access control information'); - }) - .finally(function final() { - $('#loadingViewSpinner').hide(); - }); - } - - initAccessControlPanel(); -}]); diff --git a/app/components/container/container.html b/app/components/container/container.html index f2ee6c857..c3890b856 100644 --- a/app/components/container/container.html +++ b/app/components/container/container.html @@ -87,7 +87,13 @@ -
+ + + +
diff --git a/app/components/container/containerController.js b/app/components/container/containerController.js index f7e964e33..22acf056c 100644 --- a/app/components/container/containerController.js +++ b/app/components/container/containerController.js @@ -1,6 +1,6 @@ angular.module('container', []) -.controller('ContainerController', ['$scope', '$state','$stateParams', '$filter', 'Container', 'ContainerCommit', 'ContainerService', 'ImageHelper', 'Network', 'Notifications', 'Pagination', 'ModalService', 'ControllerDataPipeline', -function ($scope, $state, $stateParams, $filter, Container, ContainerCommit, ContainerService, ImageHelper, Network, Notifications, Pagination, ModalService, ControllerDataPipeline) { +.controller('ContainerController', ['$scope', '$state','$stateParams', '$filter', 'Container', 'ContainerCommit', 'ContainerService', 'ImageHelper', 'Network', 'Notifications', 'Pagination', 'ModalService', +function ($scope, $state, $stateParams, $filter, Container, ContainerCommit, ContainerService, ImageHelper, Network, Notifications, Pagination, ModalService) { $scope.activityTime = 0; $scope.portBindings = []; $scope.config = { @@ -19,7 +19,6 @@ function ($scope, $state, $stateParams, $filter, Container, ContainerCommit, Con Container.get({id: $stateParams.id}, function (d) { var container = new ContainerDetailsViewModel(d); $scope.container = container; - ControllerDataPipeline.setAccessControlData('container', $stateParams.id, container.ResourceControl); $scope.container.edit = false; $scope.container.newContainerName = $filter('trimcontainername')(container.Name); diff --git a/app/components/createContainer/createContainerController.js b/app/components/createContainer/createContainerController.js index b578a8bc0..048e3f2ce 100644 --- a/app/components/createContainer/createContainerController.js +++ b/app/components/createContainer/createContainerController.js @@ -1,8 +1,8 @@ // @@OLD_SERVICE_CONTROLLER: this service should be rewritten to use services. // See app/components/templates/templatesController.js as a reference. angular.module('createContainer', []) -.controller('CreateContainerController', ['$q', '$scope', '$state', '$stateParams', '$filter', 'Container', 'ContainerHelper', 'Image', 'ImageHelper', 'Volume', 'Network', 'ResourceControlService', 'Authentication', 'Notifications', 'ContainerService', 'ImageService', 'ControllerDataPipeline', 'FormValidator', -function ($q, $scope, $state, $stateParams, $filter, Container, ContainerHelper, Image, ImageHelper, Volume, Network, ResourceControlService, Authentication, Notifications, ContainerService, ImageService, ControllerDataPipeline, FormValidator) { +.controller('CreateContainerController', ['$q', '$scope', '$state', '$stateParams', '$filter', 'Container', 'ContainerHelper', 'Image', 'ImageHelper', 'Volume', 'Network', 'ResourceControlService', 'Authentication', 'Notifications', 'ContainerService', 'ImageService', 'FormValidator', +function ($q, $scope, $state, $stateParams, $filter, Container, ContainerHelper, Image, ImageHelper, Volume, Network, ResourceControlService, Authentication, Notifications, ContainerService, ImageService, FormValidator) { $scope.formValues = { alwaysPull: true, @@ -13,7 +13,8 @@ function ($q, $scope, $state, $stateParams, $filter, Container, ContainerHelper, Labels: [], ExtraHosts: [], IPv4: '', - IPv6: '' + IPv6: '', + AccessControlData: new AccessControlFormData() }; $scope.state = { @@ -285,7 +286,7 @@ function ($q, $scope, $state, $stateParams, $filter, Container, ContainerHelper, $scope.create = function () { $('#createContainerSpinner').show(); - var accessControlData = ControllerDataPipeline.getAccessControlFormData(); + var accessControlData = $scope.formValues.AccessControlData; var userDetails = Authentication.getUserDetails(); var isAdmin = userDetails.role === 1 ? true : false; diff --git a/app/components/createContainer/createcontainer.html b/app/components/createContainer/createcontainer.html index 8600fe092..356f244f5 100644 --- a/app/components/createContainer/createcontainer.html +++ b/app/components/createContainer/createcontainer.html @@ -98,7 +98,7 @@
-
+
diff --git a/app/components/createService/createServiceController.js b/app/components/createService/createServiceController.js index 846e188f1..3ede157b1 100644 --- a/app/components/createService/createServiceController.js +++ b/app/components/createService/createServiceController.js @@ -1,8 +1,8 @@ // @@OLD_SERVICE_CONTROLLER: this service should be rewritten to use services. // See app/components/templates/templatesController.js as a reference. angular.module('createService', []) -.controller('CreateServiceController', ['$q', '$scope', '$state', 'Service', 'ServiceHelper', 'SecretHelper', 'SecretService', 'VolumeService', 'NetworkService', 'ImageHelper', 'LabelHelper', 'Authentication', 'ResourceControlService', 'Notifications', 'ControllerDataPipeline', 'FormValidator', 'RegistryService', 'HttpRequestHelper', -function ($q, $scope, $state, Service, ServiceHelper, SecretHelper, SecretService, VolumeService, NetworkService, ImageHelper, LabelHelper, Authentication, ResourceControlService, Notifications, ControllerDataPipeline, FormValidator, RegistryService, HttpRequestHelper) { +.controller('CreateServiceController', ['$q', '$scope', '$state', 'Service', 'ServiceHelper', 'SecretHelper', 'SecretService', 'VolumeService', 'NetworkService', 'ImageHelper', 'LabelHelper', 'Authentication', 'ResourceControlService', 'Notifications', 'FormValidator', 'RegistryService', 'HttpRequestHelper', +function ($q, $scope, $state, Service, ServiceHelper, SecretHelper, SecretService, VolumeService, NetworkService, ImageHelper, LabelHelper, Authentication, ResourceControlService, Notifications, FormValidator, RegistryService, HttpRequestHelper) { $scope.formValues = { Name: '', @@ -26,7 +26,8 @@ function ($q, $scope, $state, Service, ServiceHelper, SecretHelper, SecretServic PlacementPreferences: [], UpdateDelay: 0, FailureAction: 'pause', - Secrets: [] + Secrets: [], + AccessControlData: new AccessControlFormData() }; $scope.state = { @@ -286,7 +287,7 @@ function ($q, $scope, $state, Service, ServiceHelper, SecretHelper, SecretServic $scope.create = function createService() { $('#createServiceSpinner').show(); - var accessControlData = ControllerDataPipeline.getAccessControlFormData(); + var accessControlData = $scope.formValues.AccessControlData; var userDetails = Authentication.getUserDetails(); var isAdmin = userDetails.role === 1 ? true : false; diff --git a/app/components/createService/createservice.html b/app/components/createService/createservice.html index f96f834ef..49e796069 100644 --- a/app/components/createService/createservice.html +++ b/app/components/createService/createservice.html @@ -101,7 +101,7 @@
-
+
diff --git a/app/components/createVolume/createVolumeController.js b/app/components/createVolume/createVolumeController.js index a7b5f3d85..7107fb077 100644 --- a/app/components/createVolume/createVolumeController.js +++ b/app/components/createVolume/createVolumeController.js @@ -1,10 +1,11 @@ angular.module('createVolume', []) -.controller('CreateVolumeController', ['$scope', '$state', 'VolumeService', 'SystemService', 'ResourceControlService', 'Authentication', 'Notifications', 'ControllerDataPipeline', 'FormValidator', -function ($scope, $state, VolumeService, SystemService, ResourceControlService, Authentication, Notifications, ControllerDataPipeline, FormValidator) { +.controller('CreateVolumeController', ['$scope', '$state', 'VolumeService', 'SystemService', 'ResourceControlService', 'Authentication', 'Notifications', 'FormValidator', +function ($scope, $state, VolumeService, SystemService, ResourceControlService, Authentication, Notifications, FormValidator) { $scope.formValues = { Driver: 'local', - DriverOptions: [] + DriverOptions: [], + AccessControlData: new AccessControlFormData() }; $scope.state = { @@ -40,8 +41,8 @@ function ($scope, $state, VolumeService, SystemService, ResourceControlService, var driver = $scope.formValues.Driver; var driverOptions = $scope.formValues.DriverOptions; var volumeConfiguration = VolumeService.createVolumeConfiguration(name, driver, driverOptions); + var accessControlData = $scope.formValues.AccessControlData; var userDetails = Authentication.getUserDetails(); - var accessControlData = ControllerDataPipeline.getAccessControlFormData(); var isAdmin = userDetails.role === 1 ? true : false; if (!validateForm(accessControlData, isAdmin)) { diff --git a/app/components/createVolume/createvolume.html b/app/components/createVolume/createvolume.html index 7444cac54..2ca08ec84 100644 --- a/app/components/createVolume/createvolume.html +++ b/app/components/createVolume/createvolume.html @@ -65,7 +65,7 @@
-
+
diff --git a/app/components/service/service.html b/app/components/service/service.html index fd88628c2..cec143309 100644 --- a/app/components/service/service.html +++ b/app/components/service/service.html @@ -125,7 +125,13 @@
-
+ + + +

diff --git a/app/components/service/serviceController.js b/app/components/service/serviceController.js index 83b3d9353..b61dbb256 100644 --- a/app/components/service/serviceController.js +++ b/app/components/service/serviceController.js @@ -1,6 +1,6 @@ angular.module('service', []) -.controller('ServiceController', ['$q', '$scope', '$stateParams', '$state', '$location', '$timeout', '$anchorScroll', 'ServiceService', 'Secret', 'SecretHelper', 'Service', 'ServiceHelper', 'LabelHelper', 'TaskService', 'NodeService', 'Notifications', 'Pagination', 'ModalService', 'ControllerDataPipeline', -function ($q, $scope, $stateParams, $state, $location, $timeout, $anchorScroll, ServiceService, Secret, SecretHelper, Service, ServiceHelper, LabelHelper, TaskService, NodeService, Notifications, Pagination, ModalService, ControllerDataPipeline) { +.controller('ServiceController', ['$q', '$scope', '$stateParams', '$state', '$location', '$timeout', '$anchorScroll', 'ServiceService', 'Secret', 'SecretHelper', 'Service', 'ServiceHelper', 'LabelHelper', 'TaskService', 'NodeService', 'Notifications', 'Pagination', 'ModalService', +function ($q, $scope, $stateParams, $state, $location, $timeout, $anchorScroll, ServiceService, Secret, SecretHelper, Service, ServiceHelper, LabelHelper, TaskService, NodeService, Notifications, Pagination, ModalService) { $scope.state = {}; $scope.state.pagination_count = Pagination.getPaginationCount('service_tasks'); @@ -299,7 +299,6 @@ function ($q, $scope, $stateParams, $state, $location, $timeout, $anchorScroll, translateServiceArrays(service); $scope.service = service; - ControllerDataPipeline.setAccessControlData('service', $stateParams.id, service.ResourceControl); originalService = angular.copy(service); return $q.all({ diff --git a/app/components/templates/templates.html b/app/components/templates/templates.html index 8b273388c..c4a99b153 100644 --- a/app/components/templates/templates.html +++ b/app/components/templates/templates.html @@ -68,7 +68,7 @@
-
+
@@ -202,13 +202,14 @@
- + When using Swarm, we recommend deploying containers in a shared network. Looks like you don't have any shared network, head over the networks view to create one. - + App templates cannot be deployed as Swarm Mode services for the moment. You can still use them to quickly deploy containers on the Docker host. + {{ state.formValidationError }}
diff --git a/app/components/templates/templatesController.js b/app/components/templates/templatesController.js index e4ab1f384..5b62b5b1b 100644 --- a/app/components/templates/templatesController.js +++ b/app/components/templates/templatesController.js @@ -1,6 +1,6 @@ angular.module('templates', []) -.controller('TemplatesController', ['$scope', '$q', '$state', '$stateParams', '$anchorScroll', '$filter', 'ContainerService', 'ContainerHelper', 'ImageService', 'NetworkService', 'TemplateService', 'TemplateHelper', 'VolumeService', 'Notifications', 'Pagination', 'ResourceControlService', 'Authentication', 'ControllerDataPipeline', 'FormValidator', -function ($scope, $q, $state, $stateParams, $anchorScroll, $filter, ContainerService, ContainerHelper, ImageService, NetworkService, TemplateService, TemplateHelper, VolumeService, Notifications, Pagination, ResourceControlService, Authentication, ControllerDataPipeline, FormValidator) { +.controller('TemplatesController', ['$scope', '$q', '$state', '$stateParams', '$anchorScroll', '$filter', 'ContainerService', 'ContainerHelper', 'ImageService', 'NetworkService', 'TemplateService', 'TemplateHelper', 'VolumeService', 'Notifications', 'Pagination', 'ResourceControlService', 'Authentication', 'FormValidator', +function ($scope, $q, $state, $stateParams, $anchorScroll, $filter, ContainerService, ContainerHelper, ImageService, NetworkService, TemplateService, TemplateHelper, VolumeService, Notifications, Pagination, ResourceControlService, Authentication, FormValidator) { $scope.state = { selectedTemplate: null, showAdvancedOptions: false, @@ -14,7 +14,8 @@ function ($scope, $q, $state, $stateParams, $anchorScroll, $filter, ContainerSer $scope.formValues = { network: '', - name: '' + name: '', + AccessControlData: new AccessControlFormData() }; $scope.addVolume = function () { @@ -49,7 +50,7 @@ function ($scope, $q, $state, $stateParams, $anchorScroll, $filter, ContainerSer $('#createContainerSpinner').show(); var userDetails = Authentication.getUserDetails(); - var accessControlData = ControllerDataPipeline.getAccessControlFormData(); + var accessControlData = $scope.formValues.AccessControlData; var isAdmin = userDetails.role === 1 ? true : false; if (!validateForm(accessControlData, isAdmin)) { diff --git a/app/components/volume/volume.html b/app/components/volume/volume.html index 79f00f7d8..fcdc8f52b 100644 --- a/app/components/volume/volume.html +++ b/app/components/volume/volume.html @@ -47,7 +47,13 @@
-
+ + + +
diff --git a/app/components/volume/volumeController.js b/app/components/volume/volumeController.js index 1a0b5cc01..2753d1b19 100644 --- a/app/components/volume/volumeController.js +++ b/app/components/volume/volumeController.js @@ -1,6 +1,6 @@ angular.module('volume', []) -.controller('VolumeController', ['$scope', '$state', '$stateParams', 'VolumeService', 'Notifications', 'ControllerDataPipeline', -function ($scope, $state, $stateParams, VolumeService, Notifications, ControllerDataPipeline) { +.controller('VolumeController', ['$scope', '$state', '$stateParams', 'VolumeService', 'Notifications', +function ($scope, $state, $stateParams, VolumeService, Notifications) { $scope.removeVolume = function removeVolume() { $('#loadingViewSpinner').show(); @@ -22,7 +22,6 @@ function ($scope, $state, $stateParams, VolumeService, Notifications, Controller VolumeService.volume($stateParams.id) .then(function success(data) { var volume = data; - ControllerDataPipeline.setAccessControlData('volume', volume.Id, volume.ResourceControl); $scope.volume = volume; }) .catch(function error(err) { diff --git a/app/directives/accessControlForm/por-access-control-form.js b/app/directives/accessControlForm/por-access-control-form.js new file mode 100644 index 000000000..4f71b3acf --- /dev/null +++ b/app/directives/accessControlForm/por-access-control-form.js @@ -0,0 +1,12 @@ +angular.module('portainer').component('porAccessControlForm', { + templateUrl: 'app/directives/accessControlForm/porAccessControlForm.html', + controller: 'porAccessControlFormController', + bindings: { + // This object will be populated with the form data. + // Model reference in porAccessControlFromModel.js + formData: '=', + // Optional. An existing resource control object that will be used to set + // the default values of the component. + resourceControl: '<' + } +}); diff --git a/app/directives/accessControlForm/porAccessControlForm.html b/app/directives/accessControlForm/porAccessControlForm.html new file mode 100644 index 000000000..a8978408f --- /dev/null +++ b/app/directives/accessControlForm/porAccessControlForm.html @@ -0,0 +1,124 @@ +
+
+ Access control +
+ +
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+ + + You have not yet created any team. Head over the teams view to manage user teams. + + + +
+
+ + +
+
+ + + You have not yet created any user. Head over the users view to manage users. + + + +
+
+ +
diff --git a/app/directives/accessControlForm/porAccessControlFormController.js b/app/directives/accessControlForm/porAccessControlFormController.js new file mode 100644 index 000000000..cd40cc10c --- /dev/null +++ b/app/directives/accessControlForm/porAccessControlFormController.js @@ -0,0 +1,76 @@ +angular.module('portainer') +.controller('porAccessControlFormController', ['$q', 'UserService', 'Notifications', 'Authentication', 'ResourceControlService', +function ($q, UserService, Notifications, Authentication, ResourceControlService) { + var ctrl = this; + + ctrl.availableTeams = []; + ctrl.availableUsers = []; + + function setOwnership(resourceControl, isAdmin) { + if (isAdmin && resourceControl.Ownership === 'private') { + ctrl.formData.Ownership = 'restricted'; + } else { + ctrl.formData.Ownership = resourceControl.Ownership; + } + } + + function setAuthorizedUsersAndTeams(authorizedUsers, authorizedTeams) { + angular.forEach(ctrl.availableUsers, function(user) { + var found = _.find(authorizedUsers, { Id: user.Id }); + if (found) { + user.selected = true; + } + }); + + angular.forEach(ctrl.availableTeams, function(team) { + var found = _.find(authorizedTeams, { Id: team.Id }); + if (found) { + team.selected = true; + } + }); + } + + function initComponent() { + $('#loadingViewSpinner').show(); + + var userDetails = Authentication.getUserDetails(); + var isAdmin = userDetails.role === 1 ? true: false; + ctrl.isAdmin = isAdmin; + + if (isAdmin) { + ctrl.formData.Ownership = 'administrators'; + } + + $q.all({ + availableTeams: UserService.userTeams(userDetails.ID), + availableUsers: isAdmin ? UserService.users(false) : [] + }) + .then(function success(data) { + ctrl.availableUsers = data.availableUsers; + + var availableTeams = data.availableTeams; + ctrl.availableTeams = availableTeams; + if (!isAdmin && availableTeams.length === 1) { + ctrl.formData.AuthorizedTeams = availableTeams; + } + + return $q.when(ctrl.resourceControl && ResourceControlService.retrieveOwnershipDetails(ctrl.resourceControl)); + }) + .then(function success(data) { + if (data) { + var authorizedUsers = data.authorizedUsers; + var authorizedTeams = data.authorizedTeams; + setOwnership(ctrl.resourceControl, isAdmin); + setAuthorizedUsersAndTeams(authorizedUsers, authorizedTeams); + } + }) + .catch(function error(err) { + Notifications.error('Failure', err, 'Unable to retrieve access control information'); + }) + .finally(function final() { + $('#loadingViewSpinner').hide(); + }); + } + + initComponent(); +}]); diff --git a/app/directives/accessControlForm/porAccessControlFormModel.js b/app/directives/accessControlForm/porAccessControlFormModel.js new file mode 100644 index 000000000..1e973786f --- /dev/null +++ b/app/directives/accessControlForm/porAccessControlFormModel.js @@ -0,0 +1,6 @@ +function AccessControlFormData() { + this.AccessControlEnabled = true; + this.Ownership = 'private'; + this.AuthorizedUsers = []; + this.AuthorizedTeams = []; +} diff --git a/app/directives/accessControlPanel/por-access-control-panel.js b/app/directives/accessControlPanel/por-access-control-panel.js new file mode 100644 index 000000000..6bde5f128 --- /dev/null +++ b/app/directives/accessControlPanel/por-access-control-panel.js @@ -0,0 +1,12 @@ +angular.module('portainer').component('porAccessControlPanel', { + templateUrl: 'app/directives/accessControlPanel/porAccessControlPanel.html', + controller: 'porAccessControlPanelController', + bindings: { + // The component will display information about this resource control object. + resourceControl: '=', + // This component is usually displayed inside a resource-details view. + // This variable specifies the type of the associated resource. + // Accepted values: 'container', 'service' or 'volume'. + resourceType: '<' + } +}); diff --git a/app/components/common/accessControlPanel/accessControlPanel.html b/app/directives/accessControlPanel/porAccessControlPanel.html similarity index 58% rename from app/components/common/accessControlPanel/accessControlPanel.html rename to app/directives/accessControlPanel/porAccessControlPanel.html index f8031ad27..221b18515 100644 --- a/app/components/common/accessControlPanel/accessControlPanel.html +++ b/app/directives/accessControlPanel/porAccessControlPanel.html @@ -1,5 +1,5 @@ -
-
+
+
@@ -9,63 +9,63 @@ Ownership - - + + public - - {{ resourceControl.Ownership }} - - - + + {{ $ctrl.resourceControl.Ownership }} + + + - + - Access control on this resource is inherited from the following service: {{ resourceControl.ResourceId | truncate }} + Access control on this resource is inherited from the following service: {{ $ctrl.resourceControl.ResourceId | truncate }} - + - Access control on this resource is inherited from the following container: {{ resourceControl.ResourceId | truncate }} + Access control on this resource is inherited from the following container: {{ $ctrl.resourceControl.ResourceId | truncate }} - + Authorized users - {{user.Username}}{{$last ? '' : ', '}} + {{user.Username}}{{$last ? '' : ', '}} - + Authorized teams - {{team.Name}}{{$last ? '' : ', '}} + {{team.Name}}{{$last ? '' : ', '}} - + - Change ownership + Change ownership - +
-
- +
+