mirror of
https://github.com/overleaf/overleaf.git
synced 2024-10-31 21:21:03 -04:00
5bfb1b8781
Fix UX on Duplicate Group Invites GitOrigin-RevId: e51c406d578b130972024065f9b8bdb2503944a9
126 lines
4 KiB
JavaScript
126 lines
4 KiB
JavaScript
import _ from 'lodash'
|
|
/* eslint-disable
|
|
max-len,
|
|
no-return-assign,
|
|
*/
|
|
// TODO: This file was created by bulk-decaffeinate.
|
|
// Fix any style issues and re-enable lint.
|
|
/*
|
|
* decaffeinate suggestions:
|
|
* DS101: Remove unnecessary use of Array.from
|
|
* DS102: Remove unnecessary code created because of implicit returns
|
|
* DS207: Consider shorter variations of null checks
|
|
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
|
*/
|
|
import App from '../base'
|
|
App.controller('UserMembershipController', function ($scope, queuedHttp) {
|
|
$scope.users = window.users
|
|
$scope.groupSize = window.groupSize
|
|
$scope.paths = window.paths
|
|
$scope.selectedUsers = []
|
|
|
|
$scope.inputs = {
|
|
addMembers: {
|
|
content: '',
|
|
error: false,
|
|
errorMessage: null,
|
|
inflightCount: 0,
|
|
},
|
|
removeMembers: {
|
|
error: false,
|
|
errorMessage: null,
|
|
},
|
|
}
|
|
|
|
const parseEmails = function (emailsString) {
|
|
const regexBySpaceOrComma = /[\s,]+/
|
|
let emails = emailsString.split(regexBySpaceOrComma)
|
|
emails = _.map(emails, email => (email = email.trim()))
|
|
emails = _.filter(emails, email => email.indexOf('@') !== -1)
|
|
return emails
|
|
}
|
|
|
|
$scope.addMembers = function () {
|
|
$scope.inputs.addMembers.error = false
|
|
$scope.inputs.addMembers.errorMessage = null
|
|
$scope.inputs.addMembers.inflightCount = 0
|
|
const emails = parseEmails($scope.inputs.addMembers.content)
|
|
return Array.from(emails).map(email => {
|
|
$scope.inputs.addMembers.inflightCount += 1
|
|
return queuedHttp
|
|
.post(window.paths.addMember, {
|
|
email,
|
|
_csrf: window.csrfToken,
|
|
})
|
|
.then(function (response) {
|
|
$scope.inputs.addMembers.inflightCount -= 1
|
|
const { data } = response
|
|
if (data.user != null) {
|
|
const alreadyListed = $scope.users.find(
|
|
scopeUser => scopeUser.email === data.user.email
|
|
)
|
|
if (!alreadyListed) {
|
|
$scope.users.push(data.user)
|
|
}
|
|
}
|
|
return ($scope.inputs.addMembers.content = '')
|
|
})
|
|
.catch(function (response) {
|
|
$scope.inputs.addMembers.inflightCount -= 1
|
|
const { data } = response
|
|
$scope.inputs.addMembers.error = true
|
|
return ($scope.inputs.addMembers.errorMessage =
|
|
data.error != null ? data.error.message : undefined)
|
|
})
|
|
})
|
|
}
|
|
|
|
$scope.removeMembers = function () {
|
|
$scope.inputs.removeMembers.error = false
|
|
$scope.inputs.removeMembers.errorMessage = null
|
|
for (const user of Array.from($scope.selectedUsers)) {
|
|
;(function (user) {
|
|
let url
|
|
if (window.paths.removeInvite && user.invite && user._id == null) {
|
|
url = `${window.paths.removeInvite}/${encodeURIComponent(user.email)}`
|
|
} else if (window.paths.removeMember && user._id != null) {
|
|
url = `${window.paths.removeMember}/${user._id}`
|
|
} else {
|
|
return
|
|
}
|
|
return queuedHttp({
|
|
method: 'DELETE',
|
|
url,
|
|
headers: {
|
|
'X-Csrf-Token': window.csrfToken,
|
|
},
|
|
})
|
|
.then(function () {
|
|
const index = $scope.users.indexOf(user)
|
|
if (index === -1) {
|
|
return
|
|
}
|
|
return $scope.users.splice(index, 1)
|
|
})
|
|
.catch(function (response) {
|
|
const { data } = response
|
|
$scope.inputs.removeMembers.error = true
|
|
return ($scope.inputs.removeMembers.errorMessage =
|
|
data.error != null ? data.error.message : undefined)
|
|
})
|
|
})(user)
|
|
}
|
|
return $scope.updateSelectedUsers
|
|
}
|
|
|
|
return ($scope.updateSelectedUsers = () =>
|
|
($scope.selectedUsers = $scope.users.filter(user => user.selected)))
|
|
})
|
|
|
|
export default App.controller('UserMembershipListItemController', $scope =>
|
|
$scope.$watch('user.selected', function (value) {
|
|
if (value != null) {
|
|
return $scope.updateSelectedUsers()
|
|
}
|
|
})
|
|
)
|