ProfileEditDialog.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. <template>
  2. <q-dialog v-model="dialogModel" persistent>
  3. <q-card style="max-width: 100%; border-radius: 8px">
  4. <DefaultDialogHeader title="Editar meus dados" @close="closeDialog" />
  5. <q-form
  6. ref="editFormRef"
  7. class="column q-gutter-sm q-pa-md bg-grey-2"
  8. @submit="submitForm"
  9. >
  10. <div
  11. class="bg-white radius-8 q-pa-sm q-mb-xl"
  12. style="border: 1px solid #ccc"
  13. >
  14. <div class="column q-gutter-sm" style="border-radius: 8px">
  15. <div class="text-subtitle2 text-weight-bold text-primary">
  16. Dados pessoais
  17. </div>
  18. <q-separator />
  19. <div class="grid-2">
  20. <q-input
  21. v-model="localForm.name"
  22. bg-color="white"
  23. label="Nome"
  24. outlined
  25. :error="Boolean(serverErrors.name)"
  26. :error-message="serverErrors.name"
  27. :loading="submitting"
  28. :rules="[inputRules.required]"
  29. />
  30. <q-input
  31. v-model="localForm.document"
  32. bg-color="white"
  33. label="Número de documento"
  34. outlined
  35. :error="Boolean(serverErrors.document_number)"
  36. :error-message="serverErrors.document_number"
  37. :loading="submitting"
  38. />
  39. </div>
  40. </div>
  41. <div class="column q-gutter-sm" style="border-radius: 8px">
  42. <div class="text-subtitle2 text-weight-bold text-primary">
  43. Acesso
  44. </div>
  45. <q-separator />
  46. <div class="grid-3">
  47. <q-input
  48. v-model="localForm.email"
  49. bg-color="white"
  50. label="Email"
  51. outlined
  52. :error="Boolean(serverErrors.email)"
  53. :error-message="serverErrors.email"
  54. :loading="submitting"
  55. :rules="[inputRules.required, inputRules.email]"
  56. />
  57. <DefaultPasswordInput
  58. v-model="localForm.password"
  59. bg-color="white"
  60. label="Senha"
  61. outlined
  62. :error="Boolean(serverErrors.password)"
  63. :error-message="serverErrors.password"
  64. :loading="submitting"
  65. :rules="passwordRules"
  66. />
  67. <DefaultPasswordInput
  68. v-model="localForm.confirmPassword"
  69. bg-color="white"
  70. label="Confirmar Senha"
  71. outlined
  72. :loading="submitting"
  73. :rules="confirmPasswordRules"
  74. />
  75. </div>
  76. </div>
  77. </div>
  78. <div class="row justify-end q-gutter-sm">
  79. <q-btn
  80. class="bg-white"
  81. color="primary"
  82. label="Cancelar"
  83. outline
  84. @click="closeDialog"
  85. />
  86. <q-btn
  87. color="primary"
  88. label="Salvar"
  89. type="submit"
  90. :loading="submitting"
  91. />
  92. </div>
  93. </q-form>
  94. </q-card>
  95. </q-dialog>
  96. </template>
  97. <script setup>
  98. import { computed, reactive, ref, watch } from "vue";
  99. import DefaultDialogHeader from "src/components/defaults/DefaultDialogHeader.vue";
  100. import DefaultPasswordInput from "src/components/defaults/DefaultPasswordInput.vue";
  101. const dialogModel = defineModel({ default: false });
  102. const emit = defineEmits(["submit", "close"]);
  103. const { form, inputRules, serverErrors, submitting } = defineProps({
  104. // eslint-disable-next-line vue/require-default-prop
  105. form: Object,
  106. // eslint-disable-next-line vue/require-default-prop
  107. inputRules: Object,
  108. serverErrors: { type: Object, default: () => ({}) },
  109. submitting: Boolean,
  110. });
  111. const editFormRef = ref(null);
  112. const localForm = reactive({
  113. name: "",
  114. document: "",
  115. email: "",
  116. password: "",
  117. confirmPassword: "",
  118. });
  119. const passwordRules = computed(() =>
  120. localForm.password ? [inputRules.min(6)] : [],
  121. );
  122. const confirmPasswordRules = computed(() =>
  123. localForm.password
  124. ? [inputRules.required, inputRules.samePassword(localForm.password)]
  125. : [],
  126. );
  127. const syncLocalForm = () => {
  128. Object.assign(localForm, {
  129. name: form.name ?? "",
  130. document: form.document ?? "",
  131. email: form.email ?? "",
  132. password: form.password ?? "",
  133. confirmPassword: form.confirmPassword ?? "",
  134. });
  135. };
  136. watch(
  137. () => [dialogModel.value, form],
  138. () => {
  139. if (dialogModel.value) syncLocalForm();
  140. },
  141. { deep: true, immediate: true },
  142. );
  143. const closeDialog = () => {
  144. dialogModel.value = false;
  145. emit("close");
  146. };
  147. const submitForm = async () => {
  148. const isValid = await editFormRef.value?.validate();
  149. if (!isValid) return;
  150. emit("submit", { ...localForm });
  151. };
  152. </script>
  153. <style scoped>
  154. .grid-2 {
  155. display: grid;
  156. grid-template-columns: 1fr 240px;
  157. gap: 12px;
  158. }
  159. .grid-3 {
  160. display: grid;
  161. grid-template-columns: repeat(3, 1fr);
  162. gap: 12px;
  163. }
  164. @media (max-width: 900px) {
  165. .grid-2,
  166. .grid-3 {
  167. grid-template-columns: 1fr;
  168. }
  169. }
  170. </style>