AddEditAssociadoDialog.vue 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. <template>
  2. <q-dialog ref="dialogRef" @hide="onDialogHide">
  3. <q-card class="q-dialog-plugin overflow-hidden" style="width: 900px; max-width: 95vw">
  4. <DefaultDialogHeader :title="title" @close="onDialogCancel" />
  5. <q-form ref="formRef" @submit="onOKClick">
  6. <q-card-section class="row q-col-gutter-sm q-pt-none">
  7. <DefaultInput
  8. v-model="form.name"
  9. v-model:error="validationErrors.name"
  10. lazy-rules
  11. :rules="[inputRules.required, inputRules.fullName(6)]"
  12. :label="$t('common.terms.name')"
  13. :placeholder="$t('user.profile.name_and_surname')"
  14. class="col-md-8 col-12 input-violet"
  15. />
  16. <DefaultSelect
  17. v-model="form.status"
  18. v-model:error="validationErrors.status"
  19. :options="statusOptions"
  20. :label="$t('common.terms.status')"
  21. emit-value
  22. map-options
  23. class="col-md-4 col-12"
  24. />
  25. <DefaultInput
  26. v-model="form.email"
  27. v-model:error="validationErrors.email"
  28. lazy-rules
  29. :rules="[inputRules.email, inputRules.required]"
  30. :label="$t('common.terms.email')"
  31. :placeholder="$t('common.placeholders.email')"
  32. class="col-md-8 col-12"
  33. />
  34. <DefaultInput
  35. v-model="form.cpf"
  36. v-model:error="validationErrors.cpf"
  37. :label="$t('common.terms.cpf')"
  38. :placeholder="$t('common.placeholders.cpf')"
  39. :mask="'###.###.###-##'"
  40. class="col-md-4 col-12"
  41. />
  42. <DefaultInput
  43. v-model="form.registration"
  44. v-model:error="validationErrors.registration"
  45. lazy-rules
  46. :rules="[inputRules.required]"
  47. :label="$t('associado.registration')"
  48. :placeholder="$t('common.placeholders.registration')"
  49. class="col-md-4 col-12"
  50. />
  51. <PositionSelect
  52. v-model="selectedPosition"
  53. v-model:error="validationErrors.position_id"
  54. class="col-md-4 col-12"
  55. />
  56. <SectorSelect
  57. v-model="selectedSector"
  58. v-model:error="validationErrors.sector_id"
  59. class="col-md-4 col-12"
  60. />
  61. <DefaultInputDatePicker
  62. v-model:untreated-date="form.admission_date"
  63. v-model:error="validationErrors.admission_date"
  64. :label="$t('associado.admission_date')"
  65. class="col-md-6 col-12"
  66. />
  67. <DefaultInputDatePicker
  68. v-model:untreated-date="form.expiry_date"
  69. v-model:error="validationErrors.expiry_date"
  70. :label="$t('associado.validity')"
  71. class="col-md-6 col-12"
  72. />
  73. <DefaultPasswordInput
  74. v-model="form.password"
  75. v-model:error="validationErrors.password"
  76. lazy-rules
  77. :rules="[inputRules.password]"
  78. :label="$t('common.terms.password')"
  79. :placeholder="$t('auth.password_hint')"
  80. class="col-md-6 col-12"
  81. />
  82. <DefaultPasswordInput
  83. v-model="confirmPassword"
  84. lazy-rules
  85. :rules="[inputRules.samePassword(form.password)]"
  86. :label="$t('auth.confirm_password')"
  87. class="col-md-6 col-12"
  88. />
  89. <div v-if="!associado" class="col-12 text-caption text-grey-7">
  90. {{ $t("associado.first_access_password_hint") }}
  91. </div>
  92. </q-card-section>
  93. <q-card-actions>
  94. <q-space />
  95. <q-btn
  96. outline
  97. color="negative"
  98. :label="$t('common.actions.cancel')"
  99. @click="onDialogCancel"
  100. />
  101. <q-btn
  102. color="violet-normal"
  103. :label="associado ? $t('common.actions.save') : $t('common.actions.add')"
  104. type="submit"
  105. :loading="loading"
  106. :disable="!hasUpdatedFields"
  107. />
  108. </q-card-actions>
  109. </q-form>
  110. </q-card>
  111. </q-dialog>
  112. </template>
  113. <script setup>
  114. import { ref, computed, useTemplateRef, watch } from "vue";
  115. import { useInputRules } from "src/composables/useInputRules";
  116. import { useDialogPluginComponent } from "quasar";
  117. import { useI18n } from "vue-i18n";
  118. import { createUser, updateUser } from "src/api/user";
  119. import { useFormUpdateTracker } from "src/composables/useFormUpdateTracker";
  120. import { useSubmitHandler } from "src/composables/useSubmitHandler";
  121. import DefaultDialogHeader from "src/components/defaults/DefaultDialogHeader.vue";
  122. import DefaultInput from "src/components/defaults/DefaultInput.vue";
  123. import DefaultPasswordInput from "src/components/defaults/DefaultPasswordInput.vue";
  124. import DefaultInputDatePicker from "src/components/defaults/DefaultInputDatePicker.vue";
  125. import DefaultSelect from "src/components/defaults/DefaultSelect.vue";
  126. import PositionSelect from "src/components/selects/PositionSelect.vue";
  127. import SectorSelect from "src/components/selects/SectorSelect.vue";
  128. defineEmits([...useDialogPluginComponent.emits]);
  129. const { associado, title } = defineProps({
  130. associado: {
  131. type: Object,
  132. default: null,
  133. },
  134. title: {
  135. type: Function,
  136. default: () => useI18n().t("common.actions.add"),
  137. },
  138. });
  139. const { t } = useI18n();
  140. const { inputRules } = useInputRules();
  141. const { dialogRef, onDialogHide, onDialogOK, onDialogCancel } = useDialogPluginComponent();
  142. const formRef = useTemplateRef("formRef");
  143. const confirmPassword = ref("");
  144. const selectedPosition = ref(
  145. associado?.position ? { label: associado.position.name, value: associado.position.id } : null,
  146. );
  147. const selectedSector = ref(
  148. associado?.sector ? { label: associado.sector.name, value: associado.sector.id } : null,
  149. );
  150. const statusOptions = computed(() => [
  151. { label: t("common.status.active"), value: "active" },
  152. { label: t("common.status.inactive"), value: "inactive" },
  153. { label: t("common.status.pending"), value: "pending" },
  154. { label: t("common.status.on_leave"), value: "on_leave" },
  155. { label: t("common.status.refused"), value: "refused" },
  156. ]);
  157. const { form, getUpdatedFields, hasUpdatedFields } = useFormUpdateTracker({
  158. name: associado?.name ?? "",
  159. email: associado?.email ?? "",
  160. cpf: associado?.cpf ?? "",
  161. registration: associado?.registration ?? "",
  162. password: "",
  163. type: "associado",
  164. status: associado?.status ?? "active",
  165. position_id: associado?.position_id ?? null,
  166. sector_id: associado?.sector_id ?? null,
  167. admission_date: associado?.admission_date ?? null,
  168. expiry_date: associado?.expiry_date ?? null,
  169. });
  170. const { loading, validationErrors, execute: submitForm } = useSubmitHandler({
  171. onSuccess: () => onDialogOK(true),
  172. formRef: formRef,
  173. });
  174. watch(selectedPosition, (val) => {
  175. form.position_id = val?.value ?? null;
  176. });
  177. watch(selectedSector, (val) => {
  178. form.sector_id = val?.value ?? null;
  179. });
  180. const onOKClick = async () => {
  181. if (associado) {
  182. await submitForm(() => updateUser(getUpdatedFields.value, associado.id));
  183. } else {
  184. await submitForm(() => createUser({ ...form }));
  185. }
  186. };
  187. </script>