ForgotPasswordPage.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <template>
  2. <q-page class="login-page column items-center justify-center">
  3. <div class="login-overlay" />
  4. <div class="login-card column items-center">
  5. <div class="column items-center fields-card">
  6. <q-img :src="Logo" class="login-logo q-mb-lg" />
  7. <p class="login-title">{{ $t("auth.forgot_password_title") }}</p>
  8. <UserTypeBadge :tipo="tipo" />
  9. <q-form
  10. ref="formRef"
  11. class="full-width"
  12. autocomplete="off"
  13. @submit="onSubmit"
  14. >
  15. <DefaultInput
  16. v-model="form.email"
  17. v-model:error="validationErrors.email"
  18. type="email"
  19. autofocus
  20. :label="$t('common.terms.email')"
  21. :rules="[inputRules.required, inputRules.email]"
  22. >
  23. <template #append>
  24. <q-icon name="mdi-account-outline" color="grey-5" />
  25. </template>
  26. </DefaultInput>
  27. <q-btn
  28. class="full-width q-mt-sm login-btn"
  29. color="violet-normal"
  30. :label="$t('auth.continue')"
  31. type="submit"
  32. unelevated
  33. :loading
  34. >
  35. <template #loading>
  36. <q-spinner />
  37. </template>
  38. </q-btn>
  39. </q-form>
  40. <a href="#" class="login-link q-mt-md" @click.prevent="goBack">
  41. <q-icon name="mdi-arrow-left" size="12px" class="q-mr-xs" />
  42. {{ $t("auth.back_to_site") }}
  43. </a>
  44. </div>
  45. </div>
  46. </q-page>
  47. </template>
  48. <script setup>
  49. import { ref, useTemplateRef } from "vue";
  50. import { useRouter, useRoute } from "vue-router";
  51. import { useInputRules } from "src/composables/useInputRules";
  52. import { useSubmitHandler } from "src/composables/useSubmitHandler";
  53. import { forgotPassword } from "src/api/auth";
  54. import Logo from "src/assets/logo_serprati.svg";
  55. import DefaultInput from "src/components/defaults/DefaultInput.vue";
  56. import UserTypeBadge from "./components/UserTypeBadge.vue";
  57. const router = useRouter();
  58. const route = useRoute();
  59. const { inputRules } = useInputRules();
  60. const tipo = route.query.tipo ?? "administrador";
  61. const formRef = useTemplateRef("formRef");
  62. const {
  63. loading,
  64. validationErrors,
  65. execute: submitForm,
  66. } = useSubmitHandler({
  67. onSuccess: () =>
  68. router.push({
  69. name: "VerifyEmailPage",
  70. query: { email: form.value.email, tipo },
  71. }),
  72. formRef,
  73. });
  74. const form = ref({ email: null });
  75. const onSubmit = async () => {
  76. await submitForm(() => forgotPassword(form.value.email, tipo));
  77. };
  78. const goBack = () => router.push({ name: "LoginPage" });
  79. </script>
  80. <style lang="scss" scoped>
  81. @use "sass:map";
  82. @use "src/css/quasar.variables.scss" as *;
  83. .login-page {
  84. min-height: 100dvh;
  85. background-image: url("src/assets/pessoas_fundo.jpg");
  86. background-size: cover;
  87. background-position: center;
  88. position: relative;
  89. }
  90. .login-overlay {
  91. position: absolute;
  92. inset: 0;
  93. background: rgba(74, 20, 140, 0.48);
  94. z-index: 0;
  95. }
  96. .login-card {
  97. z-index: 1;
  98. display: flex;
  99. align-items: center;
  100. justify-content: center;
  101. width: calc(100% - 32px);
  102. min-height: calc(100dvh - 32px);
  103. background: rgba(255, 255, 255, 0.747);
  104. border-radius: 16px;
  105. box-shadow: 0 4px 32px rgba(0, 0, 0, 0.15);
  106. }
  107. .fields-card {
  108. width: 100%;
  109. max-width: 600px;
  110. padding: 32px;
  111. border-radius: 12px;
  112. }
  113. .login-logo {
  114. width: 380px;
  115. }
  116. .login-title {
  117. color: map.get($colors, "violet-normal");
  118. font-size: 18px;
  119. font-weight: 700;
  120. margin: 0 0 8px;
  121. text-align: center;
  122. }
  123. .login-description {
  124. color: map.get($colors, "text-2");
  125. font-size: 13px;
  126. text-align: center;
  127. margin: 0 0 20px;
  128. }
  129. .login-btn {
  130. height: 44px;
  131. font-size: 15px;
  132. font-weight: 600;
  133. letter-spacing: 0.5px;
  134. }
  135. .login-link {
  136. color: map.get($colors, "violet-normal");
  137. font-size: 13px;
  138. text-decoration: none;
  139. cursor: pointer;
  140. &:hover {
  141. color: map.get($colors, "violet-normal-hover");
  142. text-decoration: underline;
  143. }
  144. }
  145. </style>