diff --git a/services/web/app/views/project/editor/share.pug b/services/web/app/views/project/editor/share.pug
index 07015ab545..4fa4ea0faf 100644
--- a/services/web/app/views/project/editor/share.pug
+++ b/services/web/app/views/project/editor/share.pug
@@ -88,6 +88,7 @@ script(type='text/ng-template', id='shareProjectModalTemplate')
.col-xs-7.form-control-static {{ member.email }}
.col-xs-3
select.privileges.form-control.input-sm(name="privileges" ng-model="form.privileges")
+ option(value="owner") #{translate("owner")}
option(value="readAndWrite") #{translate("can_edit")}
option(value="readOnly") #{translate("read_only")}
.col-xs-2.form-control-static.text-center(ng-hide="form.isModified()")
@@ -254,3 +255,22 @@ script(type="text/ng-template", id="shareAutocompleteTemplate")
|
span(ng-bind-html="$highlight(data.name)")
span.subdued.small(ng-show="data.member_count") ({{ data.member_count }} members)
+
+script(type="text/ng-template", id="ownershipTransferConfirmTemplate")
+ .modal-header
+ button.close(
+ type="button"
+ data-dismiss="modal"
+ ng-click="cancel()"
+ ) ×
+ h3 #{translate("change_project_owner")}
+ .modal-body
+ p !{translate('project_ownership_transfer_confirmation_1', { user: '{{ member.email }}', project: '{{ project.name }}' })}
+ p #{translate('project_ownership_transfer_confirmation_2')}
+ .modal-footer
+ .modal-footer-left
+ i.fa.fa-refresh.fa-spin(ng-show="state.inflight")
+ span.text-danger.error(ng-show="state.error") #{translate("generic_something_went_wrong")}
+ .modal-footer-right
+ button.btn.btn-default(ng-click="cancel()") #{translate("cancel")}
+ button.btn.btn-success(ng-click="confirm()") #{translate("change_owner")}
diff --git a/services/web/public/src/ide/share/controllers/OwnershipTransferConfirmModalController.js b/services/web/public/src/ide/share/controllers/OwnershipTransferConfirmModalController.js
new file mode 100644
index 0000000000..64bd64fff3
--- /dev/null
+++ b/services/web/public/src/ide/share/controllers/OwnershipTransferConfirmModalController.js
@@ -0,0 +1,38 @@
+define(['base'], App => {
+ App.controller('OwnershipTransferConfirmModalController', function(
+ $scope,
+ $window,
+ $modalInstance,
+ projectMembers
+ ) {
+ $scope.state = {
+ inflight: false,
+ error: false
+ }
+
+ $scope.confirm = function() {
+ const userId = $scope.member._id
+ transferOwnership(userId)
+ }
+
+ $scope.cancel = function() {
+ $modalInstance.dismiss()
+ }
+
+ function transferOwnership(userId) {
+ $scope.state.inflight = true
+ $scope.state.error = false
+ projectMembers
+ .transferOwnership(userId)
+ .then(() => {
+ $scope.state.inflight = false
+ $scope.state.error = false
+ $window.location.reload()
+ })
+ .catch(() => {
+ $scope.state.inflight = false
+ $scope.state.error = true
+ })
+ }
+ })
+})
diff --git a/services/web/public/src/ide/share/controllers/ShareProjectModalMemberRowController.js b/services/web/public/src/ide/share/controllers/ShareProjectModalMemberRowController.js
index 2ff05c281a..89d3177a0e 100644
--- a/services/web/public/src/ide/share/controllers/ShareProjectModalMemberRowController.js
+++ b/services/web/public/src/ide/share/controllers/ShareProjectModalMemberRowController.js
@@ -1,6 +1,7 @@
define(['base'], App => {
App.controller('ShareProjectModalMemberRowController', function(
$scope,
+ $modal,
projectMembers
) {
$scope.form = {
@@ -13,13 +14,11 @@ define(['base'], App => {
submit() {
const userId = $scope.member._id
const privilegeLevel = $scope.form.privileges
- $scope.monitorRequest(
- projectMembers
- .setMemberPrivilegeLevel(userId, privilegeLevel)
- .then(() => {
- $scope.member.privileges = privilegeLevel
- })
- )
+ if (privilegeLevel === 'owner') {
+ openOwnershipTransferConfirmModal(userId)
+ } else {
+ setPrivilegeLevel(userId, privilegeLevel)
+ }
},
reset() {
@@ -27,5 +26,23 @@ define(['base'], App => {
$scope.clearError()
}
}
+
+ function setPrivilegeLevel(userId, privilegeLevel) {
+ $scope.monitorRequest(
+ projectMembers
+ .setMemberPrivilegeLevel(userId, privilegeLevel)
+ .then(() => {
+ $scope.member.privileges = privilegeLevel
+ })
+ )
+ }
+
+ function openOwnershipTransferConfirmModal(userId) {
+ $modal.open({
+ templateUrl: 'ownershipTransferConfirmTemplate',
+ controller: 'OwnershipTransferConfirmModalController',
+ scope: $scope
+ })
+ }
})
})
diff --git a/services/web/public/src/ide/share/index.js b/services/web/public/src/ide/share/index.js
index 6b81b75ec7..cbc5859690 100644
--- a/services/web/public/src/ide/share/index.js
+++ b/services/web/public/src/ide/share/index.js
@@ -2,6 +2,7 @@ define([
'ide/share/controllers/ShareController',
'ide/share/controllers/ShareProjectModalController',
'ide/share/controllers/ShareProjectModalMemberRowController',
+ 'ide/share/controllers/OwnershipTransferConfirmModalController',
'ide/share/services/projectMembers',
'ide/share/services/projectInvites'
], function() {})
diff --git a/services/web/public/src/ide/share/services/projectMembers.js b/services/web/public/src/ide/share/services/projectMembers.js
index 4542107219..b5b4b7bf97 100644
--- a/services/web/public/src/ide/share/services/projectMembers.js
+++ b/services/web/public/src/ide/share/services/projectMembers.js
@@ -1,4 +1,4 @@
-define(['base'], App =>
+define(['base'], App => {
App.factory('projectMembers', (ide, $http) => ({
removeMember(member) {
return $http({
@@ -37,5 +37,13 @@ define(['base'], App =>
}
}
)
+ },
+
+ transferOwnership(userId) {
+ return $http.post(`/project/${ide.project_id}/transfer-ownership`, {
+ user_id: userId,
+ _csrf: window.csrfToken
+ })
}
- })))
+ }))
+})