launchpad.pug 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. extends ../../../../app/views/layout
  2. block content
  3. script(type="text/javascript").
  4. window.data = {
  5. adminUserExists: !{adminUserExists == true},
  6. ideJsPath: "!{buildJsPath('ide.js')}",
  7. authMethod: "!{authMethod}"
  8. }
  9. script(type="text/javascript" src=(wsUrl || '/socket.io') + '/socket.io.js')
  10. style.
  11. hr { margin-bottom: 5px; }
  12. .status-check {
  13. margin-bottom: 15px;
  14. }
  15. .alert { margin-top: 15px; margin-bottom: 15px; }
  16. a small { cursor: pointer; color: #a93529; }
  17. .launchpad-body img { width: 150px; margin-top: 15px; }
  18. .content.content-alt(ng-controller="LaunchpadController")
  19. .container(ng-cloak)
  20. .row
  21. .col-md-8.col-md-offset-2
  22. .card.launchpad-body
  23. .row
  24. .col-md-12
  25. .text-center
  26. h1 #{translate('welcome_to_sl')}
  27. p
  28. img(src=buildImgPath('/ol-brand/overleaf-o.svg'))
  29. <!-- wrapper -->
  30. .row
  31. .col-md-8.col-md-offset-2
  32. <!-- create first admin form -->
  33. .row(ng-if="shouldShowAdminForm()")
  34. .col-md-12
  35. h2 #{translate('create_first_admin_account')}
  36. // Local Auth Form
  37. div(ng-if="authMethod == 'local'")
  38. form(async-form="register", name="registerForm", on-success="onCreateAdminSuccess"
  39. on-error="onCreateAdminError"
  40. action="/launchpad/register_admin", method="POST", ng-cloak)
  41. input(name='_csrf', type='hidden', value=csrfToken)
  42. form-messages(for="registerForm")
  43. .form-group
  44. label(for='email') #{translate("email")}
  45. input.form-control(
  46. type='email',
  47. name='email',
  48. placeholder="email@example.com"
  49. required,
  50. ng-model="email",
  51. ng-model-options="{ updateOn: 'blur' }",
  52. focus="true"
  53. )
  54. span.small.text-primary(ng-show="registerForm.email.$invalid && registerForm.email.$dirty")
  55. | #{translate("must_be_email_address")}
  56. .form-group
  57. label(for='password') #{translate("password")}
  58. input.form-control#passwordField(
  59. type='password',
  60. name='password',
  61. placeholder="********",
  62. required,
  63. ng-model="password",
  64. complex-password
  65. )
  66. span.small.text-primary(ng-show="registerForm.password.$error.complexPassword",
  67. ng-bind-html="complexPasswordErrorMessage")
  68. .actions
  69. button.btn-primary.btn(
  70. type='submit'
  71. ng-disabled="registerForm.inflight || registerForm.password.$error.required|| registerForm.password.$error.complexPassword || createAdminSuccess"
  72. )
  73. span(ng-show="!registerForm.inflight") #{translate("register")}
  74. span(ng-show="registerForm.inflight") #{translate("registering")}…
  75. // Ldap Form
  76. div(ng-if="authMethod == 'ldap'")
  77. h3 #{translate('ldap')}
  78. p
  79. | #{translate('ldap_create_admin_instructions')}
  80. form(async-form="register", name="registerLdapForm", on-success="onCreateAdminSuccess"
  81. on-error="onCreateAdminError"
  82. action="/launchpad/register_ldap_admin", method="POST", ng-cloak)
  83. input(name='_csrf', type='hidden', value=csrfToken)
  84. form-messages(for="registerLdapForm")
  85. .form-group
  86. label(for='email') #{translate("email")}
  87. input.form-control(
  88. type='email',
  89. name='email',
  90. placeholder="email@example.com"
  91. required,
  92. ng-model="email",
  93. ng-model-options="{ updateOn: 'blur' }",
  94. focus="true"
  95. )
  96. span.small.text-primary(ng-show="registerLdapForm.email.$invalid && registerLdapForm.email.$dirty")
  97. | #{translate("must_be_email_address")}
  98. .actions
  99. button.btn-primary.btn(
  100. type='submit'
  101. ng-disabled="registerLdapForm.inflight || registerLdapForm.password.$error.required|| registerLdapForm.password.$error.complexPassword || createAdminSuccess"
  102. )
  103. span(ng-show="!registerLdapForm.inflight") #{translate("register")}
  104. span(ng-show="registerLdapForm.inflight") #{translate("registering")}…
  105. // Saml Form
  106. div(ng-if="authMethod == 'saml'")
  107. h3 #{translate('saml')}
  108. p
  109. | #{translate('saml_create_admin_instructions')}
  110. form(async-form="register", name="registerSamlForm", on-success="onCreateAdminSuccess"
  111. on-error="onCreateAdminError"
  112. action="/launchpad/register_saml_admin", method="POST", ng-cloak)
  113. input(name='_csrf', type='hidden', value=csrfToken)
  114. form-messages(for="registerSamlForm")
  115. .form-group
  116. label(for='email') #{translate("email")}
  117. input.form-control(
  118. type='email',
  119. name='email',
  120. placeholder="email@example.com"
  121. required,
  122. ng-model="email",
  123. ng-model-options="{ updateOn: 'blur' }",
  124. focus="true"
  125. )
  126. span.small.text-primary(ng-show="registerSamlForm.email.$invalid && registerSamlForm.email.$dirty")
  127. | #{translate("must_be_email_address")}
  128. .actions
  129. button.btn-primary.btn(
  130. type='submit'
  131. ng-disabled="registerSamlForm.inflight || registerSamlForm.password.$error.required|| registerSamlForm.password.$error.complexPassword || createAdminSuccess"
  132. )
  133. span(ng-show="!registerSamlForm.inflight") #{translate("register")}
  134. span(ng-show="registerSamlForm.inflight") #{translate("registering")}…
  135. <!-- success message -->
  136. .row(ng-if="createAdminSuccess")
  137. .col-md-12.text-center
  138. .alert.alert-success
  139. | !{translate('admin_user_created_message', {link: '/login?redir=/launchpad'})}
  140. <!-- error message -->
  141. .row(ng-if="createAdminError")
  142. .col-md-12.text-center
  143. .alert.alert-danger
  144. | #{translate('generic_something_went_wrong')}
  145. br
  146. <!-- status indicators -->
  147. div(ng-if="!shouldShowAdminForm()")
  148. .row
  149. .col-md-12.status-indicators
  150. h2 #{translate('status_checks')}
  151. <!-- ide js -->
  152. .row.status-check
  153. .col-sm-5
  154. | #{translate('editor_resources')}
  155. .col-sm-7
  156. div(ng-switch="statusChecks.ideJs.status")
  157. span(ng-switch-when="inflight")
  158. i.fa.fa-fw.fa-spinner.fa-spin
  159. span &nbsp;#{translate('checking')}
  160. span(ng-switch-when="ok")
  161. i.fa.fa-check
  162. span &nbsp;#{translate('ok')}
  163. a(ng-click="tryFetchIdeJs()")
  164. small &nbsp;#{translate('retry')}
  165. span(ng-switch-when="error")
  166. i.fa.fa-exclamation
  167. span &nbsp;#{translate('error')}
  168. a(ng-click="tryFetchIdeJs()")
  169. small &nbsp;#{translate('retry')}
  170. div.alert.alert-danger
  171. | {{ statusChecks.ideJs.error }}
  172. <!-- websocket -->
  173. .row.status-check
  174. .col-sm-5
  175. | #{translate('websockets')}
  176. .col-sm-7
  177. div(ng-switch="statusChecks.websocket.status")
  178. span(ng-switch-when="inflight")
  179. i.fa.fa-fw.fa-spinner.fa-spin
  180. span &nbsp;#{translate('checking')}
  181. span(ng-switch-when="ok")
  182. i.fa.fa-check
  183. span &nbsp;#{translate('ok')}
  184. a(ng-click="tryOpenWebSocket()")
  185. small &nbsp;#{translate('retry')}
  186. span(ng-switch-when="error")
  187. i.fa.fa-exclamation
  188. span &nbsp;#{translate('error')}
  189. a(ng-click="tryOpenWebSocket()")
  190. small &nbsp;#{translate('retry')}
  191. div.alert.alert-danger
  192. | {{ statusChecks.websocket.error }}
  193. <!-- break -->
  194. hr
  195. <!-- other actions -->
  196. .row
  197. .col-md-12
  198. h2 #{translate('other_actions')}
  199. h3 #{translate('send_test_email')}
  200. form.form
  201. .form-group
  202. label(for="emailInput") Email
  203. input(type="text", name="emailInput" ng-model="testEmail.emailAddress").form-control
  204. button(ng-click="sendTestEmail()", ng-disabled="testEmail.inflight").btn.btn-primary
  205. span(ng-show="!testEmail.inflight") #{translate("send")}
  206. span(ng-show="testEmail.inflight") #{translate("sending")}…
  207. div(ng-if="testEmail.status == 'ok'")
  208. .alert.alert-success
  209. | #{translate('email_sent')}
  210. div(ng-if="testEmail.status == 'error'")
  211. .alert.alert-danger
  212. | #{translate('generic_something_went_wrong')}
  213. <!-- break -->
  214. hr
  215. <!-- Go to app -->
  216. .row
  217. .col-md-12
  218. .text-center
  219. br
  220. p
  221. a(href="/admin").btn.btn-info
  222. | Go To Admin Panel
  223. | &nbsp;
  224. a(href="/project").btn.btn-primary
  225. | Start Using #{settings.appName}
  226. br