logo

pleroma-fe

My custom branche(s) on git.pleroma.social/pleroma/pleroma-fe git clone https://anongit.hacktivis.me/git/pleroma-fe.git/

registration.vue (12593B)


  1. <template>
  2. <div class="column-inner">
  3. <TermsOfServicePanel v-if="!hasSignUpNotice && !embeddedToS" />
  4. <div class="settings panel panel-default">
  5. <div class="panel-heading">
  6. <h1 class="title">
  7. {{ $t('registration.registration') }}
  8. </h1>
  9. </div>
  10. <div
  11. v-if="!hasSignUpNotice"
  12. class="panel-body"
  13. >
  14. <form
  15. class="registration-form"
  16. @submit.prevent="submit(user)"
  17. >
  18. <div class="container">
  19. <div class="text-fields">
  20. <div
  21. class="form-group"
  22. :class="{ 'form-group--error': v$.user.username.$error }"
  23. >
  24. <label
  25. class="form--label"
  26. for="sign-up-username"
  27. >{{ $t('login.username') }}</label>
  28. <input
  29. id="sign-up-username"
  30. v-model.trim="v$.user.username.$model"
  31. :disabled="isPending"
  32. class="input form-control"
  33. :aria-required="true"
  34. :placeholder="$t('registration.username_placeholder')"
  35. >
  36. </div>
  37. <div
  38. v-if="v$.user.username.$dirty"
  39. class="form-error"
  40. >
  41. <ul>
  42. <li v-if="!v$.user.username.required">
  43. <span>{{ $t('registration.validations.username_required') }}</span>
  44. </li>
  45. </ul>
  46. </div>
  47. <div
  48. class="form-group"
  49. :class="{ 'form-group--error': v$.user.fullname.$error }"
  50. >
  51. <label
  52. class="form--label"
  53. for="sign-up-fullname"
  54. >{{ $t('registration.fullname') }}</label>
  55. <input
  56. id="sign-up-fullname"
  57. v-model.trim="v$.user.fullname.$model"
  58. :disabled="isPending"
  59. class="input form-control"
  60. :aria-required="true"
  61. :placeholder="$t('registration.fullname_placeholder')"
  62. >
  63. </div>
  64. <div
  65. v-if="v$.user.fullname.$dirty"
  66. class="form-error"
  67. >
  68. <ul>
  69. <li v-if="!v$.user.fullname.required">
  70. <span>{{ $t('registration.validations.fullname_required') }}</span>
  71. </li>
  72. </ul>
  73. </div>
  74. <div
  75. class="form-group"
  76. :class="{ 'form-group--error': v$.user.email.$error }"
  77. >
  78. <label
  79. class="form--label"
  80. for="email"
  81. >{{ accountActivationRequired ? $t('registration.email') : $t('registration.email_optional') }}</label>
  82. <input
  83. id="email"
  84. v-model="v$.user.email.$model"
  85. :disabled="isPending"
  86. class="input form-control"
  87. type="email"
  88. :aria-required="accountActivationRequired"
  89. >
  90. </div>
  91. <div
  92. v-if="v$.user.email.$dirty"
  93. class="form-error"
  94. >
  95. <ul>
  96. <li v-if="!v$.user.email.required">
  97. <span>{{ $t('registration.validations.email_required') }}</span>
  98. </li>
  99. </ul>
  100. </div>
  101. <div class="form-group">
  102. <label
  103. class="form--label"
  104. for="bio"
  105. >{{ $t('registration.bio_optional') }}</label>
  106. <textarea
  107. id="bio"
  108. v-model="user.bio"
  109. :disabled="isPending"
  110. class="input form-control"
  111. :placeholder="bioPlaceholder"
  112. />
  113. </div>
  114. <div
  115. class="form-group"
  116. :class="{ 'form-group--error': v$.user.password.$error }"
  117. >
  118. <label
  119. class="form--label"
  120. for="sign-up-password"
  121. >{{ $t('login.password') }}</label>
  122. <input
  123. id="sign-up-password"
  124. v-model="user.password"
  125. :disabled="isPending"
  126. class="input form-control"
  127. type="password"
  128. :aria-required="true"
  129. >
  130. </div>
  131. <div
  132. v-if="v$.user.password.$dirty"
  133. class="form-error"
  134. >
  135. <ul>
  136. <li v-if="!v$.user.password.required">
  137. <span>{{ $t('registration.validations.password_required') }}</span>
  138. </li>
  139. </ul>
  140. </div>
  141. <div
  142. class="form-group"
  143. :class="{ 'form-group--error': v$.user.confirm.$error }"
  144. >
  145. <label
  146. class="form--label"
  147. for="sign-up-password-confirmation"
  148. >{{ $t('registration.password_confirm') }}</label>
  149. <input
  150. id="sign-up-password-confirmation"
  151. v-model="user.confirm"
  152. :disabled="isPending"
  153. class="input form-control"
  154. type="password"
  155. :aria-required="true"
  156. >
  157. </div>
  158. <div
  159. v-if="v$.user.confirm.$dirty"
  160. class="form-error"
  161. >
  162. <ul>
  163. <li v-if="v$.user.confirm.required.$invalid">
  164. <span>{{ $t('registration.validations.password_confirmation_required') }}</span>
  165. </li>
  166. <li v-if="v$.user.confirm.sameAs.$invalid">
  167. <span>{{ $t('registration.validations.password_confirmation_match') }}</span>
  168. </li>
  169. </ul>
  170. </div>
  171. <div
  172. class="form-group"
  173. :class="{ 'form-group--error': v$.user.birthday.$error }"
  174. >
  175. <label
  176. class="form--label"
  177. for="sign-up-birthday"
  178. >
  179. {{ birthdayRequired ? $t('registration.birthday') : $t('registration.birthday_optional') }}
  180. </label>
  181. <input
  182. id="sign-up-birthday"
  183. v-model="user.birthday"
  184. :disabled="isPending"
  185. class="input form-control"
  186. type="date"
  187. :max="birthdayRequired ? birthdayMinAttr : undefined"
  188. :aria-required="birthdayRequired"
  189. >
  190. </div>
  191. <div
  192. v-if="v$.user.birthday.$dirty"
  193. class="form-error"
  194. >
  195. <ul>
  196. <li v-if="v$.user.birthday.required.$invalid">
  197. <span>{{ $t('registration.validations.birthday_required') }}</span>
  198. </li>
  199. <li v-if="v$.user.birthday.maxValue.$invalid">
  200. <span>{{ $t('registration.validations.birthday_min_age', { date: birthdayMinFormatted }) }}</span>
  201. </li>
  202. </ul>
  203. </div>
  204. <div
  205. class="form-group"
  206. :class="{ 'form-group--error': v$.user.language.$error }"
  207. >
  208. <interface-language-switcher
  209. for="email-language"
  210. :prompt-text="$t('registration.email_language')"
  211. :language="v$.user.language.$model"
  212. :set-language="val => v$.user.language.$model = val"
  213. @click.stop.prevent
  214. />
  215. </div>
  216. <div
  217. v-if="accountApprovalRequired"
  218. class="form-group"
  219. >
  220. <label
  221. class="form--label"
  222. for="reason"
  223. >{{ $t('registration.reason') }}</label>
  224. <textarea
  225. id="reason"
  226. v-model="user.reason"
  227. :disabled="isPending"
  228. class="input form-control"
  229. :placeholder="reasonPlaceholder"
  230. />
  231. </div>
  232. <div
  233. v-if="captcha.type != 'none'"
  234. id="captcha-group"
  235. class="form-group"
  236. >
  237. <label
  238. class="form--label"
  239. for="captcha-label"
  240. >{{ $t('registration.captcha') }}</label>
  241. <template v-if="['kocaptcha', 'native'].includes(captcha.type)">
  242. <img
  243. :src="captcha.url"
  244. @click="setCaptcha"
  245. >
  246. <sub>{{ $t('registration.new_captcha') }}</sub>
  247. <input
  248. id="captcha-answer"
  249. v-model="captcha.solution"
  250. :disabled="isPending"
  251. class="input form-control"
  252. type="text"
  253. autocomplete="off"
  254. autocorrect="off"
  255. autocapitalize="off"
  256. spellcheck="false"
  257. >
  258. </template>
  259. </div>
  260. <div
  261. v-if="token"
  262. class="form-group"
  263. >
  264. <label for="token">{{ $t('registration.token') }}</label>
  265. <input
  266. id="token"
  267. v-model="token"
  268. disabled="true"
  269. class="input form-control"
  270. type="text"
  271. >
  272. </div>
  273. <div class="form-group">
  274. <button
  275. :disabled="isPending"
  276. type="submit"
  277. class="btn button-default"
  278. >
  279. {{ $t('registration.register') }}
  280. </button>
  281. </div>
  282. </div>
  283. <!-- eslint-disable vue/no-v-html -->
  284. <div
  285. v-if="embeddedToS"
  286. class="terms-of-service"
  287. v-html="termsOfService"
  288. />
  289. <!-- eslint-enable vue/no-v-html -->
  290. </div>
  291. <div
  292. v-if="serverValidationErrors.length"
  293. class="form-group"
  294. >
  295. <div class="alert error">
  296. <span
  297. v-for="error in serverValidationErrors"
  298. :key="error"
  299. >{{ error }}</span>
  300. </div>
  301. </div>
  302. </form>
  303. </div>
  304. <div v-else>
  305. <p class="registration-notice">
  306. {{ signUpNotice.message }}
  307. </p>
  308. </div>
  309. </div>
  310. </div>
  311. </template>
  312. <script src="./registration.js"></script>
  313. <style lang="scss">
  314. .registration-form {
  315. display: flex;
  316. flex-direction: column;
  317. margin: 1em;
  318. .container {
  319. display: flex;
  320. flex-direction: row;
  321. > * {
  322. min-width: 0;
  323. }
  324. }
  325. .terms-of-service {
  326. flex: 0 1 50%;
  327. margin: 0.6em 0 0 0.8em;
  328. }
  329. .text-fields {
  330. margin-top: 0.6em;
  331. flex: 1 0;
  332. display: flex;
  333. flex-direction: column;
  334. }
  335. textarea {
  336. min-height: 100px;
  337. resize: vertical;
  338. }
  339. .form-group {
  340. display: flex;
  341. flex-direction: column;
  342. padding: 0.3em 0;
  343. line-height: 2;
  344. margin-bottom: 1em;
  345. }
  346. .form-group--error {
  347. animation-name: shakeError;
  348. animation-duration: 0.6s;
  349. animation-timing-function: ease-in-out;
  350. }
  351. .form-group--error .form--label {
  352. color: var(--cRed);
  353. }
  354. .form-error {
  355. margin-top: -0.7em;
  356. text-align: left;
  357. span {
  358. font-size: 0.85em;
  359. }
  360. }
  361. .form-error ul {
  362. list-style: none;
  363. padding: 0 0 0 5px;
  364. margin-top: 0;
  365. li::before {
  366. content: "• ";
  367. }
  368. }
  369. form textarea {
  370. line-height: 16px;
  371. resize: vertical;
  372. }
  373. .captcha {
  374. max-width: 350px;
  375. margin-bottom: 0.4em;
  376. }
  377. .btn {
  378. margin-top: 0.6em;
  379. height: 2em;
  380. }
  381. .error {
  382. text-align: center;
  383. }
  384. }
  385. .registration-notice {
  386. margin: 0.6em;
  387. }
  388. @media all and (max-width: 800px) {
  389. .registration-form .container {
  390. flex-direction: column-reverse;
  391. .terms-of-service {
  392. margin: 0;
  393. }
  394. }
  395. }
  396. </style>