UnitDataTab.vue 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. <template>
  2. <div class="q-pa-md">
  3. <DefaultForm ref="formRef">
  4. <div class="column justify-center items-center q-mb-lg">
  5. <AvatarImageComponent ref="avatarRef" @update:file="onAvatarChange" />
  6. <div class="row full-width q-mt-md q-col-gutter-sm">
  7. <DefaultInput
  8. v-model="form.name"
  9. v-model:error="validationErrors.name"
  10. :error-message="validationErrors.name"
  11. label="Nome da Unidade"
  12. class="col-12"
  13. outlined
  14. :rules="[inputRules.required]"
  15. />
  16. <DefaultInput
  17. v-model="form.social_reason"
  18. v-model:error="validationErrors.social_reason"
  19. :error-message="validationErrors.social_reason"
  20. label="Razão Social"
  21. class="col-12"
  22. outlined
  23. :rules="[inputRules.required]"
  24. />
  25. <DefaultInput
  26. v-model="form.fantasy_name"
  27. v-model:error="validationErrors.fantasy_name"
  28. :error-message="validationErrors.fantasy_name"
  29. label="Nome Fantasia"
  30. class="col-12"
  31. outlined
  32. />
  33. <DefaultInput
  34. v-model="form.cnpj"
  35. v-model:error="validationErrors.cnpj"
  36. :error-message="validationErrors.cnpj"
  37. label="CNPJ"
  38. class="col-4"
  39. outlined
  40. :mask="masks.Brasil.cnpj"
  41. :rules="[inputRules.required, inputRules.cnpj]"
  42. />
  43. <DefaultInput
  44. v-model="form.state_registration"
  45. v-model:error="validationErrors.state_registration"
  46. :error-message="validationErrors.state_registration"
  47. label="Inscrição Estadual"
  48. class="col-4"
  49. outlined
  50. />
  51. <DefaultInput
  52. v-model="form.name_responsible"
  53. v-model:error="validationErrors.name_responsible"
  54. :error-message="validationErrors.name_responsible"
  55. label="Responsável"
  56. class="col-4"
  57. outlined
  58. :rules="[inputRules.required]"
  59. />
  60. <DefaultCepInput
  61. v-model="form.postal_code"
  62. v-model:error="validationErrors.postal_code"
  63. :error-message="validationErrors.postal_code"
  64. class="col-3"
  65. outlined
  66. :rules="[inputRules.required]"
  67. @rua="form.street = $event"
  68. @bairro="form.neighborhood = $event"
  69. @uf="stateSelectRef?.selectStateByCode($event)"
  70. @cidade="citySelectRef?.selectCityByName($event)"
  71. />
  72. <DefaultInput
  73. v-model="form.street"
  74. v-model:error="validationErrors.street"
  75. :error-message="validationErrors.street"
  76. label="Endereço"
  77. class="col-6"
  78. outlined
  79. :rules="[inputRules.required]"
  80. />
  81. <DefaultInput
  82. v-model="form.address_number"
  83. v-model:error="validationErrors.address_number"
  84. :error-message="validationErrors.address_number"
  85. label="Número"
  86. class="col-3"
  87. outlined
  88. :rules="[inputRules.required]"
  89. />
  90. <DefaultInput
  91. v-model="form.neighborhood"
  92. v-model:error="validationErrors.neighborhood"
  93. :error-message="validationErrors.neighborhood"
  94. label="Bairro"
  95. class="col-4"
  96. outlined
  97. :rules="[inputRules.required]"
  98. />
  99. <StateSelect
  100. ref="stateSelectRef"
  101. v-model="selectedState"
  102. v-model:error="validationErrors.state_id"
  103. :error-message="validationErrors.state_id"
  104. label="Estado"
  105. class="col-4"
  106. outlined
  107. :rules="[inputRules.required]"
  108. />
  109. <CitySelect
  110. ref="citySelectRef"
  111. v-model="selectedCity"
  112. v-model:error="validationErrors.city_id"
  113. :error-message="validationErrors.city_id"
  114. label="Cidade"
  115. class="col-4"
  116. outlined
  117. :state="selectedState"
  118. :rules="[inputRules.required]"
  119. />
  120. <DefaultInput
  121. v-model="form.complement"
  122. v-model:error="validationErrors.complement"
  123. :error-message="validationErrors.complement"
  124. label="Complemento"
  125. class="col-12"
  126. outlined
  127. />
  128. <DefaultInput
  129. v-model="form.email"
  130. v-model:error="validationErrors.email"
  131. :error-message="validationErrors.email"
  132. label="E-mail Principal"
  133. class="col-6"
  134. outlined
  135. :rules="[inputRules.required, inputRules.email]"
  136. />
  137. <DefaultInput
  138. v-model="form.secondary_email"
  139. v-model:error="validationErrors.secondary_email"
  140. :error-message="validationErrors.secondary_email"
  141. label="E-mail Administrativo"
  142. class="col-6"
  143. outlined
  144. :rules="[inputRules.email]"
  145. />
  146. <DefaultInput
  147. v-model="form.phone_number"
  148. v-model:error="validationErrors.phone_number"
  149. :error-message="validationErrors.phone_number"
  150. label="Telefone"
  151. class="col-6"
  152. outlined
  153. :mask="masks.Brasil.telefone"
  154. />
  155. <DefaultInput
  156. v-model="form.cell_number"
  157. v-model:error="validationErrors.cell_number"
  158. :error-message="validationErrors.cell_number"
  159. label="Celular"
  160. class="col-6"
  161. outlined
  162. :mask="masks.Brasil.celular"
  163. :rules="[inputRules.required]"
  164. />
  165. </div>
  166. <div class="row justify-end q-mt-md items-end full-width q-px-xs">
  167. <div class="row q-gutter-sm">
  168. <q-btn label="Cancelar" color="primary" outline @click="onCancel" />
  169. <q-btn
  170. label="Salvar"
  171. color="primary-2"
  172. :loading="loading"
  173. @click="onSave"
  174. />
  175. </div>
  176. </div>
  177. </div>
  178. </DefaultForm>
  179. </div>
  180. </template>
  181. <script setup>
  182. import { ref, watch, onMounted } from "vue";
  183. import { useRouter } from "vue-router";
  184. import DefaultInput from "src/components/defaults/DefaultInput.vue";
  185. import DefaultCepInput from "src/components/defaults/DefaultCepInput.vue";
  186. import AvatarImageComponent from "src/components/shared/AvatarImageComponent.vue";
  187. import StateSelect from "src/components/selects/StateSelect.vue";
  188. import CitySelect from "src/components/selects/CitySelect.vue";
  189. import { useSubmitHandler } from "src/composables/useSubmitHandler";
  190. import { useInputRules } from "src/composables/useInputRules";
  191. import { createUnit, getUnit, updateUnit } from "src/api/unit";
  192. import masks from "src/helpers/masks";
  193. const props = defineProps({
  194. unitId: {
  195. type: Number,
  196. default: null,
  197. },
  198. getFormAsFormData: {
  199. type: Function,
  200. required: true,
  201. },
  202. setUpdateFormAsOriginal: {
  203. type: Function,
  204. required: true,
  205. },
  206. });
  207. const form = defineModel("form", { type: Object, required: true });
  208. const router = useRouter();
  209. const formRef = ref(null);
  210. const avatarRef = ref(null);
  211. const stateSelectRef = ref(null);
  212. const citySelectRef = ref(null);
  213. const selectedState = ref(null);
  214. const selectedCity = ref(null);
  215. const { inputRules } = useInputRules();
  216. watch(selectedState, (state) => {
  217. form.value.state_id = state?.value ?? null;
  218. });
  219. watch(selectedCity, (city) => {
  220. form.value.city_id = city?.value ?? null;
  221. });
  222. function onAvatarChange(file) {
  223. form.value.avatar = file;
  224. }
  225. onMounted(async () => {
  226. if (!props.unitId) return;
  227. try {
  228. const unit = await getUnit(props.unitId);
  229. form.value.name = unit.name;
  230. const fantasyName = String(unit.fantasy_name ?? "").trim();
  231. form.value.fantasy_name = ["null", "undefined"].includes(
  232. fantasyName.toLowerCase(),
  233. )
  234. ? ""
  235. : fantasyName;
  236. form.value.social_reason = unit.social_reason;
  237. form.value.cnpj = unit.cnpj;
  238. form.value.state_registration = unit.state_registration;
  239. form.value.name_responsible = unit.name_responsible;
  240. form.value.street = unit.street;
  241. form.value.address_number = unit.address_number;
  242. form.value.postal_code = unit.postal_code;
  243. form.value.neighborhood = unit.neighborhood;
  244. form.value.complement = unit.complement;
  245. form.value.email = unit.email;
  246. form.value.secondary_email = unit.secondary_email;
  247. form.value.phone_number = unit.phone_number;
  248. form.value.cell_number = unit.cell_number;
  249. form.value.state_id = unit.state_id;
  250. form.value.city_id = unit.city_id;
  251. if (unit.state_id) {
  252. stateSelectRef.value?.selectStateById(unit.state_id);
  253. }
  254. if (unit.city_id) {
  255. citySelectRef.value?.selectCityById(unit.city_id);
  256. }
  257. if (unit.avatar_url) {
  258. avatarRef.value?.setImageUrl(unit.avatar_url);
  259. }
  260. props.setUpdateFormAsOriginal();
  261. } catch (e) {
  262. console.error(e);
  263. }
  264. });
  265. const { loading, validationErrors, execute } = useSubmitHandler({
  266. formRef,
  267. onSuccess: (result) => {
  268. if (props.unitId) {
  269. router.push({ name: "FranchiseePage" });
  270. } else {
  271. router.push({ name: "UnitEditPage", params: { id: result.id } });
  272. }
  273. },
  274. });
  275. async function onSave() {
  276. await execute(() => {
  277. const formData = props.getFormAsFormData();
  278. if (props.unitId) {
  279. return updateUnit(props.unitId, formData);
  280. }
  281. return createUnit(formData);
  282. });
  283. }
  284. function onCancel() {
  285. router.push({ name: "FranchiseePage" });
  286. }
  287. </script>