ShareProjectModalController.coffee 4.9 KB

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