ShareProjectModalController.coffee 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. define [
  2. "base"
  3. ], (App) ->
  4. App.controller "ShareProjectModalController", ($scope, $modalInstance, $timeout, projectMembers, projectInvites, $modal, $http) ->
  5. $scope.inputs = {
  6. privileges: "readAndWrite"
  7. contacts: []
  8. }
  9. $scope.state = {
  10. error: null
  11. inflight: false
  12. startedFreeTrial: false
  13. invites: []
  14. }
  15. $modalInstance.opened.then () ->
  16. $timeout () ->
  17. $scope.$broadcast "open"
  18. , 200
  19. INFINITE_COLLABORATORS = -1
  20. $scope.$watch "project.members.length", (noOfMembers) ->
  21. allowedNoOfMembers = $scope.project.features.collaborators
  22. $scope.canAddCollaborators = noOfMembers < allowedNoOfMembers or allowedNoOfMembers == INFINITE_COLLABORATORS
  23. $scope.autocompleteContacts = []
  24. do loadAutocompleteUsers = () ->
  25. $http.get "/user/contacts"
  26. .success (data) ->
  27. $scope.autocompleteContacts = data.contacts or []
  28. for contact in $scope.autocompleteContacts
  29. if contact.type == "user"
  30. if contact.last_name == "" and contact.first_name = contact.email.split("@")[0]
  31. # User has not set their proper name so use email as canonical display property
  32. contact.display = contact.email
  33. else
  34. contact.name = "#{contact.first_name} #{contact.last_name}"
  35. contact.display = "#{contact.name} <#{contact.email}>"
  36. else
  37. # Must be a group
  38. contact.display = contact.name
  39. getCurrentMemberEmails = () ->
  40. $scope.project.members.map (u) -> u.email
  41. $scope.filterAutocompleteUsers = ($query) ->
  42. currentMemberEmails = getCurrentMemberEmails()
  43. return $scope.autocompleteContacts.filter (contact) ->
  44. if contact.email? and contact.email in currentMemberEmails
  45. return false
  46. for text in [contact.name, contact.email]
  47. if text?.toLowerCase().indexOf($query.toLowerCase()) > -1
  48. return true
  49. return false
  50. $scope.addMembers = () ->
  51. addMembers = () ->
  52. return if $scope.inputs.contacts.length == 0
  53. members = $scope.inputs.contacts
  54. $scope.inputs.contacts = []
  55. $scope.state.error = null
  56. $scope.state.inflight = true
  57. currentMemberEmails = getCurrentMemberEmails()
  58. do addNextMember = () ->
  59. if members.length == 0 or !$scope.canAddCollaborators
  60. $scope.state.inflight = false
  61. $scope.$apply()
  62. return
  63. member = members.shift()
  64. if !member.type? and member.display in currentMemberEmails
  65. # Skip this existing member
  66. return addNextMember()
  67. # NOTE: groups aren't really a thing in ShareLaTeX, partially inherited from DJ
  68. if member.type == "user"
  69. request = projectInvites.sendInvite(member.email, $scope.inputs.privileges)
  70. else if member.type == "group"
  71. request = projectMembers.addGroup(member.id, $scope.inputs.privileges)
  72. else # Not an auto-complete object, so email == display
  73. request = projectInvites.sendInvite(member.display, $scope.inputs.privileges)
  74. request
  75. .success (data) ->
  76. if data.invite
  77. invite = data.invite
  78. $scope.project.invites.push invite
  79. else
  80. if data.users?
  81. users = data.users
  82. else if data.user?
  83. users = [data.user]
  84. else
  85. users = []
  86. $scope.project.members.push users...
  87. setTimeout () ->
  88. # Give $scope a chance to update $scope.canAddCollaborators
  89. # with new collaborator information.
  90. addNextMember()
  91. , 0
  92. .error () ->
  93. $scope.state.inflight = false
  94. $scope.state.error = true
  95. $timeout addMembers, 50 # Give email list a chance to update
  96. $scope.removeMember = (member) ->
  97. $scope.state.error = null
  98. $scope.state.inflight = true
  99. projectMembers
  100. .removeMember(member)
  101. .success () ->
  102. $scope.state.inflight = false
  103. index = $scope.project.members.indexOf(member)
  104. return if index == -1
  105. $scope.project.members.splice(index, 1)
  106. .error () ->
  107. $scope.state.inflight = false
  108. $scope.state.error = "Sorry, something went wrong :("
  109. $scope.revokeInvite = (invite) ->
  110. $scope.state.error = null
  111. $scope.state.inflight = true
  112. projectInvites
  113. .revokeInvite(invite._id)
  114. .success () ->
  115. $scope.state.inflight = false
  116. index = $scope.project.invites.indexOf(invite)
  117. return if index == -1
  118. $scope.project.invites.splice(index, 1)
  119. .error () ->
  120. $scope.state.inflight = false
  121. $scope.state.error = "Sorry, something went wrong :("
  122. $scope.resendInvite = (invite) ->
  123. $scope.state.error = null
  124. $scope.state.inflight = true
  125. projectInvites
  126. .resendInvite(invite._id)
  127. .success () ->
  128. $scope.state.inflight = false
  129. .error () ->
  130. $scope.state.inflight = false
  131. $scope.state.error = "Sorry, something went wrong resending the invite :("
  132. $scope.openMakePublicModal = () ->
  133. $modal.open {
  134. templateUrl: "makePublicModalTemplate"
  135. controller: "MakePublicModalController"
  136. scope: $scope
  137. }
  138. $scope.openMakePrivateModal = () ->
  139. $modal.open {
  140. templateUrl: "makePrivateModalTemplate"
  141. controller: "MakePrivateModalController"
  142. scope: $scope
  143. }
  144. $scope.done = () ->
  145. $modalInstance.close()
  146. $scope.cancel = () ->
  147. $modalInstance.dismiss()
  148. App.controller "MakePublicModalController", ["$scope", "$modalInstance", "settings", ($scope, $modalInstance, settings) ->
  149. $scope.inputs = {
  150. privileges: "readAndWrite"
  151. }
  152. $scope.makePublic = () ->
  153. $scope.project.publicAccesLevel = $scope.inputs.privileges
  154. settings.saveProjectAdminSettings({publicAccessLevel: $scope.inputs.privileges})
  155. $modalInstance.close()
  156. $scope.cancel = () ->
  157. $modalInstance.dismiss()
  158. ]
  159. App.controller "MakePrivateModalController", ["$scope", "$modalInstance", "settings", ($scope, $modalInstance, settings) ->
  160. $scope.makePrivate = () ->
  161. $scope.project.publicAccesLevel = "private"
  162. settings.saveProjectAdminSettings({publicAccessLevel: "private"})
  163. $modalInstance.close()
  164. $scope.cancel = () ->
  165. $modalInstance.dismiss()
  166. ]