|
@@ -1,150 +1,239 @@
|
|
|
<template>
|
|
<template>
|
|
|
<div class="q-pa-md">
|
|
<div class="q-pa-md">
|
|
|
- <div class="column justify-center items-center q-mb-lg">
|
|
|
|
|
- <AvatarImageComponent @update:file="onAvatarChange" />
|
|
|
|
|
-
|
|
|
|
|
- <div class="row full-width q-mt-md q-col-gutter-sm">
|
|
|
|
|
- <DefaultInput
|
|
|
|
|
- v-model="form.social_reason"
|
|
|
|
|
- label="Razão Social"
|
|
|
|
|
- class="col-12"
|
|
|
|
|
- outlined
|
|
|
|
|
- />
|
|
|
|
|
-
|
|
|
|
|
- <DefaultInput
|
|
|
|
|
- v-model="form.fantasy_name"
|
|
|
|
|
- label="Nome Fantasia"
|
|
|
|
|
- class="col-12"
|
|
|
|
|
- outlined
|
|
|
|
|
- />
|
|
|
|
|
-
|
|
|
|
|
- <DefaultInput v-model="form.cnpj" label="CNPJ" class="col-4" outlined />
|
|
|
|
|
-
|
|
|
|
|
- <DefaultInput
|
|
|
|
|
- v-model="form.state_registration"
|
|
|
|
|
- label="Inscrição Estadual"
|
|
|
|
|
- class="col-4"
|
|
|
|
|
- outlined
|
|
|
|
|
- />
|
|
|
|
|
-
|
|
|
|
|
- <DefaultInput
|
|
|
|
|
- v-model="form.responsible"
|
|
|
|
|
- label="Responsável"
|
|
|
|
|
- class="col-4"
|
|
|
|
|
- outlined
|
|
|
|
|
- />
|
|
|
|
|
-
|
|
|
|
|
- <DefaultInput
|
|
|
|
|
- v-model="form.address"
|
|
|
|
|
- label="Endereço"
|
|
|
|
|
- class="col-8"
|
|
|
|
|
- outlined
|
|
|
|
|
- />
|
|
|
|
|
-
|
|
|
|
|
- <DefaultInput
|
|
|
|
|
- v-model="form.address_number"
|
|
|
|
|
- label="Número"
|
|
|
|
|
- class="col-4"
|
|
|
|
|
- outlined
|
|
|
|
|
- />
|
|
|
|
|
-
|
|
|
|
|
- <DefaultInput
|
|
|
|
|
- v-model="form.zip_code"
|
|
|
|
|
- label="CEP"
|
|
|
|
|
- class="col-3"
|
|
|
|
|
- outlined
|
|
|
|
|
- />
|
|
|
|
|
-
|
|
|
|
|
- <DefaultInput
|
|
|
|
|
- v-model="form.neighborhood"
|
|
|
|
|
- label="Bairro"
|
|
|
|
|
- class="col-5"
|
|
|
|
|
- outlined
|
|
|
|
|
- />
|
|
|
|
|
-
|
|
|
|
|
- <DefaultInput
|
|
|
|
|
- v-model="form.city_state"
|
|
|
|
|
- label="Cidade / Estado"
|
|
|
|
|
- class="col-4"
|
|
|
|
|
- outlined
|
|
|
|
|
- />
|
|
|
|
|
-
|
|
|
|
|
- <DefaultInput
|
|
|
|
|
- v-model="form.complement"
|
|
|
|
|
- label="Complemento"
|
|
|
|
|
- class="col-12"
|
|
|
|
|
- outlined
|
|
|
|
|
- />
|
|
|
|
|
-
|
|
|
|
|
- <DefaultInput
|
|
|
|
|
- v-model="form.primary_email"
|
|
|
|
|
- label="E-mail Principal"
|
|
|
|
|
- class="col-6"
|
|
|
|
|
- outlined
|
|
|
|
|
- />
|
|
|
|
|
-
|
|
|
|
|
- <DefaultInput
|
|
|
|
|
- v-model="form.secondary_email"
|
|
|
|
|
- label="E-mail Secundário"
|
|
|
|
|
- class="col-6"
|
|
|
|
|
- outlined
|
|
|
|
|
- />
|
|
|
|
|
-
|
|
|
|
|
- <DefaultInput
|
|
|
|
|
- v-model="form.phone"
|
|
|
|
|
- label="Telefone"
|
|
|
|
|
- class="col-6"
|
|
|
|
|
- outlined
|
|
|
|
|
- />
|
|
|
|
|
-
|
|
|
|
|
- <DefaultInput
|
|
|
|
|
- v-model="form.cellphone_number"
|
|
|
|
|
- label="Celular"
|
|
|
|
|
- class="col-6"
|
|
|
|
|
- outlined
|
|
|
|
|
- />
|
|
|
|
|
- </div>
|
|
|
|
|
|
|
+ <q-form ref="formRef">
|
|
|
|
|
+ <div class="column justify-center items-center q-mb-lg">
|
|
|
|
|
+ <AvatarImageComponent ref="avatarRef" @update:file="onAvatarChange" />
|
|
|
|
|
+
|
|
|
|
|
+ <div class="row full-width q-mt-md q-col-gutter-sm">
|
|
|
|
|
+ <DefaultInput
|
|
|
|
|
+ v-model="form.social_reason"
|
|
|
|
|
+ label="Razão Social"
|
|
|
|
|
+ class="col-12"
|
|
|
|
|
+ outlined
|
|
|
|
|
+ :rules="[inputRules.required]"
|
|
|
|
|
+ />
|
|
|
|
|
+
|
|
|
|
|
+ <DefaultInput
|
|
|
|
|
+ v-model="form.fantasy_name"
|
|
|
|
|
+ label="Nome Fantasia"
|
|
|
|
|
+ class="col-12"
|
|
|
|
|
+ outlined
|
|
|
|
|
+ :rules="[inputRules.required]"
|
|
|
|
|
+ />
|
|
|
|
|
+
|
|
|
|
|
+ <DefaultInput
|
|
|
|
|
+ v-model="form.cnpj"
|
|
|
|
|
+ label="CNPJ"
|
|
|
|
|
+ class="col-4"
|
|
|
|
|
+ outlined
|
|
|
|
|
+ :mask="masks.Brasil.cnpj"
|
|
|
|
|
+ :rules="[inputRules.required, inputRules.cnpj]"
|
|
|
|
|
+ />
|
|
|
|
|
+
|
|
|
|
|
+ <DefaultInput
|
|
|
|
|
+ v-model="form.state_registration"
|
|
|
|
|
+ label="Inscrição Estadual"
|
|
|
|
|
+ class="col-4"
|
|
|
|
|
+ outlined
|
|
|
|
|
+ />
|
|
|
|
|
+
|
|
|
|
|
+ <DefaultInput
|
|
|
|
|
+ v-model="form.name_responsible"
|
|
|
|
|
+ label="Responsável"
|
|
|
|
|
+ class="col-4"
|
|
|
|
|
+ outlined
|
|
|
|
|
+ :rules="[inputRules.required]"
|
|
|
|
|
+ />
|
|
|
|
|
+
|
|
|
|
|
+ <DefaultCepInput
|
|
|
|
|
+ v-model="form.postal_code"
|
|
|
|
|
+ class="col-3"
|
|
|
|
|
+ outlined
|
|
|
|
|
+ :rules="[inputRules.required]"
|
|
|
|
|
+ @rua="form.street = $event"
|
|
|
|
|
+ @bairro="form.neighborhood = $event"
|
|
|
|
|
+ @uf="stateSelectRef?.selectStateByCode($event)"
|
|
|
|
|
+ @cidade="citySelectRef?.selectCityByName($event)"
|
|
|
|
|
+ />
|
|
|
|
|
|
|
|
- <div class="row justify-end q-mt-md items-end full-width q-px-xs">
|
|
|
|
|
- <div class="row q-gutter-sm">
|
|
|
|
|
- <q-btn label="Cancelar" color="primary" outline />
|
|
|
|
|
- <q-btn label="Salvar" color="primary-2" />
|
|
|
|
|
|
|
+ <DefaultInput
|
|
|
|
|
+ v-model="form.street"
|
|
|
|
|
+ label="Endereço"
|
|
|
|
|
+ class="col-6"
|
|
|
|
|
+ outlined
|
|
|
|
|
+ :rules="[inputRules.required]"
|
|
|
|
|
+ />
|
|
|
|
|
+
|
|
|
|
|
+ <DefaultInput
|
|
|
|
|
+ v-model="form.address_number"
|
|
|
|
|
+ label="Número"
|
|
|
|
|
+ class="col-3"
|
|
|
|
|
+ outlined
|
|
|
|
|
+ />
|
|
|
|
|
+
|
|
|
|
|
+ <DefaultInput
|
|
|
|
|
+ v-model="form.neighborhood"
|
|
|
|
|
+ label="Bairro"
|
|
|
|
|
+ class="col-4"
|
|
|
|
|
+ outlined
|
|
|
|
|
+ :rules="[inputRules.required]"
|
|
|
|
|
+ />
|
|
|
|
|
+
|
|
|
|
|
+ <StateSelect
|
|
|
|
|
+ ref="stateSelectRef"
|
|
|
|
|
+ v-model="selectedState"
|
|
|
|
|
+ label="Estado"
|
|
|
|
|
+ class="col-4"
|
|
|
|
|
+ outlined
|
|
|
|
|
+ :rules="[inputRules.required]"
|
|
|
|
|
+ />
|
|
|
|
|
+
|
|
|
|
|
+ <CitySelect
|
|
|
|
|
+ ref="citySelectRef"
|
|
|
|
|
+ v-model="selectedCity"
|
|
|
|
|
+ label="Cidade"
|
|
|
|
|
+ class="col-4"
|
|
|
|
|
+ outlined
|
|
|
|
|
+ :state="selectedState"
|
|
|
|
|
+ :rules="[inputRules.required]"
|
|
|
|
|
+ />
|
|
|
|
|
|
|
|
- <q-btn
|
|
|
|
|
- icon="mdi-paperclip-plus"
|
|
|
|
|
- color="primary-2"
|
|
|
|
|
- style="height: 40px; width: 40px"
|
|
|
|
|
|
|
+ <DefaultInput
|
|
|
|
|
+ v-model="form.complement"
|
|
|
|
|
+ label="Complemento"
|
|
|
|
|
+ class="col-12"
|
|
|
|
|
+ outlined
|
|
|
/>
|
|
/>
|
|
|
|
|
+
|
|
|
|
|
+ <DefaultInput
|
|
|
|
|
+ v-model="form.email"
|
|
|
|
|
+ label="E-mail Principal"
|
|
|
|
|
+ class="col-6"
|
|
|
|
|
+ outlined
|
|
|
|
|
+ :rules="[inputRules.required, inputRules.email]"
|
|
|
|
|
+ />
|
|
|
|
|
+
|
|
|
|
|
+ <DefaultInput
|
|
|
|
|
+ v-model="form.secondary_email"
|
|
|
|
|
+ label="E-mail Secundário"
|
|
|
|
|
+ class="col-6"
|
|
|
|
|
+ outlined
|
|
|
|
|
+ :rules="[inputRules.email]"
|
|
|
|
|
+ />
|
|
|
|
|
+
|
|
|
|
|
+ <DefaultInput
|
|
|
|
|
+ v-model="form.phone_number"
|
|
|
|
|
+ label="Telefone"
|
|
|
|
|
+ class="col-6"
|
|
|
|
|
+ outlined
|
|
|
|
|
+ :mask="masks.Brasil.telefone"
|
|
|
|
|
+ :rules="[inputRules.required]"
|
|
|
|
|
+ />
|
|
|
|
|
+
|
|
|
|
|
+ <DefaultInput
|
|
|
|
|
+ v-model="form.cell_number"
|
|
|
|
|
+ label="Celular"
|
|
|
|
|
+ class="col-6"
|
|
|
|
|
+ outlined
|
|
|
|
|
+ :mask="masks.Brasil.celular"
|
|
|
|
|
+ />
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="row justify-end q-mt-md items-end full-width q-px-xs">
|
|
|
|
|
+ <div class="row q-gutter-sm">
|
|
|
|
|
+ <q-btn label="Cancelar" color="primary" outline @click="onCancel" />
|
|
|
|
|
+ <q-btn
|
|
|
|
|
+ label="Salvar"
|
|
|
|
|
+ color="primary-2"
|
|
|
|
|
+ :loading="loading"
|
|
|
|
|
+ @click="onSave"
|
|
|
|
|
+ />
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
- </div>
|
|
|
|
|
|
|
+ </q-form>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script setup>
|
|
<script setup>
|
|
|
|
|
+import { ref, watch } from "vue";
|
|
|
|
|
+import { useRouter } from "vue-router";
|
|
|
import DefaultInput from "src/components/defaults/DefaultInput.vue";
|
|
import DefaultInput from "src/components/defaults/DefaultInput.vue";
|
|
|
|
|
+import DefaultCepInput from "src/components/defaults/DefaultCepInput.vue";
|
|
|
import AvatarImageComponent from "src/components/shared/AvatarImageComponent.vue";
|
|
import AvatarImageComponent from "src/components/shared/AvatarImageComponent.vue";
|
|
|
|
|
+import StateSelect from "src/components/selects/StateSelect.vue";
|
|
|
|
|
+import CitySelect from "src/components/selects/CitySelect.vue";
|
|
|
import { useFormUpdateTracker } from "src/composables/useFormUpdateTracker";
|
|
import { useFormUpdateTracker } from "src/composables/useFormUpdateTracker";
|
|
|
|
|
+import { useSubmitHandler } from "src/composables/useSubmitHandler";
|
|
|
|
|
+import { useInputRules } from "src/composables/useInputRules";
|
|
|
|
|
+import { createUnit } from "src/api/unit";
|
|
|
|
|
+import masks from "src/helpers/masks";
|
|
|
|
|
+
|
|
|
|
|
+const props = defineProps({
|
|
|
|
|
+ unitId: {
|
|
|
|
|
+ type: Number,
|
|
|
|
|
+ default: null,
|
|
|
|
|
+ },
|
|
|
|
|
+});
|
|
|
|
|
|
|
|
-const { form } = useFormUpdateTracker({
|
|
|
|
|
- social_reason: null,
|
|
|
|
|
|
|
+const router = useRouter();
|
|
|
|
|
+const formRef = ref(null);
|
|
|
|
|
+const avatarRef = ref(null);
|
|
|
|
|
+const stateSelectRef = ref(null);
|
|
|
|
|
+const citySelectRef = ref(null);
|
|
|
|
|
+
|
|
|
|
|
+const selectedState = ref(null);
|
|
|
|
|
+const selectedCity = ref(null);
|
|
|
|
|
+
|
|
|
|
|
+const { inputRules } = useInputRules();
|
|
|
|
|
+
|
|
|
|
|
+const { form, getFormAsFormData } = useFormUpdateTracker({
|
|
|
fantasy_name: null,
|
|
fantasy_name: null,
|
|
|
|
|
+ social_reason: null,
|
|
|
cnpj: null,
|
|
cnpj: null,
|
|
|
state_registration: null,
|
|
state_registration: null,
|
|
|
- address: null,
|
|
|
|
|
|
|
+ name_responsible: null,
|
|
|
|
|
+ street: null,
|
|
|
address_number: null,
|
|
address_number: null,
|
|
|
- zip_code: null,
|
|
|
|
|
|
|
+ postal_code: null,
|
|
|
neighborhood: null,
|
|
neighborhood: null,
|
|
|
- city_state: null,
|
|
|
|
|
complement: null,
|
|
complement: null,
|
|
|
- responsible: null,
|
|
|
|
|
- primary_email: null,
|
|
|
|
|
|
|
+ city_id: null,
|
|
|
|
|
+ state_id: null,
|
|
|
|
|
+ email: null,
|
|
|
secondary_email: null,
|
|
secondary_email: null,
|
|
|
- phone: null,
|
|
|
|
|
- cellphone_number: null,
|
|
|
|
|
|
|
+ phone_number: null,
|
|
|
|
|
+ cell_number: null,
|
|
|
|
|
+ avatar: null,
|
|
|
|
|
+});
|
|
|
|
|
+
|
|
|
|
|
+watch(selectedState, (state) => {
|
|
|
|
|
+ form.state_id = state?.value ?? null;
|
|
|
|
|
+});
|
|
|
|
|
+
|
|
|
|
|
+watch(selectedCity, (city) => {
|
|
|
|
|
+ form.city_id = city?.value ?? null;
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
function onAvatarChange(file) {
|
|
function onAvatarChange(file) {
|
|
|
- console.log("Avatar file selected:", file);
|
|
|
|
|
|
|
+ form.avatar = file;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const { loading, execute } = useSubmitHandler({
|
|
|
|
|
+ formRef,
|
|
|
|
|
+ onSuccess: () => {
|
|
|
|
|
+ router.push({ name: "FranchiseePage" });
|
|
|
|
|
+ },
|
|
|
|
|
+});
|
|
|
|
|
+
|
|
|
|
|
+async function onSave() {
|
|
|
|
|
+ await execute(() => {
|
|
|
|
|
+ const formData = getFormAsFormData();
|
|
|
|
|
+ return createUnit(formData);
|
|
|
|
|
+ });
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+function onCancel() {
|
|
|
|
|
+ router.push({ name: "FranchiseePage" });
|
|
|
}
|
|
}
|
|
|
</script>
|
|
</script>
|