File "AddressInformation-20250316194028.vue"
Full Path: /home/pulsehostuk9/public_html/invoicer.pulsehost.co.uk/resources/scripts/customer/views/settings/AddressInformation-20250316194028.vue
File size: 8.19 KB
MIME-type: text/plain
Charset: utf-8
<template>
<form class="relative h-full mt-4" @submit.prevent="UpdateCustomerAddress">
<BaseCard>
<div class="mb-6">
<h6 class="font-bold text-left">
{{ $t('settings.menu_title.address_information') }}
</h6>
<p
class="mt-2 text-sm leading-snug text-left text-gray-500"
style="max-width: 680px"
>
{{ $t('settings.address_information.section_description') }}
</p>
</div>
<!-- Billing Address -->
<div class="grid grid-cols-5 gap-4 mb-8">
<h6 class="col-span-5 text-lg font-semibold text-left lg:col-span-1">
{{ $t('customers.billing_address') }}
</h6>
<div
class="grid col-span-5 lg:col-span-4 gap-y-6 gap-x-4 md:grid-cols-6"
>
<BaseInputGroup
:label="$t('customers.name')"
class="w-full md:col-span-3"
>
<BaseInput
v-model.trim="userStore.userForm.billing.name"
type="text"
class="w-full"
name="address_name"
/>
</BaseInputGroup>
<BaseInputGroup
:label="$t('customers.country')"
class="md:col-span-3"
>
<BaseMultiselect
v-model="userStore.userForm.billing.country_id"
value-prop="id"
label="name"
track-by="name"
resolve-on-load
searchable
:options="globalStore.countries"
:placeholder="$t('general.select_country')"
class="w-full"
/>
</BaseInputGroup>
<BaseInputGroup :label="$t('customers.state')" class="md:col-span-3">
<BaseInput
v-model="userStore.userForm.billing.state"
name="billing.state"
type="text"
/>
</BaseInputGroup>
<BaseInputGroup :label="$t('customers.city')" class="md:col-span-3">
<BaseInput
v-model="userStore.userForm.billing.city"
name="billing.city"
type="text"
/>
</BaseInputGroup>
<BaseInputGroup
:label="$t('customers.address')"
class="md:col-span-3"
>
<BaseTextarea
v-model.trim="userStore.userForm.billing.address_street_1"
:placeholder="$t('general.street_1')"
type="text"
name="billing_street1"
:container-class="`mt-3`"
/>
<BaseTextarea
v-model.trim="userStore.userForm.billing.address_street_2"
:placeholder="$t('general.street_2')"
type="text"
class="mt-3"
name="billing_street2"
:container-class="`mt-3`"
/>
</BaseInputGroup>
<div class="md:col-span-3">
<BaseInputGroup :label="$t('customers.phone')" class="text-left">
<BaseInput
v-model.trim="userStore.userForm.billing.phone"
type="text"
name="phone"
/>
</BaseInputGroup>
<BaseInputGroup
:label="$t('customers.zip_code')"
class="mt-2 text-left"
>
<BaseInput
v-model.trim="userStore.userForm.billing.zip"
type="text"
name="zip"
/>
</BaseInputGroup>
</div>
</div>
</div>
<BaseDivider class="mb-5 md:mb-8" />
<!-- Billing Address Copy Button -->
<div class="flex items-center justify-start mb-6 md:justify-end md:mb-0">
<div class="p-1">
<BaseButton
ref="sameAddress"
type="button"
@click="userStore.copyAddress(true)"
>
<template #left="slotProps">
<BaseIcon name="DocumentDuplicateIcon" :class="slotProps.class" />
</template>
{{ $t('customers.copy_billing_address') }}
</BaseButton>
</div>
</div>
<!-- Shipping Address -->
<div class="grid grid-cols-5 gap-4 mb-8">
<h6 class="col-span-5 text-lg font-semibold text-left lg:col-span-1">
{{ $t('customers.shipping_address') }}
</h6>
<div
v-if="userStore.userForm.shipping"
class="grid col-span-5 lg:col-span-4 gap-y-6 gap-x-4 md:grid-cols-6"
>
<BaseInputGroup :label="$t('customers.name')" class="md:col-span-3">
<BaseInput
v-model.trim="userStore.userForm.shipping.name"
type="text"
name="address_name"
/>
</BaseInputGroup>
<BaseInputGroup
:label="$t('customers.country')"
class="md:col-span-3"
>
<BaseMultiselect
v-model="userStore.userForm.shipping.country_id"
value-prop="id"
label="name"
track-by="name"
resolve-on-load
searchable
:options="globalStore.countries"
:placeholder="$t('general.select_country')"
class="w-full"
/>
</BaseInputGroup>
<BaseInputGroup :label="$t('customers.state')" class="md:col-span-3">
<BaseInput
v-model="userStore.userForm.shipping.state"
name="shipping.state"
type="text"
/>
</BaseInputGroup>
<BaseInputGroup :label="$t('customers.city')" class="md:col-span-3">
<BaseInput
v-model="userStore.userForm.shipping.city"
name="shipping.city"
type="text"
/>
</BaseInputGroup>
<BaseInputGroup
:label="$t('customers.address')"
class="md:col-span-3"
>
<BaseTextarea
v-model.trim="userStore.userForm.shipping.address_street_1"
type="text"
:placeholder="$t('general.street_1')"
name="shipping_street1"
/>
<BaseTextarea
v-model.trim="userStore.userForm.shipping.address_street_2"
type="text"
:placeholder="$t('general.street_2')"
name="shipping_street2"
class="mt-3"
/>
</BaseInputGroup>
<div class="md:col-span-3">
<BaseInputGroup :label="$t('customers.phone')" class="text-left">
<BaseInput
v-model.trim="userStore.userForm.shipping.phone"
type="text"
name="phone"
/>
</BaseInputGroup>
<BaseInputGroup
:label="$t('customers.zip_code')"
class="mt-2 text-left"
>
<BaseInput
v-model.trim="userStore.userForm.shipping.zip"
type="text"
name="zip"
/>
</BaseInputGroup>
</div>
</div>
</div>
<div class="flex items-center justify-end">
<BaseButton :loading="isSaving" :disabled="isSaving">
<template #left="slotProps">
<BaseIcon
v-if="!isSaving"
name="SaveIcon"
:class="slotProps.class"
/>
</template>
{{ $t('general.save') }}
</BaseButton>
</div>
</BaseCard>
</form>
</template>
<script setup>
import { useUserStore } from '@/scripts/customer/stores/user'
import { useGlobalStore } from '@/scripts/customer/stores/global'
import { useI18n } from 'vue-i18n'
import { useRoute } from 'vue-router'
import { ref } from 'vue'
//store
const userStore = useUserStore()
const route = useRoute()
const { tm, t } = useI18n()
const globalStore = useGlobalStore()
// local state
let isSaving = ref(false)
// created
globalStore.fetchCountries()
// methods
function UpdateCustomerAddress() {
isSaving.value = true
let data = userStore.userForm
userStore
.updateCurrentUser({
data,
message: tm('customers.address_updated_message'),
})
.then((res) => {
isSaving.value = false
})
.catch((err) => {
isSaving.value = false
})
}
</script>