ShareProjectModalController.coffee 5.6 KB

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