launchpad.pug 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. extends ../../../../app/views/layout-marketing
  2. include ../../../../app/views/_mixins/material_symbol
  3. include ../../../../app/views/_mixins/notification
  4. mixin launchpad-check(section)
  5. div(data-ol-launchpad-check=section)
  6. span(
  7. data-ol-inflight='pending'
  8. style='display: inline-flex; align-items: center'
  9. )
  10. +material-symbol('sync')
  11. span  #{translate('checking')}
  12. span(hidden data-ol-inflight='idle')
  13. div(
  14. data-ol-result='success'
  15. style='display: inline-flex; align-items: center'
  16. )
  17. +material-symbol('check')
  18. span  #{translate('ok')}
  19. button.btn.btn-inline-link
  20. span.text-danger  #{translate('retry')}
  21. div(hidden data-ol-result='error')
  22. span(style='display: inline-flex; align-items: center')
  23. +material-symbol('warning')
  24. span  #{translate('error')}
  25. button.btn.btn-inline-link
  26. span.text-danger  #{translate('retry')}
  27. +notification({ariaLive: 'assertive', type: 'error', content: '<span data-ol-error></span>'})
  28. block entrypointVar
  29. - entrypoint = 'modules/launchpad/pages/launchpad'
  30. block vars
  31. - metadata = metadata || {}
  32. block append meta
  33. meta(name='ol-adminUserExists' data-type='boolean' content=adminUserExists)
  34. meta(name='ol-ideJsPath' content=buildJsPath('ide.js'))
  35. block content
  36. script(
  37. type='text/javascript'
  38. nonce=scriptNonce
  39. src=(wsUrl || '/socket.io') + '/socket.io.js'
  40. )
  41. #main-content.content.content-alt
  42. .container
  43. .row
  44. .col-lg-8.offset-lg-2
  45. .card
  46. .card-body
  47. .row
  48. .col-lg-12
  49. .text-center
  50. h1 #{translate('welcome_to_sl')}
  51. p
  52. img(src=buildImgPath('/ol-brand/overleaf-o.svg'))
  53. <!-- wrapper -->
  54. .row
  55. .col-lg-8.offset-lg-2
  56. <!-- create first admin form -->
  57. if !adminUserExists
  58. .row(data-ol-not-sent)
  59. .col-lg-12
  60. h2 #{translate('create_first_admin_account')}
  61. // Local Auth Form
  62. if authMethod === 'local'
  63. form(
  64. data-ol-async-form
  65. data-ol-register-admin
  66. action='/launchpad/register_admin'
  67. method='POST'
  68. )
  69. input(name='_csrf' type='hidden' value=csrfToken)
  70. +formMessages
  71. .form-group
  72. label.form-label(for='email') #{translate("email")}
  73. input.form-control(
  74. name='email'
  75. type='email'
  76. id='email'
  77. autocomplete='username'
  78. required
  79. autofocus='true'
  80. )
  81. .form-group
  82. label.form-label(for='passwordField') #{translate("password")}
  83. input#passwordField.form-control(
  84. name='password'
  85. type='password'
  86. autocomplete='new-password'
  87. required
  88. )
  89. .actions
  90. button.btn-primary.btn(type='submit' data-ol-disabled-inflight)
  91. span(data-ol-inflight='idle') #{translate("register")}
  92. span(hidden data-ol-inflight='pending') #{translate("registering")}…
  93. // Ldap Form
  94. if authMethod === 'ldap'
  95. h3 #{translate('ldap')}
  96. p
  97. | #{translate('ldap_create_admin_instructions')}
  98. form(
  99. data-ol-async-form
  100. data-ol-register-admin
  101. action='/launchpad/register_ldap_admin'
  102. method='POST'
  103. )
  104. input(name='_csrf' type='hidden' value=csrfToken)
  105. +formMessages
  106. .form-group
  107. label.form-label(for='email') #{translate("email")}
  108. input.form-control(
  109. name='email'
  110. id='email'
  111. type='email'
  112. autocomplete='username'
  113. required
  114. autofocus='true'
  115. )
  116. .actions
  117. button.btn-primary.btn(type='submit' data-ol-disabled-inflight)
  118. span(data-ol-inflight='idle') #{translate("register")}
  119. span(hidden data-ol-inflight='pending') #{translate("registering")}…
  120. // Saml Form
  121. if authMethod === 'saml'
  122. h3 #{translate('saml')}
  123. p
  124. | #{translate('saml_create_admin_instructions')}
  125. form(
  126. data-ol-async-form
  127. data-ol-register-admin
  128. action='/launchpad/register_saml_admin'
  129. method='POST'
  130. )
  131. input(name='_csrf' type='hidden' value=csrfToken)
  132. +formMessages
  133. .form-group
  134. label.form-label(for='email') #{translate("email")}
  135. input.form-control(
  136. name='email'
  137. type='email'
  138. id='email'
  139. autocomplete='username'
  140. required
  141. autofocus='true'
  142. )
  143. .actions
  144. button.btn-primary.btn(type='submit' data-ol-disabled-inflight)
  145. span(data-ol-inflight='idle') #{translate("register")}
  146. span(hidden data-ol-inflight='pending') #{translate("registering")}…
  147. br
  148. <!-- status indicators -->
  149. if adminUserExists
  150. .row
  151. .col-lg-12.status-indicators
  152. h2 #{translate('status_checks')}
  153. <!-- websocket -->
  154. .row.row-spaced-small
  155. .col-sm-5
  156. | #{translate('websockets')}
  157. .col-sm-7
  158. +launchpad-check('websocket')
  159. <!-- break -->
  160. hr.thin
  161. <!-- other actions -->
  162. .row
  163. .col-lg-12
  164. h2 #{translate('other_actions')}
  165. h3 #{translate('send_test_email')}
  166. form.form(
  167. data-ol-async-form
  168. action='/launchpad/send_test_email'
  169. method='POST'
  170. )
  171. .form-group
  172. label.form-label(for='email') Email
  173. input.form-control(name='email' type='text' id='email' required)
  174. button.btn-primary.btn(type='submit' data-ol-disabled-inflight)
  175. span(data-ol-inflight='idle') #{translate("send")}
  176. span(hidden data-ol-inflight='pending') #{translate("sending")}…
  177. p
  178. +formMessages
  179. <!-- break -->
  180. hr.thin
  181. <!-- Go to app -->
  182. .row
  183. .col-lg-12
  184. .text-center
  185. br
  186. p
  187. a.btn.btn-secondary(href='/admin')
  188. | Go To Admin Panel
  189. | &nbsp;
  190. a.btn.btn-primary(href='/project')
  191. | Start Using #{settings.appName}
  192. br