mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-18 05:40:31 +00:00
Fix: Change Customer & Vendor List to ContactSelectList
This commit is contained in:
63
client/src/components/ContactSelecetList.js
Normal file
63
client/src/components/ContactSelecetList.js
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
import React, { useCallback, useState, useEffect, useMemo } from 'react';
|
||||||
|
import { FormattedMessage as T } from 'react-intl';
|
||||||
|
import { ListSelect } from 'components';
|
||||||
|
import { MenuItem } from '@blueprintjs/core';
|
||||||
|
|
||||||
|
export default function ContactSelecetList({
|
||||||
|
contactsList,
|
||||||
|
selectedContactId,
|
||||||
|
defaultSelectText = <T id={'select_contact'} />,
|
||||||
|
onContactSelected,
|
||||||
|
// disabled = false,
|
||||||
|
...restProps
|
||||||
|
}) {
|
||||||
|
const [selecetedContact, setSelectedContact] = useState(null);
|
||||||
|
|
||||||
|
// Filter Contact List
|
||||||
|
const FilterContacts = (query, contact, index, exactMatch) => {
|
||||||
|
const normalizedTitle = contact.display_name.toLowerCase();
|
||||||
|
const normalizedQuery = query.toLowerCase();
|
||||||
|
if (exactMatch) {
|
||||||
|
return normalizedTitle === normalizedQuery;
|
||||||
|
} else {
|
||||||
|
return (
|
||||||
|
`${contact.display_name} ${normalizedTitle}`.indexOf(normalizedQuery) >=
|
||||||
|
0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const onContactSelect = useCallback(
|
||||||
|
(contact) => {
|
||||||
|
setSelectedContact({ ...contact });
|
||||||
|
onContactSelected && onContactSelected(contact);
|
||||||
|
},
|
||||||
|
[setSelectedContact, onContactSelected],
|
||||||
|
);
|
||||||
|
|
||||||
|
const handleContactRenderer = useCallback(
|
||||||
|
(contact, { handleClick }) => (
|
||||||
|
<MenuItem
|
||||||
|
key={contact.id}
|
||||||
|
text={contact.display_name}
|
||||||
|
onClick={handleClick}
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
[],
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ListSelect
|
||||||
|
items={contactsList}
|
||||||
|
selectedItemProp={'id'}
|
||||||
|
selectedItem={selectedContactId}
|
||||||
|
labelProp={'display_name'}
|
||||||
|
defaultText={defaultSelectText}
|
||||||
|
onItemSelect={onContactSelect}
|
||||||
|
itemPredicate={FilterContacts}
|
||||||
|
itemRenderer={handleContactRenderer}
|
||||||
|
popoverProps={{ minimal: true }}
|
||||||
|
{...restProps}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
import React, { useCallback } from 'react';
|
|
||||||
import { FormattedMessage as T } from 'react-intl';
|
|
||||||
import { ListSelect } from 'components';
|
|
||||||
import { MenuItem } from '@blueprintjs/core';
|
|
||||||
|
|
||||||
export default function VendorSelecetList({
|
|
||||||
vendorsList,
|
|
||||||
selectedVendorId,
|
|
||||||
defaultSelectText = <T id={'select_vender_account'} />,
|
|
||||||
onVenderSelected,
|
|
||||||
// disabled = false,
|
|
||||||
...restProps
|
|
||||||
}) {
|
|
||||||
// Filter Vendors List
|
|
||||||
const FilterVendors = (query, vender, index, exactMatch) => {
|
|
||||||
const normalizedTitle = vender.display_name.toLowerCase();
|
|
||||||
const normalizedQuery = query.toLowerCase();
|
|
||||||
if (exactMatch) {
|
|
||||||
return normalizedTitle === normalizedQuery;
|
|
||||||
} else {
|
|
||||||
return (
|
|
||||||
`${vender.display_name} ${normalizedTitle}`.indexOf(normalizedQuery) >=
|
|
||||||
0
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleVendorSelected = useCallback(
|
|
||||||
(Vendor) => onVenderSelected && onVenderSelected(Vendor),
|
|
||||||
[],
|
|
||||||
);
|
|
||||||
|
|
||||||
const handleVenderRenderer = useCallback(
|
|
||||||
(vender, { handleClick }) => (
|
|
||||||
<MenuItem
|
|
||||||
key={vender.id}
|
|
||||||
text={vender.display_name}
|
|
||||||
onClick={handleClick}
|
|
||||||
/>
|
|
||||||
),
|
|
||||||
[],
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<ListSelect
|
|
||||||
items={vendorsList}
|
|
||||||
selectedItemProp={'id'}
|
|
||||||
selectedItem={selectedVendorId}
|
|
||||||
labelProp={'display_name'}
|
|
||||||
defaultText={defaultSelectText}
|
|
||||||
onItemSelect={handleVendorSelected}
|
|
||||||
itemPredicate={FilterVendors}
|
|
||||||
itemRenderer={handleVenderRenderer}
|
|
||||||
popoverProps={{ minimal: true }}
|
|
||||||
{...restProps}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -30,7 +30,7 @@ import Row from './Grid/Row';
|
|||||||
import Col from './Grid/Col';
|
import Col from './Grid/Col';
|
||||||
import CloudLoadingIndicator from './CloudLoadingIndicator';
|
import CloudLoadingIndicator from './CloudLoadingIndicator';
|
||||||
import MoneyExchangeRate from './MoneyExchangeRate';
|
import MoneyExchangeRate from './MoneyExchangeRate';
|
||||||
import VendorSelecetList from './VendorSelecetList';
|
import ContactSelecetList from './ContactSelecetList';
|
||||||
|
|
||||||
const Hint = FieldHint;
|
const Hint = FieldHint;
|
||||||
|
|
||||||
@@ -68,5 +68,5 @@ export {
|
|||||||
Row,
|
Row,
|
||||||
CloudLoadingIndicator,
|
CloudLoadingIndicator,
|
||||||
MoneyExchangeRate,
|
MoneyExchangeRate,
|
||||||
VendorSelecetList,
|
ContactSelecetList ,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import { momentFormatter, compose, tansformDateValue } from 'utils';
|
|||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import {
|
import {
|
||||||
ListSelect,
|
ListSelect,
|
||||||
|
ContactSelecetList,
|
||||||
ErrorMessage,
|
ErrorMessage,
|
||||||
AccountsSelectList,
|
AccountsSelectList,
|
||||||
FieldRequiredHint,
|
FieldRequiredHint,
|
||||||
@@ -29,7 +30,7 @@ function ExpenseFormHeader({
|
|||||||
currenciesList,
|
currenciesList,
|
||||||
accountsList,
|
accountsList,
|
||||||
accountsTypes,
|
accountsTypes,
|
||||||
customersItems,
|
customers,
|
||||||
}) {
|
}) {
|
||||||
const [selectedItems, setSelectedItems] = useState({});
|
const [selectedItems, setSelectedItems] = useState({});
|
||||||
|
|
||||||
@@ -101,21 +102,6 @@ function ExpenseFormHeader({
|
|||||||
[],
|
[],
|
||||||
);
|
);
|
||||||
|
|
||||||
// Filter Customer
|
|
||||||
const filterCustomer = (query, customer, _index, exactMatch) => {
|
|
||||||
const normalizedTitle = customer.display_name.toLowerCase();
|
|
||||||
const normalizedQuery = query.toLowerCase();
|
|
||||||
if (exactMatch) {
|
|
||||||
return normalizedTitle === normalizedQuery;
|
|
||||||
} else {
|
|
||||||
return (
|
|
||||||
`${customer.display_name} ${normalizedTitle}`.indexOf(
|
|
||||||
normalizedQuery,
|
|
||||||
) >= 0
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// handle change customer
|
// handle change customer
|
||||||
const onChangeCustomer = useCallback(
|
const onChangeCustomer = useCallback(
|
||||||
(filedName) => {
|
(filedName) => {
|
||||||
@@ -142,17 +128,11 @@ function ExpenseFormHeader({
|
|||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<ListSelect
|
<ContactSelecetList
|
||||||
items={customersItems}
|
contactsList={customers}
|
||||||
noResults={<MenuItem disabled={true} text="No results." />}
|
selectedContactId={values.customer_id}
|
||||||
itemRenderer={CustomerRenderer}
|
defaultSelectText={<T id={'select_customer_account'} />}
|
||||||
itemPredicate={filterCustomer}
|
onContactSelected={onChangeCustomer('customer_id')}
|
||||||
popoverProps={{ minimal: true }}
|
|
||||||
onItemSelect={onChangeCustomer('customer_id')}
|
|
||||||
selectedItem={values.customer_id}
|
|
||||||
selectedItemProp={'id'}
|
|
||||||
defaultText={<T id={'select_customer_account'} />}
|
|
||||||
labelProp={'display_name'}
|
|
||||||
/>
|
/>
|
||||||
</FormGroup>
|
</FormGroup>
|
||||||
</Col>
|
</Col>
|
||||||
@@ -273,7 +253,7 @@ export default compose(
|
|||||||
withCurrencies(({ currenciesList }) => ({
|
withCurrencies(({ currenciesList }) => ({
|
||||||
currenciesList,
|
currenciesList,
|
||||||
})),
|
})),
|
||||||
withCustomers(({ customersItems }) => ({
|
withCustomers(({ customers }) => ({
|
||||||
customersItems,
|
customers,
|
||||||
})),
|
})),
|
||||||
)(ExpenseFormHeader);
|
)(ExpenseFormHeader);
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import { momentFormatter, compose, tansformDateValue } from 'utils';
|
|||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { CLASSES } from 'common/classes';
|
import { CLASSES } from 'common/classes';
|
||||||
import {
|
import {
|
||||||
VendorSelecetList,
|
ContactSelecetList,
|
||||||
ErrorMessage,
|
ErrorMessage,
|
||||||
FieldRequiredHint,
|
FieldRequiredHint,
|
||||||
Row,
|
Row,
|
||||||
@@ -48,31 +48,6 @@ function BillFormHeader({
|
|||||||
[setFieldValue],
|
[setFieldValue],
|
||||||
);
|
);
|
||||||
|
|
||||||
const vendorNameRenderer = useCallback(
|
|
||||||
(accept, { handleClick }) => (
|
|
||||||
<MenuItem
|
|
||||||
key={accept.id}
|
|
||||||
text={accept.display_name}
|
|
||||||
onClick={handleClick}
|
|
||||||
/>
|
|
||||||
),
|
|
||||||
[],
|
|
||||||
);
|
|
||||||
|
|
||||||
// Filter vendor name
|
|
||||||
const filterVendorAccount = (query, vendor, _index, exactMatch) => {
|
|
||||||
const normalizedTitle = vendor.display_name.toLowerCase();
|
|
||||||
const normalizedQuery = query.toLowerCase();
|
|
||||||
if (exactMatch) {
|
|
||||||
return normalizedTitle === normalizedQuery;
|
|
||||||
} else {
|
|
||||||
return (
|
|
||||||
`${vendor.display_name} ${normalizedTitle}`.indexOf(normalizedQuery) >=
|
|
||||||
0
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={classNames(CLASSES.PAGE_FORM_HEADER)}>
|
<div className={classNames(CLASSES.PAGE_FORM_HEADER)}>
|
||||||
<div className={'page-form__primary-section'}>
|
<div className={'page-form__primary-section'}>
|
||||||
@@ -91,10 +66,11 @@ function BillFormHeader({
|
|||||||
<ErrorMessage name={'vendor_id'} {...{ errors, touched }} />
|
<ErrorMessage name={'vendor_id'} {...{ errors, touched }} />
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<VendorSelecetList
|
<ContactSelecetList
|
||||||
vendorsList={vendorItems}
|
contactsList={vendorItems}
|
||||||
selectedVendorId={values.vendor_id}
|
selectedContactId={values.vendor_id}
|
||||||
onItemSelect={onChangeSelected('vendor_id')}
|
defaultSelectText={ <T id={'select_vender_account'} /> }
|
||||||
|
onContactSelected={onChangeSelected('vendor_id')}
|
||||||
/>
|
/>
|
||||||
</FormGroup>
|
</FormGroup>
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import { CLASSES } from 'common/classes';
|
|||||||
import { momentFormatter, compose, tansformDateValue } from 'utils';
|
import { momentFormatter, compose, tansformDateValue } from 'utils';
|
||||||
import {
|
import {
|
||||||
AccountsSelectList,
|
AccountsSelectList,
|
||||||
VendorSelecetList,
|
ContactSelecetList,
|
||||||
ErrorMessage,
|
ErrorMessage,
|
||||||
FieldRequiredHint,
|
FieldRequiredHint,
|
||||||
Money,
|
Money,
|
||||||
@@ -68,16 +68,6 @@ function PaymentMadeFormHeader({
|
|||||||
[setFieldValue],
|
[setFieldValue],
|
||||||
);
|
);
|
||||||
|
|
||||||
const handleVenderRenderer = useCallback(
|
|
||||||
(vender, { handleClick }) => (
|
|
||||||
<MenuItem
|
|
||||||
key={vender.id}
|
|
||||||
text={vender.display_name}
|
|
||||||
onClick={handleClick}
|
|
||||||
/>
|
|
||||||
),
|
|
||||||
[],
|
|
||||||
);
|
|
||||||
|
|
||||||
const triggerFullAmountChanged = (value) => {
|
const triggerFullAmountChanged = (value) => {
|
||||||
onFullAmountChanged && onFullAmountChanged(value);
|
onFullAmountChanged && onFullAmountChanged(value);
|
||||||
@@ -87,19 +77,6 @@ function PaymentMadeFormHeader({
|
|||||||
triggerFullAmountChanged(event.currentTarget.value);
|
triggerFullAmountChanged(event.currentTarget.value);
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleFilterVender = (query, vender, index, exactMatch) => {
|
|
||||||
const normalizedTitle = vender.display_name.toLowerCase();
|
|
||||||
const normalizedQuery = query.toLowerCase();
|
|
||||||
if (exactMatch) {
|
|
||||||
return normalizedTitle === normalizedQuery;
|
|
||||||
} else {
|
|
||||||
return (
|
|
||||||
`${vender.display_name} ${normalizedTitle}`.indexOf(normalizedQuery) >=
|
|
||||||
0
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const onChangeSelect = useCallback(
|
const onChangeSelect = useCallback(
|
||||||
(filedName) => {
|
(filedName) => {
|
||||||
return (item) => {
|
return (item) => {
|
||||||
@@ -133,10 +110,11 @@ function PaymentMadeFormHeader({
|
|||||||
<ErrorMessage name={'vendor_id'} {...{ errors, touched }} />
|
<ErrorMessage name={'vendor_id'} {...{ errors, touched }} />
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<VendorSelecetList
|
<ContactSelecetList
|
||||||
vendorsList={vendorItems}
|
contactsList={vendorItems}
|
||||||
selectedVendorId={values.vendor_id}
|
selectedContactId={values.vendor_id}
|
||||||
onItemSelect={onChangeSelect('vendor_id')}
|
defaultSelectText={ <T id={'select_vender_account'} /> }
|
||||||
|
onContactSelected={onChangeSelect('vendor_id')}
|
||||||
// buttonProps={{ disabled: !isNewMode }}
|
// buttonProps={{ disabled: !isNewMode }}
|
||||||
disabled={!isNewMode}
|
disabled={!isNewMode}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import { momentFormatter, compose, tansformDateValue } from 'utils';
|
|||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { CLASSES } from 'common/classes';
|
import { CLASSES } from 'common/classes';
|
||||||
import {
|
import {
|
||||||
ListSelect,
|
ContactSelecetList,
|
||||||
ErrorMessage,
|
ErrorMessage,
|
||||||
FieldRequiredHint,
|
FieldRequiredHint,
|
||||||
Icon,
|
Icon,
|
||||||
@@ -53,21 +53,6 @@ function EstimateFormHeader({
|
|||||||
[],
|
[],
|
||||||
);
|
);
|
||||||
|
|
||||||
// Filter Customer
|
|
||||||
const filterCustomer = (query, customer, _index, exactMatch) => {
|
|
||||||
const normalizedTitle = customer.display_name.toLowerCase();
|
|
||||||
const normalizedQuery = query.toLowerCase();
|
|
||||||
if (exactMatch) {
|
|
||||||
return normalizedTitle === normalizedQuery;
|
|
||||||
} else {
|
|
||||||
return (
|
|
||||||
`${customer.display_name} ${normalizedTitle}`.indexOf(
|
|
||||||
normalizedQuery,
|
|
||||||
) >= 0
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// handle change customer
|
// handle change customer
|
||||||
const onChangeCustomer = useCallback(
|
const onChangeCustomer = useCallback(
|
||||||
(filedName) => {
|
(filedName) => {
|
||||||
@@ -99,17 +84,11 @@ function EstimateFormHeader({
|
|||||||
<ErrorMessage name={'customer_id'} {...{ errors, touched }} />
|
<ErrorMessage name={'customer_id'} {...{ errors, touched }} />
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<ListSelect
|
<ContactSelecetList
|
||||||
items={customers}
|
contactsList={customers}
|
||||||
noResults={<MenuItem disabled={true} text="No results." />}
|
selectedContactId={values.customer_id}
|
||||||
itemRenderer={CustomerRenderer}
|
defaultSelectText={<T id={'select_customer_account'} />}
|
||||||
itemPredicate={filterCustomer}
|
onContactSelected={onChangeCustomer('customer_id')}
|
||||||
popoverProps={{ minimal: true }}
|
|
||||||
onItemSelect={onChangeCustomer('customer_id')}
|
|
||||||
selectedItem={values.customer_id}
|
|
||||||
selectedItemProp={'id'}
|
|
||||||
defaultText={<T id={'select_customer_account'} />}
|
|
||||||
labelProp={'display_name'}
|
|
||||||
/>
|
/>
|
||||||
</FormGroup>
|
</FormGroup>
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import { momentFormatter, compose, tansformDateValue } from 'utils';
|
|||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { CLASSES } from 'common/classes';
|
import { CLASSES } from 'common/classes';
|
||||||
import {
|
import {
|
||||||
ListSelect,
|
ContactSelecetList,
|
||||||
ErrorMessage,
|
ErrorMessage,
|
||||||
FieldRequiredHint,
|
FieldRequiredHint,
|
||||||
Icon,
|
Icon,
|
||||||
@@ -52,21 +52,6 @@ function InvoiceFormHeader({
|
|||||||
[],
|
[],
|
||||||
);
|
);
|
||||||
|
|
||||||
// Filter Customer
|
|
||||||
const filterCustomer = (query, customer, _index, exactMatch) => {
|
|
||||||
const normalizedTitle = customer.display_name.toLowerCase();
|
|
||||||
const normalizedQuery = query.toLowerCase();
|
|
||||||
if (exactMatch) {
|
|
||||||
return normalizedTitle === normalizedQuery;
|
|
||||||
} else {
|
|
||||||
return (
|
|
||||||
`${customer.display_name} ${normalizedTitle}`.indexOf(
|
|
||||||
normalizedQuery,
|
|
||||||
) >= 0
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// handle change customer
|
// handle change customer
|
||||||
const onChangeCustomer = useCallback(
|
const onChangeCustomer = useCallback(
|
||||||
(filedName) => {
|
(filedName) => {
|
||||||
@@ -99,17 +84,11 @@ function InvoiceFormHeader({
|
|||||||
<ErrorMessage name={'customer_id'} {...{ errors, touched }} />
|
<ErrorMessage name={'customer_id'} {...{ errors, touched }} />
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<ListSelect
|
<ContactSelecetList
|
||||||
items={customers}
|
contactsList={customers}
|
||||||
noResults={<MenuItem disabled={true} text="No results." />}
|
selectedContactId={values.customer_id}
|
||||||
itemRenderer={CustomerRenderer}
|
defaultSelectText={<T id={'select_customer_account'} />}
|
||||||
itemPredicate={filterCustomer}
|
onContactSelected={onChangeCustomer('customer_id')}
|
||||||
popoverProps={{ minimal: true }}
|
|
||||||
onItemSelect={onChangeCustomer('customer_id')}
|
|
||||||
selectedItem={values.customer_id}
|
|
||||||
selectedItemProp={'id'}
|
|
||||||
defaultText={<T id={'select_customer_account'} />}
|
|
||||||
labelProp={'display_name'}
|
|
||||||
/>
|
/>
|
||||||
</FormGroup>
|
</FormGroup>
|
||||||
|
|
||||||
|
|||||||
@@ -13,11 +13,11 @@ import moment from 'moment';
|
|||||||
import { sumBy } from 'lodash';
|
import { sumBy } from 'lodash';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
|
|
||||||
import { CLASSES } from 'common/classes'
|
import { CLASSES } from 'common/classes';
|
||||||
import { momentFormatter, compose, tansformDateValue } from 'utils';
|
import { momentFormatter, compose, tansformDateValue } from 'utils';
|
||||||
import {
|
import {
|
||||||
AccountsSelectList,
|
AccountsSelectList,
|
||||||
ListSelect,
|
ContactSelecetList,
|
||||||
ErrorMessage,
|
ErrorMessage,
|
||||||
FieldRequiredHint,
|
FieldRequiredHint,
|
||||||
Hint,
|
Hint,
|
||||||
@@ -72,19 +72,6 @@ function PaymentReceiveFormHeader({
|
|||||||
[],
|
[],
|
||||||
);
|
);
|
||||||
|
|
||||||
const handleFilterCustomer = (query, customer, index, exactMatch) => {
|
|
||||||
const normalizedTitle = customer.display_name.toLowerCase();
|
|
||||||
const normalizedQuery = query.toLowerCase();
|
|
||||||
if (exactMatch) {
|
|
||||||
return normalizedTitle === normalizedQuery;
|
|
||||||
} else {
|
|
||||||
return (
|
|
||||||
`${customer.display_name} ${normalizedTitle}`.indexOf(
|
|
||||||
normalizedQuery,
|
|
||||||
) >= 0
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const onChangeSelect = useCallback(
|
const onChangeSelect = useCallback(
|
||||||
(filedName) => {
|
(filedName) => {
|
||||||
@@ -129,17 +116,11 @@ function PaymentReceiveFormHeader({
|
|||||||
<ErrorMessage name={'customer_id'} {...{ errors, touched }} />
|
<ErrorMessage name={'customer_id'} {...{ errors, touched }} />
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<ListSelect
|
<ContactSelecetList
|
||||||
items={customers}
|
contactsList={customers}
|
||||||
noResults={<MenuItem disabled={true} text="No results." />}
|
selectedContactId={values.customer_id}
|
||||||
itemRenderer={handleCusomterRenderer}
|
defaultSelectText={<T id={'select_customer_account'} />}
|
||||||
itemPredicate={handleFilterCustomer}
|
onContactSelected={onChangeSelect('customer_id')}
|
||||||
popoverProps={{ minimal: true }}
|
|
||||||
onItemSelect={onChangeSelect('customer_id')}
|
|
||||||
selectedItem={values.customer_id}
|
|
||||||
selectedItemProp={'id'}
|
|
||||||
defaultText={<T id={'select_customer_account'} />}
|
|
||||||
labelProp={'display_name'}
|
|
||||||
/>
|
/>
|
||||||
</FormGroup>
|
</FormGroup>
|
||||||
|
|
||||||
@@ -167,26 +148,27 @@ function PaymentReceiveFormHeader({
|
|||||||
label={<T id={'full_amount'} />}
|
label={<T id={'full_amount'} />}
|
||||||
inline={true}
|
inline={true}
|
||||||
className={('form-group--full-amount', CLASSES.FILL)}
|
className={('form-group--full-amount', CLASSES.FILL)}
|
||||||
intent={
|
intent={errors.full_amount && touched.full_amount && Intent.DANGER}
|
||||||
errors.full_amount && touched.full_amount && Intent.DANGER
|
|
||||||
}
|
|
||||||
labelInfo={<Hint />}
|
labelInfo={<Hint />}
|
||||||
helperText={
|
helperText={
|
||||||
<ErrorMessage name="full_amount" {...{ errors, touched }} />
|
<ErrorMessage name="full_amount" {...{ errors, touched }} />
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<InputGroup
|
<InputGroup
|
||||||
intent={
|
intent={errors.full_amount && touched.full_amount && Intent.DANGER}
|
||||||
errors.full_amount && touched.full_amount && Intent.DANGER
|
|
||||||
}
|
|
||||||
minimal={true}
|
minimal={true}
|
||||||
value={values.full_amount}
|
value={values.full_amount}
|
||||||
{...getFieldProps('full_amount')}
|
{...getFieldProps('full_amount')}
|
||||||
onBlur={handleFullAmountBlur}
|
onBlur={handleFullAmountBlur}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<a onClick={handleReceiveFullAmountClick} href="#" className={'receive-full-amount'}>
|
<a
|
||||||
Receive full amount (<Money amount={receivableFullAmount} currency={'USD'} />)
|
onClick={handleReceiveFullAmountClick}
|
||||||
|
href="#"
|
||||||
|
className={'receive-full-amount'}
|
||||||
|
>
|
||||||
|
Receive full amount (
|
||||||
|
<Money amount={receivableFullAmount} currency={'USD'} />)
|
||||||
</a>
|
</a>
|
||||||
</FormGroup>
|
</FormGroup>
|
||||||
|
|
||||||
@@ -253,10 +235,14 @@ function PaymentReceiveFormHeader({
|
|||||||
inline={true}
|
inline={true}
|
||||||
className={classNames('form-group--reference', CLASSES.FILL)}
|
className={classNames('form-group--reference', CLASSES.FILL)}
|
||||||
intent={errors.reference_no && touched.reference_no && Intent.DANGER}
|
intent={errors.reference_no && touched.reference_no && Intent.DANGER}
|
||||||
helperText={<ErrorMessage name="reference" {...{ errors, touched }} />}
|
helperText={
|
||||||
|
<ErrorMessage name="reference" {...{ errors, touched }} />
|
||||||
|
}
|
||||||
>
|
>
|
||||||
<InputGroup
|
<InputGroup
|
||||||
intent={errors.reference_no && touched.reference_no && Intent.DANGER}
|
intent={
|
||||||
|
errors.reference_no && touched.reference_no && Intent.DANGER
|
||||||
|
}
|
||||||
minimal={true}
|
minimal={true}
|
||||||
{...getFieldProps('reference_no')}
|
{...getFieldProps('reference_no')}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import classNames from 'classnames';
|
|||||||
import { CLASSES } from 'common/classes';
|
import { CLASSES } from 'common/classes';
|
||||||
import {
|
import {
|
||||||
AccountsSelectList,
|
AccountsSelectList,
|
||||||
ListSelect,
|
ContactSelecetList,
|
||||||
ErrorMessage,
|
ErrorMessage,
|
||||||
FieldRequiredHint,
|
FieldRequiredHint,
|
||||||
Icon,
|
Icon,
|
||||||
@@ -44,32 +44,6 @@ function ReceiptFormHeader({
|
|||||||
[setFieldValue],
|
[setFieldValue],
|
||||||
);
|
);
|
||||||
|
|
||||||
const CustomerRenderer = useCallback(
|
|
||||||
(cutomer, { handleClick }) => (
|
|
||||||
<MenuItem
|
|
||||||
key={cutomer.id}
|
|
||||||
text={cutomer.display_name}
|
|
||||||
onClick={handleClick}
|
|
||||||
/>
|
|
||||||
),
|
|
||||||
[],
|
|
||||||
);
|
|
||||||
|
|
||||||
// Filter Customer
|
|
||||||
const filterCustomer = (query, customer, _index, exactMatch) => {
|
|
||||||
const normalizedTitle = customer.display_name.toLowerCase();
|
|
||||||
const normalizedQuery = query.toLowerCase();
|
|
||||||
if (exactMatch) {
|
|
||||||
return normalizedTitle === normalizedQuery;
|
|
||||||
} else {
|
|
||||||
return (
|
|
||||||
`${customer.display_name} ${normalizedTitle}`.indexOf(
|
|
||||||
normalizedQuery,
|
|
||||||
) >= 0
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// handle change
|
// handle change
|
||||||
const onChangeSelect = useCallback(
|
const onChangeSelect = useCallback(
|
||||||
(filedName) => {
|
(filedName) => {
|
||||||
@@ -108,17 +82,11 @@ function ReceiptFormHeader({
|
|||||||
<ErrorMessage name={'customer_id'} {...{ errors, touched }} />
|
<ErrorMessage name={'customer_id'} {...{ errors, touched }} />
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
<ListSelect
|
<ContactSelecetList
|
||||||
items={customers}
|
contactsList={customers}
|
||||||
noResults={<MenuItem disabled={true} text="No results." />}
|
selectedContactId={values.customer_id}
|
||||||
itemRenderer={CustomerRenderer}
|
defaultSelectText={<T id={'select_customer_account'} />}
|
||||||
itemPredicate={filterCustomer}
|
onContactSelected={onChangeSelect('customer_id')}
|
||||||
popoverProps={{ minimal: true }}
|
|
||||||
onItemSelect={onChangeSelect('customer_id')}
|
|
||||||
selectedItem={values.customer_id}
|
|
||||||
selectedItemProp={'id'}
|
|
||||||
defaultText={<T id={'select_customer_account'} />}
|
|
||||||
labelProp={'display_name'}
|
|
||||||
/>
|
/>
|
||||||
</FormGroup>
|
</FormGroup>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user