ShareProjectModalController.coffee 6.5 KB

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