|
|
@@ -15,6 +15,7 @@
|
|
|
v-model="form.name"
|
|
|
label="Nome do aluno"
|
|
|
class="col-md-5 col-12"
|
|
|
+ :rules="[inputRules.required]"
|
|
|
/>
|
|
|
|
|
|
<DefaultInputDatePicker
|
|
|
@@ -27,7 +28,12 @@
|
|
|
<div style="position: relative; display: inline-block">
|
|
|
<q-avatar size="72px" color="grey-3">
|
|
|
<img v-if="avatarPreview" :src="avatarPreview" />
|
|
|
- <q-icon v-else name="mdi-account" size="42px" color="grey-6" />
|
|
|
+ <q-icon
|
|
|
+ v-else
|
|
|
+ name="mdi-account"
|
|
|
+ size="42px"
|
|
|
+ color="grey-6"
|
|
|
+ />
|
|
|
</q-avatar>
|
|
|
<q-btn
|
|
|
round
|
|
|
@@ -52,6 +58,8 @@
|
|
|
v-model="form.cpf"
|
|
|
label="CPF / CNH"
|
|
|
class="col-md-6 col-12"
|
|
|
+ :mask="masks.Brasil.cpf"
|
|
|
+ :rules="[inputRules.cpf]"
|
|
|
/>
|
|
|
|
|
|
<DefaultSelect
|
|
|
@@ -68,18 +76,22 @@
|
|
|
label="E-mail"
|
|
|
class="col-md-6 col-12"
|
|
|
type="email"
|
|
|
+ :rules="[inputRules.email]"
|
|
|
/>
|
|
|
|
|
|
<DefaultInput
|
|
|
v-model="form.phone"
|
|
|
label="Celular com DDD"
|
|
|
class="col-md-6 col-12"
|
|
|
+ :mask="masks.Brasil.celular"
|
|
|
/>
|
|
|
|
|
|
<DefaultInput
|
|
|
v-model="form.cep"
|
|
|
- label="Cep"
|
|
|
+ label="CEP"
|
|
|
class="col-md-3 col-12"
|
|
|
+ :mask="masks.Brasil.cep"
|
|
|
+ :rules="[inputRules.cep]"
|
|
|
/>
|
|
|
|
|
|
<DefaultInput
|
|
|
@@ -90,7 +102,7 @@
|
|
|
|
|
|
<DefaultInput
|
|
|
v-model="form.address_number"
|
|
|
- label="Numero"
|
|
|
+ label="Número"
|
|
|
class="col-md-3 col-12"
|
|
|
/>
|
|
|
|
|
|
@@ -100,10 +112,11 @@
|
|
|
class="col-md-6 col-12"
|
|
|
/>
|
|
|
|
|
|
- <DefaultInput
|
|
|
- v-model="form.city_state"
|
|
|
- label="Cidade / Estado"
|
|
|
+ <StateSelect
|
|
|
+ v-model="form.state"
|
|
|
+ label="Estado"
|
|
|
class="col-md-6 col-12"
|
|
|
+ outlined
|
|
|
/>
|
|
|
|
|
|
<DefaultInput
|
|
|
@@ -164,15 +177,22 @@ import DefaultDialogHeader from "src/components/defaults/DefaultDialogHeader.vue
|
|
|
import DefaultInput from "src/components/defaults/DefaultInput.vue";
|
|
|
import DefaultSelect from "src/components/defaults/DefaultSelect.vue";
|
|
|
import DefaultInputDatePicker from "src/components/defaults/DefaultInputDatePicker.vue";
|
|
|
+import StateSelect from "src/components/selects/StateSelect.vue";
|
|
|
+import { useInputRules } from "src/composables/useInputRules";
|
|
|
+import { useSubmitHandler } from "src/composables/useSubmitHandler";
|
|
|
+import { createStudent } from "src/api/student";
|
|
|
+import masks from "src/helpers/masks";
|
|
|
+import { formatDateDMYtoYMD } from "src/helpers/utils";
|
|
|
|
|
|
defineEmits([...useDialogPluginComponent.emits]);
|
|
|
|
|
|
const { dialogRef, onDialogHide, onDialogOK, onDialogCancel } =
|
|
|
useDialogPluginComponent();
|
|
|
|
|
|
+const { inputRules } = useInputRules();
|
|
|
+
|
|
|
const formRef = useTemplateRef("formRef");
|
|
|
const fileInputRef = useTemplateRef("fileInputRef");
|
|
|
-const loading = ref(false);
|
|
|
const avatarPreview = ref(null);
|
|
|
|
|
|
const form = ref({
|
|
|
@@ -186,7 +206,7 @@ const form = ref({
|
|
|
address: null,
|
|
|
address_number: null,
|
|
|
neighborhood: null,
|
|
|
- city_state: null,
|
|
|
+ state: null,
|
|
|
complement: null,
|
|
|
payer: null,
|
|
|
how_found: null,
|
|
|
@@ -207,6 +227,33 @@ const howFoundOptions = ref([
|
|
|
{ label: "Outro", value: "other" },
|
|
|
]);
|
|
|
|
|
|
+const { loading, execute } = useSubmitHandler({
|
|
|
+ formRef,
|
|
|
+ onSuccess: () => {
|
|
|
+ onDialogOK(true);
|
|
|
+ },
|
|
|
+});
|
|
|
+
|
|
|
+function buildPayload() {
|
|
|
+ return {
|
|
|
+ name: form.value.name,
|
|
|
+ birth_date: form.value.birthdate ? formatDateDMYtoYMD(form.value.birthdate) : null,
|
|
|
+ document_number: form.value.cpf,
|
|
|
+ gender: form.value.gender,
|
|
|
+ email: form.value.email || null,
|
|
|
+ phone: form.value.phone,
|
|
|
+ postal_code: form.value.cep,
|
|
|
+ street: form.value.address,
|
|
|
+ address_number: form.value.address_number,
|
|
|
+ neighborhood: form.value.neighborhood,
|
|
|
+ state_id: form.value.state?.value ?? null,
|
|
|
+ complement: form.value.complement,
|
|
|
+ payer_name: form.value.payer,
|
|
|
+ how_did_you_know_us: form.value.how_found,
|
|
|
+ notes: form.value.notes,
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
function triggerFileInput() {
|
|
|
fileInputRef.value?.click();
|
|
|
}
|
|
|
@@ -219,12 +266,6 @@ function onAvatarChange(event) {
|
|
|
}
|
|
|
|
|
|
async function onOKClick() {
|
|
|
- loading.value = true;
|
|
|
- try {
|
|
|
- console.log("Saving student:", form.value);
|
|
|
- onDialogOK(true);
|
|
|
- } finally {
|
|
|
- loading.value = false;
|
|
|
- }
|
|
|
+ await execute(() => createStudent(buildPayload()));
|
|
|
}
|
|
|
</script>
|