feat(contacts): add country field to customer and vendor address forms

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Ahmed Bouhuolia
2026-02-24 20:53:14 +02:00
parent fb05af8c00
commit f149ff43b4
12 changed files with 61 additions and 38 deletions

View File

@@ -27,20 +27,20 @@ const CustomerBillingAddress = ({}) => {
{/*------------ Billing Address 1 -----------*/}
<FFormGroup
name={'billing_address_1'}
name={'billing_address1'}
label={<T id={'address_line_1'} />}
inline={true}
>
<FTextArea name={'billing_address_1'} />
<FTextArea name={'billing_address1'} />
</FFormGroup>
{/*------------ Billing Address 2 -----------*/}
<FFormGroup
name={'billing_address_2'}
name={'billing_address2'}
label={<T id={'address_line_2'} />}
inline={true}
>
<FTextArea name={'billing_address_2'} />
<FTextArea name={'billing_address2'} />
</FFormGroup>
{/*------------ Billing Address city -----------*/}
<FFormGroup
@@ -93,20 +93,20 @@ const CustomerBillingAddress = ({}) => {
{/*------------ Shipping Address 1 -----------*/}
<FFormGroup
name={'shipping_address_1'}
name={'shipping_address1'}
label={<T id={'address_line_1'} />}
inline={true}
>
<FTextArea name={'shipping_address_1'} />
<FTextArea name={'shipping_address1'} />
</FFormGroup>
{/*------------ Shipping Address 2 -----------*/}
<FFormGroup
name={'shipping_address_2'}
name={'shipping_address2'}
label={<T id={'address_line_2'} />}
inline={true}
>
<FTextArea name={'shipping_address_2'} />
<FTextArea name={'shipping_address2'} />
</FFormGroup>
{/*------------ Shipping Address city -----------*/}

View File

@@ -25,16 +25,16 @@ const Schema = Yup.object().shape({
note: Yup.string().trim(),
billing_address_country: Yup.string().trim(),
billing_address_1: Yup.string().trim(),
billing_address_2: Yup.string().trim(),
billing_address1: Yup.string().trim(),
billing_address2: Yup.string().trim(),
billing_address_city: Yup.string().trim(),
billing_address_state: Yup.string().trim(),
billing_address_postcode: Yup.string().nullable(),
billing_address_phone: Yup.string().nullable(),
shipping_address_country: Yup.string().trim(),
shipping_address_1: Yup.string().trim(),
shipping_address_2: Yup.string().trim(),
shipping_address1: Yup.string().trim(),
shipping_address2: Yup.string().trim(),
shipping_address_city: Yup.string().trim(),
shipping_address_state: Yup.string().trim(),
shipping_address_postcode: Yup.string().nullable(),

View File

@@ -8,7 +8,7 @@ import styled from 'styled-components';
import { CLASSES } from '@/constants/classes';
import { CreateCustomerForm, EditCustomerForm } from './CustomerForm.schema';
import { compose, transformToForm, saveInvoke } from '@/utils';
import { compose, transformToForm, saveInvoke, parseBoolean } from '@/utils';
import { useCustomerFormContext } from './CustomerFormProvider';
import { defaultInitialValues } from './utils';
@@ -60,7 +60,10 @@ function CustomerFormFormik({
// Handles the form submit.
const handleFormSubmit = (values, formArgs) => {
const { setSubmitting, resetForm } = formArgs;
const formValues = { ...values };
const formValues = {
...values,
active: parseBoolean(values.active, true),
};
const onSuccess = (res) => {
AppToaster.show({

View File

@@ -55,7 +55,7 @@ export default function CustomerFormPrimarySection({}) {
label={<T id={'company_name'} />}
inline={true}
>
<InputGroup name={'company_name'} />
<FInputGroup name={'company_name'} />
</FFormGroup>
{/*----------- Display Name -----------*/}

View File

@@ -23,16 +23,16 @@ export const defaultInitialValues = {
active: true,
billing_address_country: '',
billing_address_1: '',
billing_address_2: '',
billing_address1: '',
billing_address2: '',
billing_address_city: '',
billing_address_state: '',
billing_address_postcode: '',
billing_address_phone: '',
shipping_address_country: '',
shipping_address_1: '',
shipping_address_2: '',
shipping_address1: '',
shipping_address2: '',
shipping_address_city: '',
shipping_address_state: '',
shipping_address_postcode: '',

View File

@@ -18,16 +18,16 @@ const Schema = Yup.object().shape({
note: Yup.string().trim(),
billing_address_country: Yup.string().trim(),
billing_address_1: Yup.string().trim(),
billing_address_2: Yup.string().trim(),
billing_address1: Yup.string().trim(),
billing_address2: Yup.string().trim(),
billing_address_city: Yup.string().trim(),
billing_address_state: Yup.string().trim(),
billing_address_postcode: Yup.string().nullable(),
billing_address_phone: Yup.string().nullable(),
shipping_address_country: Yup.string().trim(),
shipping_address_1: Yup.string().trim(),
shipping_address_2: Yup.string().trim(),
shipping_address1: Yup.string().trim(),
shipping_address2: Yup.string().trim(),
shipping_address_city: Yup.string().trim(),
shipping_address_state: Yup.string().trim(),
shipping_address_postcode: Yup.string().nullable(),

View File

@@ -21,7 +21,7 @@ import VendorFloatingActions from './VendorFloatingActions';
import { withCurrentOrganization } from '@/containers/Organization/withCurrentOrganization';
import { useVendorFormContext } from './VendorFormProvider';
import { compose, transformToForm, safeInvoke } from '@/utils';
import { compose, transformToForm, safeInvoke, parseBoolean } from '@/utils';
import { defaultInitialValues } from './utils';
import '@/style/pages/Vendors/Form.scss';
@@ -69,7 +69,10 @@ function VendorFormFormik({
// Handles the form submit.
const handleFormSubmit = (values, form) => {
const { setSubmitting, resetForm } = form;
const requestForm = { ...values };
const requestForm = {
...values,
active: parseBoolean(values.active, true),
};
setSubmitting(true);

View File

@@ -22,16 +22,16 @@ export const defaultInitialValues = {
active: true,
billing_address_country: '',
billing_address_1: '',
billing_address_2: '',
billing_address1: '',
billing_address2: '',
billing_address_city: '',
billing_address_state: '',
billing_address_postcode: '',
billing_address_phone: '',
shipping_address_country: '',
shipping_address_1: '',
shipping_address_2: '',
shipping_address1: '',
shipping_address2: '',
shipping_address_city: '',
shipping_address_state: '',
shipping_address_postcode: '',

View File

@@ -84,6 +84,20 @@ export const handleBooleanChange = (handler) => {
return (event) => handler(event.target.checked);
};
/**
* Parses a value to boolean (handles 1, 0, '1', '0', true, false).
* @param {*} value
* @param {boolean} defaultValue - value when empty/unknown
* @returns {boolean}
*/
export const parseBoolean = (value, defaultValue = false) => {
if (typeof value === 'boolean') return value;
if (value === 1 || value === '1') return true;
if (value === 0 || value === '0') return false;
if (value == null || value === '') return defaultValue;
return Boolean(value);
};
/** Event handler that exposes the target element's value as a string. */
export const handleStringChange = (handler) => {
return (event) => handler(event.target.value);