Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <script lang="ts">
- import type { InjectionKey } from "vue";
- import ModalForm from "./ModalForm.vue";
- import { useRoute } from "vue-router";
- export interface StateT {
- company_name: string;
- company_code: string;
- rec_account: string;
- rec_account_uuid: string;
- }
- export const stateKey: InjectionKey<Ref<StateT>> = Symbol("form.state");
- </script>
- <script setup lang="ts">
- import { isPageAdd } from "~~/shared/utils";
- import { useForm } from "vee-validate";
- import { getRegistrationSchema } from "@vendor/schemas/registration/registrationByGuestSchema";
- import { useToast } from "@app/composables/useToast";
- import { FetchError } from "ofetch";
- import SelectCompany from "./SelectCompany.vue";
- import SelectAccountGroup from "./SelectAccountGroup.vue";
- import SelectRecAccount from "./SelectRecAccount.vue";
- import SelectCategory from "./SelectCategory.vue";
- const { t } = useI18n();
- const { toast } = useToast();
- definePageMeta({
- layout: "registration",
- });
- const route = useRoute();
- const regionTypeName = ref<"Lokal" | "Internasional">("Lokal");
- const { resetForm, values } = useForm({
- validationSchema: computed(() => getRegistrationSchema(regionTypeName.value)),
- initialValues: {
- business_region_type_name: "Lokal",
- },
- });
- const isUpdate = computed(() => !isPageAdd(route.path));
- const token = ref(null);
- token.value = localStorage.getItem("sanctum.storage.token");
- const config = useRuntimeConfig();
- const idCreate = ref();
- const usernameCreate = ref();
- const passwordCreate = ref();
- const state = ref<StateT>({
- company_name: "",
- company_code: "",
- account_group: "",
- rec_account: "",
- business_type_uuid: "",
- });
- const isLoading = ref(false);
- const showModal = ref(false);
- const showModalSuccess = ref(false);
- const formModel = reactive({
- company_uuid: "",
- full_address: "",
- pic_email: "",
- business_region_type_uuid: "",
- tax_identification_number: "",
- business_type_uuid: "",
- phone_number: "",
- country_uuid: "",
- bp_role: "",
- province_uuid: "",
- district_uuid: "",
- subdistrict_uuid: "",
- purch_org: "",
- note: "",
- village_uuid: "",
- postal_code_uuid: "",
- account_group_uuid: "",
- });
- const path = isPageAdd(route.path)
- ? `${config.public.apiBaseUrl}/api/v1/vendor/register/internal`
- : `${config.public.apiBaseUrl}/api/v1/vendors/updateVendor/${route.params.id}`;
- provide(stateKey, state);
- watch(
- () => values.business_region_type_name,
- (val) => {
- if (val === "Lokal" || val === "Internasional") {
- regionTypeName.value = val;
- }
- },
- { immediate: true },
- );
- async function onSubmit(event: any) {
- event.preventDefault();
- try {
- const postData = {
- ...formModel,
- name: state.value.company_name,
- pic_name: state.value.company_name,
- pic_phone_number: formModel.phone_number,
- email: formModel.pic_email,
- account_group: state.value.account_group,
- rec_account_uuid: state.value.rec_account_uuid,
- rec_account: state.value.rec_account,
- };
- const { return: _data, status } = await $fetch(path, {
- method: isPageAdd(route.path) ? "POST" : "PUT",
- body: postData,
- headers: {
- authorization: `Bearer ${token.value}`,
- },
- server: false,
- });
- if (status) {
- showModal.value = false;
- showModalSuccess.value = true;
- idCreate.value = _data?.id;
- usernameCreate.value = _data?.username;
- passwordCreate.value = _data?.password;
- }
- } catch (error: any) {
- showModal.value = false;
- if (error instanceof FetchError && error.response && error.response.status === 422) {
- const validationErrors = error.response._data.errors; // Access _data for the response body
- const errors = Object.values(error.response._data.errors as ValidationErrors).flat();
- const message = errors.map((msg) => `• ${msg}`).join("\n");
- toast.error(message);
- console.error("Validation Errors:", validationErrors);
- } else {
- console.error("Other API Error:", error);
- }
- } finally {
- showModal.value = false;
- }
- }
- async function handlingResetForm() {
- state.value.company_name = "";
- state.value.company_code = "";
- state.value.account_group = "";
- state.value.rec_account = "";
- formModel.company_uuid = "";
- formModel.full_address = "";
- formModel.pic_email = "";
- formModel.business_region_type_uuid = "";
- formModel.tax_identification_number = "";
- formModel.business_type_uuid = "";
- formModel.phone_number = "";
- formModel.country_uuid = "";
- formModel.bp_role = "";
- formModel.province_uuid = "";
- formModel.district_uuid = "";
- formModel.subdistrict_uuid = "";
- formModel.purch_org = "";
- formModel.note = "";
- formModel.village_uuid = "";
- formModel.postal_code_uuid = "";
- formModel.account_group_uuid = "";
- formModel.rec_account_uuid = "";
- showModalSuccess.value = false;
- }
- async function fetchData() {
- try {
- isLoading.value = false;
- const { return: _data } = await $fetch(
- `${config.public.apiBaseUrl}/api/v1/vendors/getVendorById/${route.params.id}`,
- {
- method: "GET",
- headers: {
- authorization: `Bearer ${token.value}`,
- },
- server: false,
- },
- );
- console.log(_data.business_type?.uuid);
- formModel.company_uuid = "";
- formModel.full_address = _data.address.full_address ?? "";
- formModel.pic_email = _data.email ?? "";
- formModel.business_region_type_uuid = "";
- formModel.tax_identification_number = "";
- formModel.business_type_uuid = _data.business_type?.uuid ?? "";
- formModel.phone_number = _data.address?.phone_number ?? "";
- formModel.account_group = "";
- formModel.country_uuid = "";
- formModel.bp_role = _data.bp_role;
- formModel.province_uuid = "";
- state.value.rec_account = _data.rec_account?.uuid;
- formModel.district_uuid = "";
- formModel.subdistrict_uuid = "";
- formModel.purch_org = _data.purch_org;
- formModel.note = _data.note;
- formModel.village_uuid = "";
- formModel.postal_code_uuid = "";
- } catch (error: any) {
- isLoading.value = false;
- } finally {
- isLoading.value = false;
- }
- }
- onMounted(() => {
- if (!isUpdate.value) {
- return;
- }
- fetchData();
- });
- </script>
- <template>
- <div>
- <Card class="shadow-none border-0" v-if="!isLoading">
- <CardContent class="px-4 py-8">
- <form id="formRegistration">
- <div
- class="grid md:grid-cols-2 gap-5"
- :class="{
- 'lg:grid-rows-11': values.business_region_type_name === 'Lokal',
- 'lg:grid-rows-10': values.business_region_type_name === 'Internasional',
- }"
- >
- <MoleculeInputDropdown
- v-slot="{ componentField }"
- :label="t('company')"
- name="company_uuid"
- v-model="formModel.company_uuid"
- :required="true"
- >
- <SelectCompany v-bind="componentField" as-form-field />
- </MoleculeInputDropdown>
- <MoleculeInputText
- :label="t('address')"
- name="full_address"
- v-model="formModel.full_address"
- :required="true"
- />
- <MoleculeInputText
- :label="t('pic-email')"
- name="pic_email"
- v-model="formModel.pic_email"
- :required="true"
- />
- <MoleculeInputDropdown
- v-slot="{ componentField }"
- :label="t('vendor-type')"
- name="business_region_type_uuid"
- v-model="formModel.business_region_type_uuid"
- :required="true"
- >
- <MoleculeSelectVendorRegionType v-bind="componentField" as-form-field />
- </MoleculeInputDropdown>
- <MoleculeInputText
- :label="t('tax-registration-number')"
- name="tax_identification_number"
- v-model="formModel.tax_identification_number"
- :required="true"
- />
- <MoleculeInputDropdown
- v-slot="{ componentField }"
- :label="t('vendor-classification')"
- name="business_type_uuid"
- v-model="formModel.business_type_uuid"
- :required="true"
- >
- <SelectCategory v-bind="componentField" as-form-field />
- </MoleculeInputDropdown>
- <MoleculeInputText
- :label="t('phone-number')"
- name="phone_number"
- v-model="formModel.phone_number"
- :required="true"
- />
- <MoleculeInputDropdown
- v-slot="{ componentField }"
- :label="t('vendor-account-group')"
- name="vendor_account_group"
- v-model="formModel.account_group_uuid"
- :required="true"
- >
- <SelectAccountGroup v-bind="componentField" as-form-field />
- </MoleculeInputDropdown>
- <MoleculeInputDropdown
- v-slot="{ componentField }"
- :label="t('country')"
- name="country_uuid"
- v-model="formModel.country_uuid"
- :required="true"
- >
- <MoleculeSelectCountry v-bind="componentField" as-form-field />
- </MoleculeInputDropdown>
- <MoleculeInputText
- :label="t('bp-role')"
- name="bp_role"
- v-model="formModel.bp_role"
- :required="true"
- />
- <MoleculeInputDropdown
- v-if="values.business_region_type_name === 'Lokal'"
- v-slot="{ componentField }"
- :label="t('province')"
- name="province_uuid"
- v-model="formModel.province_uuid"
- :required="true"
- >
- <MoleculeSelectProvince
- v-bind="componentField"
- :countryUuid="formModel.country_uuid"
- as-form-field
- />
- </MoleculeInputDropdown>
- <MoleculeInputDropdown
- v-slot="{ componentField }"
- :label="t('rec-account')"
- name="rec_account"
- :required="true"
- >
- <SelectRecAccount v-bind="componentField" as-form-field />
- </MoleculeInputDropdown>
- <MoleculeInputDropdown
- v-if="values.business_region_type_name === 'Lokal'"
- v-slot="{ componentField }"
- :label="t('district_reg')"
- name="district_uuid"
- v-model="formModel.district_uuid"
- :required="true"
- >
- <MoleculeSelectDistrict
- v-bind="componentField"
- :provinceUuid="formModel.province_uuid"
- as-form-field
- />
- </MoleculeInputDropdown>
- <MoleculeInputText
- :label="t('company-code')"
- :required="true"
- :disable="true"
- v-model="state.company_code"
- />
- <MoleculeInputDropdown
- v-if="values.business_region_type_name === 'Lokal'"
- v-slot="{ componentField }"
- :label="t('sub-district')"
- name="subdistrict_uuid"
- v-model="formModel.subdistrict_uuid"
- :required="true"
- >
- <MoleculeSelectSubDistrict
- v-bind="componentField"
- :districtUuid="formModel.district_uuid"
- as-form-field
- />
- </MoleculeInputDropdown>
- <MoleculeInputText
- :label="t('purch-org')"
- name="purch_org"
- v-model="formModel.purch_org"
- :required="true"
- />
- <MoleculeInputDropdown
- v-if="values.business_region_type_name === 'Lokal'"
- v-slot="{ componentField }"
- :label="t('village')"
- name="village_uuid"
- v-model="formModel.village_uuid"
- :required="true"
- >
- <MoleculeSelectVillage
- v-bind="componentField"
- :subdistrictUuid="formModel.subdistrict_uuid"
- as-form-field
- />
- </MoleculeInputDropdown>
- <MoleculeInputDropdown
- v-if="values.business_region_type_name === 'Lokal'"
- v-slot="{ componentField }"
- :label="t('postal-code')"
- name="postal_code_uuid"
- v-model="formModel.postal_code_uuid"
- :required="true"
- >
- <MoleculeSelectPostalCode
- v-bind="componentField"
- :subdistrictUuid="formModel.subdistrict_uuid"
- as-form-field
- />
- </MoleculeInputDropdown>
- <div class="col-span-2">
- <MoleculeInputTextArea
- :label="t('note')"
- name="note"
- v-model="formModel.note"
- :required="true"
- />
- </div>
- <MoleculeInputText
- v-if="values.business_type_name === 'Lainnya'"
- :label="t('Other Business Category')"
- name="other_business_type"
- :required="true"
- />
- <!-- Internatioinal -->
- <MoleculeInputText
- v-if="values.business_region_type_name === 'Internasional'"
- :label="t('province')"
- name="other_province"
- :required="true"
- />
- <MoleculeInputText
- v-if="values.business_region_type_name === 'Internasional'"
- :label="t('district')"
- name="other_district"
- :required="true"
- />
- <MoleculeInputText
- v-if="values.business_region_type_name === 'Internasional'"
- :label="t('sub-district')"
- name="other_subdistrict"
- :required="true"
- />
- <MoleculeInputText
- v-if="values.business_region_type_name === 'Internasional'"
- :label="t('postal-code')"
- name="other_postal_code"
- :required="false"
- />
- <MoleculeInputText
- v-if="values.business_region_type_name === 'Internasional'"
- :label="t('passport-number')"
- name="pic_identity_number"
- :required="true"
- />
- <!-- End of internatioinal -->
- </div>
- <div class="mt-5 flex flex-col md:flex-row md:justify-center gap-4">
- <button
- type="button"
- class="w-full md:max-w-96 bg-[#D2D2D2] hover:bg-[#BDBDBD] text-black rounded-[0.375rem] cursor-pointer"
- @click="
- () => {
- resetForm();
- $router.push($localePath('/vendor/registration'));
- }
- "
- >
- {{ t("cancel") }}
- </button>
- <Button
- @click="() => (showModal = true)"
- type="button"
- class="w-full md:max-w-96 bg-[#FF9700] hover:bg-orange-500 text-white rounded-[0.375rem] cursor-pointer"
- >
- {{ t("submit") }}
- </Button>
- </div>
- </form>
- </CardContent>
- </Card>
- <ModalForm v-model="showModal" :isForm="false" :useHeader="false">
- <template v-slot:header>
- <div class="flex justify-end">
- <button @click="() => (showModal = false)" class="text-gray-400 hover:text-gray-600">
- ✕
- </button>
- </div>
- </template>
- <slot>
- <div class="flex flex-col w-full space-y-2">
- <div class="flex justify-center">
- <img src="/icon/file-check.png" alt="icon" />
- </div>
- <p class="text-center text-[#FF9700] font-light text-lg">SUBMIT CONFIRMATION</p>
- <p class="text-center font-light">Are you sure you want to send this data?</p>
- </div>
- </slot>
- <template v-slot:footer>
- <div class="flex justify-center space-x-2 mt-5">
- <Button
- type="button"
- class="bg-[#ED1C24] hover:bg-red-700 text-white rounded-[0.375rem] cursor-pointer"
- @click="() => (showModal = false)"
- >
- {{ t("cancel") }}
- </Button>
- <Button
- type="button"
- class="bg-[#2FCA5E] text-white rounded-[0.375rem] cursor-pointer hover:bg-green-500"
- @click="onSubmit"
- >
- {{ t("submit") }}
- </Button>
- </div>
- </template>
- </ModalForm>
- <ModalForm v-model="showModalSuccess" :isForm="false" :useHeader="false">
- <template v-slot:header>
- <div class="flex justify-end">
- <button
- @click="() => (showModalSuccess = false)"
- class="text-gray-400 hover:text-gray-600"
- >
- ✕
- </button>
- </div>
- </template>
- <slot>
- <div class="flex flex-col w-full space-y-2">
- <div class="flex justify-center">
- <img src="/icon/checklist-success.png" alt="icon" />
- </div>
- <p class="text-center text-[#2FCA5E] font-light text-lg">SUCCESS</p>
- <p class="text-center font-light my-5">Thank you for your request</p>
- <div class="my-3">
- <p class="text-center font-light">Username and Password Have Been Created</p>
- <p class="text-center font-light">The following is the Business Partner</p>
- </div>
- <p class="text-center font-light my-5">Business Partner Number : {{ idCreate }}</p>
- <p class="text-center font-light">Username : {{ usernameCreate }}</p>
- <p class="text-center font-light">Password : {{ passwordCreate }}</p>
- </div>
- </slot>
- <template v-slot:footer>
- <div class="flex justify-center space-x-2 mt-5">
- <Button
- type="button"
- class="bg-[#ED1C24] hover:bg-red-700 text-white rounded-[0.375rem] cursor-pointer"
- @click="handlingResetForm"
- >
- {{ t("cancel") }}
- </Button>
- </div>
- </template>
- </ModalForm>
- </div>
- </template>
Advertisement
Add Comment
Please, Sign In to add comment