launchpad.pug 9.4 KB

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