jcloud/dashboard/src2/components/UpdateBillingDetails.vue
2025-04-12 17:39:38 +08:00

116 lines
2.8 KiB
Vue

<template>
<Dialog
:options="{
title: '更新账单详情',
actions: [
{
label: '提交',
variant: 'solid',
loading: $resources.updateBillingInformation.loading,
onClick: () => $resources.updateBillingInformation.submit()
}
]
}"
:modelValue="show"
@update:modelValue="$emit('update:show', $event)"
>
<template v-slot:body-content>
<p class="mb-5 text-sm text-gray-700" v-if="message">
{{ message }}
</p>
<FormControl
class="mt-4"
v-model="billingInformation.billing_name"
label="账单名称"
/>
<AddressForm
ref="address-form"
class="mt-4"
v-model:address="billingInformation"
/>
<ErrorMessage
class="mt-2"
:message="$resources.updateBillingInformation.error"
/>
</template>
</Dialog>
</template>
<script>
import { DashboardError } from '../utils/error';
import AddressForm from './AddressForm.vue';
import { toast } from 'vue-sonner';
export default {
name: 'UpdateBillingDetails',
props: ['message', 'show'],
emits: ['update:show', 'updated'],
components: {
AddressForm
},
data() {
return {
billingInformation: {
address: '',
city: '',
state: '',
postal_code: '',
country: '',
gstin: '',
billing_name: ''
}
};
},
resources: {
currentBillingInformation() {
return {
url: 'jcloud.api.account.get_billing_information',
auto: true,
onSuccess(billingInformation) {
if ('country' in (billingInformation || {})) {
Object.assign(this.billingInformation, {
address: billingInformation.address_line1,
city: billingInformation.city,
state: billingInformation.state,
postal_code: billingInformation.pincode,
country: billingInformation.country,
gstin:
billingInformation.gstin == 'Not Applicable'
? ''
: billingInformation.gstin,
billing_name: billingInformation.billing_name
});
}
}
};
},
updateBillingInformation() {
return {
url: 'jcloud.api.account.update_billing_information',
makeParams() {
return {
billing_details: this.billingInformation
};
},
onSuccess() {
this.$emit('update:show', false);
toast.success('地址更新成功!');
this.$emit('updated');
},
validate() {
var billing_name = this.billingInformation.billing_name.trim();
var billingNameRegex = /^[a-zA-Z0-9\-\'\,\.\s]+$/;
var billingNameValid = billingNameRegex.test(billing_name);
if (!billingNameValid) {
throw new DashboardError(
'账单名称包含无效字符'
);
}
this.billingInformation.billing_name = billing_name;
return this.$refs['address-form'].validateValues();
}
};
}
}
};
</script>