share.pug 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. script(type='text/ng-template', id='shareProjectModalTemplate')
  2. .modal-header
  3. button.close(
  4. type="button"
  5. data-dismiss="modal"
  6. ng-click="cancel()"
  7. aria-label="Close"
  8. )
  9. span(aria-hidden="true") ×
  10. h3 #{translate("share_project")}
  11. .modal-body.modal-body-share
  12. .container-fluid
  13. if isRestrictedTokenMember
  14. //- Token-based access
  15. .row.public-access-level
  16. .col-xs-12.access-token-display-area
  17. div.access-token-wrapper
  18. strong #{translate('anyone_with_link_can_view')}
  19. pre.access-token {{ readOnlyTokenLink }}
  20. if !isRestrictedTokenMember
  21. //- Private (with token-access available)
  22. .row.public-access-level(ng-show="isAdmin && project.publicAccesLevel == 'private'")
  23. .col-xs-12.text-center
  24. | #{translate('link_sharing_is_off')}
  25. |   
  26. a(
  27. href
  28. ng-click="makeTokenBased()"
  29. ) #{translate('turn_on_link_sharing')}
  30. span   
  31. a(
  32. href="/learn/how-to/What_is_Link_Sharing%3F"
  33. target="_blank"
  34. )
  35. i.fa.fa-question-circle(
  36. tooltip=translate('learn_more_about_link_sharing')
  37. )
  38. //- Token-based access
  39. .row.public-access-level(ng-show="isAdmin && project.publicAccesLevel == 'tokenBased'")
  40. .col-xs-12.text-center
  41. strong
  42. | #{translate('link_sharing_is_on')}.
  43. |   
  44. a(
  45. href
  46. ng-click="makePrivate()"
  47. ) #{translate('turn_off_link_sharing')}
  48. span   
  49. a(
  50. href="/learn/how-to/What_is_Link_Sharing%3F"
  51. target="_blank"
  52. )
  53. i.fa.fa-question-circle(
  54. tooltip=translate('learn_more_about_link_sharing')
  55. )
  56. .col-xs-12.access-token-display-area
  57. div.access-token-wrapper
  58. strong #{translate('anyone_with_link_can_edit')}
  59. pre.access-token(ng-show="readAndWriteTokenLink") {{ readAndWriteTokenLink }}
  60. pre.access-token(ng-hide="readAndWriteTokenLink") #{translate('loading')}…
  61. div.access-token-wrapper
  62. strong #{translate('anyone_with_link_can_view')}
  63. pre.access-token(ng-show="readOnlyTokenLink") {{ readOnlyTokenLink }}
  64. pre.access-token(ng-hide="readOnlyTokenLink") #{translate('loading')}…
  65. //- legacy public-access
  66. .row.public-access-level(ng-show="isAdmin && (project.publicAccesLevel == 'readAndWrite' || project.publicAccesLevel == 'readOnly')")
  67. .col-xs-12.text-center
  68. strong(ng-if="project.publicAccesLevel == 'readAndWrite'") #{translate("this_project_is_public")}
  69. strong(ng-if="project.publicAccesLevel == 'readOnly'") #{translate("this_project_is_public_read_only")}
  70. |   
  71. a(
  72. href
  73. ng-click="makePrivate()"
  74. ) #{translate("make_private")}
  75. .row.project-member
  76. .col-xs-7 {{ project.owner.email }}
  77. .text-left.col-xs-3 #{translate("owner")}
  78. form.form-horizontal(
  79. ng-if="isAdmin"
  80. ng-repeat="member in project.members"
  81. ng-controller="ShareProjectModalMemberRowController"
  82. )
  83. .row.form-group.project-member
  84. .col-xs-7.form-control-static {{ member.email }}
  85. .col-xs-3
  86. select.privileges.form-control.input-sm(name="privileges" ng-model="form.privileges")
  87. option(value="owner") #{translate("owner")}
  88. option(value="readAndWrite") #{translate("can_edit")}
  89. option(value="readOnly") #{translate("read_only")}
  90. .col-xs-2.form-control-static.text-center(ng-hide="form.isModified()")
  91. a(
  92. href
  93. tooltip=translate('remove_collaborator')
  94. tooltip-placement="bottom"
  95. ng-click="removeMember(member)"
  96. aria-label=translate('remove_collaborator')
  97. )
  98. i.fa.fa-times
  99. .col-xs-2.text-center(ng-show="form.isModified()")
  100. button.btn.btn-sm.btn-success(
  101. type="submit"
  102. ng-click="form.submit()"
  103. ) #{translate("change")}
  104. .text-sm
  105. | #{translate("or")}
  106. |
  107. button.btn.btn-inline-link(ng-click="form.reset()") #{translate("cancel").toLowerCase()}
  108. .row.project-member(ng-if="!isAdmin" ng-repeat="member in project.members")
  109. .col-xs-7 {{ member.email }}
  110. .col-xs-3
  111. span(ng-if="member.privileges == 'readAndWrite'") #{translate("can_edit")}
  112. span(ng-if="member.privileges == 'readOnly'") #{translate("read_only")}
  113. .row.project-invite(ng-repeat="invite in project.invites")
  114. .col-xs-7 {{ invite.email }} 
  115. div.small
  116. | #{translate("invite_not_accepted")}. 
  117. button.btn.btn-inline-link(
  118. ng-show="isAdmin",
  119. ng-click="resendInvite(invite, $event)"
  120. ) #{translate("resend")}
  121. .col-xs-3.text-left
  122. // todo: get invite privileges
  123. span(ng-show="invite.privileges == 'readAndWrite'") #{translate("can_edit")}
  124. span(ng-show="invite.privileges == 'readOnly'") #{translate("read_only")}
  125. .col-xs-2.text-center(ng-if="isAdmin")
  126. a(
  127. href
  128. tooltip=translate('revoke_invite')
  129. tooltip-placement="bottom"
  130. ng-click="revokeInvite(invite)"
  131. )
  132. i.fa.fa-times
  133. .row.invite-controls(ng-show="isAdmin")
  134. form(ng-show="canAddCollaborators")
  135. .small #{translate("share_with_your_collabs")}
  136. .form-group
  137. tags-input(
  138. template="shareTagTemplate"
  139. placeholder=settings.customisation.shareProjectPlaceholder || 'joe@example.com, sue@example.com, …'
  140. ng-model="inputs.contacts"
  141. focus-on="open"
  142. display-property="display"
  143. add-on-paste="true"
  144. add-on-enter="false"
  145. replace-spaces-with-dashes="false"
  146. type="email"
  147. )
  148. auto-complete(
  149. source="filterAutocompleteUsers($query)"
  150. template="shareAutocompleteTemplate"
  151. display-property="email"
  152. min-length="0"
  153. )
  154. .form-group
  155. .pull-right
  156. select.privileges.form-control(
  157. ng-model="inputs.privileges"
  158. name="privileges"
  159. )
  160. option(value="readAndWrite") #{translate("can_edit")}
  161. option(value="readOnly") #{translate("read_only")}
  162. |   
  163. //- We have to use mousedown here since click has issues with the
  164. //- blur handler in tags-input sometimes changing its height and
  165. //- moving this button, preventing the click registering.
  166. button.btn.btn-info(
  167. type="submit"
  168. ng-mousedown="addMembers()"
  169. ng-keyup="$event.keyCode == 13 ? addMembers() : null"
  170. ) #{translate("share")}
  171. div(ng-hide="canAddCollaborators")
  172. p.text-center #{translate("need_to_upgrade_for_more_collabs")}. Also:
  173. .row
  174. .col-md-8.col-md-offset-2
  175. ul.list-unstyled
  176. li
  177. i.fa.fa-check  
  178. | #{translate("unlimited_projects")}
  179. li
  180. i.fa.fa-check  
  181. | #{translate("collabs_per_proj", {collabcount:'Multiple'})}
  182. li
  183. i.fa.fa-check  
  184. | #{translate("full_doc_history")}
  185. li
  186. i.fa.fa-check  
  187. | #{translate("sync_to_dropbox")}
  188. li
  189. i.fa.fa-check  
  190. | #{translate("sync_to_github")}
  191. li
  192. i.fa.fa-check  
  193. |#{translate("compile_larger_projects")}
  194. p.text-center.row-spaced-thin(ng-controller="FreeTrialModalController")
  195. a.btn.btn-success(
  196. href
  197. ng-class="buttonClass"
  198. ng-click="startFreeTrial('projectMembers')"
  199. ) #{translate("start_free_trial")}
  200. p.small(ng-show="startedFreeTrial")
  201. | #{translate("refresh_page_after_starting_free_trial")}
  202. .row.public-access-level.public-access-level--notice(ng-show="!isAdmin")
  203. .col-xs-12.text-center(ng-show="project.publicAccesLevel == 'private'") #{translate("to_add_more_collaborators")}
  204. .col-xs-12.text-center(ng-show="project.publicAccesLevel == 'tokenBased'") #{translate("to_change_access_permissions")}
  205. .modal-footer.modal-footer-share
  206. .modal-footer-left
  207. i.fa.fa-refresh.fa-spin(ng-show="state.inflight")
  208. span.text-danger.error(ng-show="state.error")
  209. span(ng-switch="state.errorReason")
  210. span(ng-switch-when="cannot_invite_non_user")
  211. | #{translate("cannot_invite_non_user")}
  212. span(ng-switch-when="cannot_verify_user_not_robot")
  213. | #{translate("cannot_verify_user_not_robot")}
  214. span(ng-switch-when="cannot_invite_self")
  215. | #{translate("cannot_invite_self")}
  216. span(ng-switch-when="invalid_email")
  217. | #{translate("invalid_email")}
  218. span(ng-switch-default)
  219. | #{translate("generic_something_went_wrong")}
  220. .modal-footer-right
  221. button.btn.btn-default(
  222. ng-click="done()"
  223. ) #{translate("close")}
  224. script(type="text/ng-template", id="shareTagTemplate")
  225. .tag-template
  226. span(ng-if="data.type")
  227. i.fa.fa-fw(ng-class="{'fa-user': data.type != 'group', 'fa-group': data.type == 'group'}")
  228. |
  229. span {{$getDisplayText()}}
  230. |
  231. a(href, ng-click="$removeTag()").remove-button
  232. i.fa.fa-fw.fa-close
  233. script(type="text/ng-template", id="shareAutocompleteTemplate")
  234. .autocomplete-template
  235. div(ng-if="data.type == 'user'")
  236. i.fa.fa-fw.fa-user
  237. |
  238. span(ng-bind-html="$highlight(data.display)")
  239. div(ng-if="data.type == 'group'")
  240. i.fa.fa-fw.fa-group
  241. |
  242. span(ng-bind-html="$highlight(data.name)")
  243. span.subdued.small(ng-show="data.member_count") ({{ data.member_count }} members)
  244. script(type="text/ng-template", id="ownershipTransferConfirmTemplate")
  245. .modal-header
  246. button.close(
  247. type="button"
  248. data-dismiss="modal"
  249. ng-click="cancel()"
  250. aria-label="Close"
  251. )
  252. span(aria-hidden="true") ×
  253. h3 #{translate("change_project_owner")}
  254. .modal-body
  255. p !{translate('project_ownership_transfer_confirmation_1', { user: '<strong>{{ member.email }}</strong>', project: '<strong>{{ project.name }}</strong>' })}
  256. p #{translate('project_ownership_transfer_confirmation_2')}
  257. .modal-footer
  258. .modal-footer-left
  259. i.fa.fa-refresh.fa-spin(ng-show="state.inflight")
  260. span.text-danger.error(ng-show="state.error") #{translate("generic_something_went_wrong")}
  261. .modal-footer-right
  262. button.btn.btn-default(ng-click="cancel()") #{translate("cancel")}
  263. button.btn.btn-success(ng-click="confirm()") #{translate("change_owner")}