diff --git a/client/src/components/ContactSelecetList.js b/client/src/components/ContactSelecetList.js new file mode 100644 index 000000000..f43b8e281 --- /dev/null +++ b/client/src/components/ContactSelecetList.js @@ -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 = , + 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 }) => ( + + ), + [], + ); + + return ( + + ); +} diff --git a/client/src/components/index.js b/client/src/components/index.js index fd027601e..31a83a3c1 100644 --- a/client/src/components/index.js +++ b/client/src/components/index.js @@ -30,6 +30,7 @@ import Row from './Grid/Row'; import Col from './Grid/Col'; import CloudLoadingIndicator from './CloudLoadingIndicator'; import MoneyExchangeRate from './MoneyExchangeRate'; +import ContactSelecetList from './ContactSelecetList'; const Hint = FieldHint; @@ -67,4 +68,5 @@ export { Row, CloudLoadingIndicator, MoneyExchangeRate, + ContactSelecetList , }; diff --git a/client/src/containers/Expenses/ExpenseFormHeader.js b/client/src/containers/Expenses/ExpenseFormHeader.js index e15afc1f8..1f128b644 100644 --- a/client/src/containers/Expenses/ExpenseFormHeader.js +++ b/client/src/containers/Expenses/ExpenseFormHeader.js @@ -15,6 +15,7 @@ import { momentFormatter, compose, tansformDateValue } from 'utils'; import classNames from 'classnames'; import { ListSelect, + ContactSelecetList, ErrorMessage, AccountsSelectList, FieldRequiredHint, @@ -29,7 +30,7 @@ function ExpenseFormHeader({ currenciesList, accountsList, accountsTypes, - customersItems, + customers, }) { 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 const onChangeCustomer = useCallback( (filedName) => { @@ -142,17 +128,11 @@ function ExpenseFormHeader({ /> } > - } - itemRenderer={CustomerRenderer} - itemPredicate={filterCustomer} - popoverProps={{ minimal: true }} - onItemSelect={onChangeCustomer('customer_id')} - selectedItem={values.customer_id} - selectedItemProp={'id'} - defaultText={} - labelProp={'display_name'} + } + onContactSelected={onChangeCustomer('customer_id')} /> @@ -273,7 +253,7 @@ export default compose( withCurrencies(({ currenciesList }) => ({ currenciesList, })), - withCustomers(({ customersItems }) => ({ - customersItems, + withCustomers(({ customers }) => ({ + customers, })), )(ExpenseFormHeader); diff --git a/client/src/containers/Purchases/Bill/BillFormHeader.js b/client/src/containers/Purchases/Bill/BillFormHeader.js index 6be40af02..fa8ec2356 100644 --- a/client/src/containers/Purchases/Bill/BillFormHeader.js +++ b/client/src/containers/Purchases/Bill/BillFormHeader.js @@ -13,7 +13,7 @@ import { momentFormatter, compose, tansformDateValue } from 'utils'; import classNames from 'classnames'; import { CLASSES } from 'common/classes'; import { - ListSelect, + ContactSelecetList, ErrorMessage, FieldRequiredHint, Row, @@ -49,31 +49,6 @@ function BillFormHeader({ [setFieldValue], ); - const vendorNameRenderer = useCallback( - (accept, { 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 - ); - } - }; - const handleBillNumberBlur = (event) => { onBillNumberChanged && onBillNumberChanged(event.currentTarget.value); }; @@ -96,17 +71,11 @@ function BillFormHeader({ } > - } - itemRenderer={vendorNameRenderer} - itemPredicate={filterVendorAccount} - popoverProps={{ minimal: true }} - onItemSelect={onChangeSelected('vendor_id')} - selectedItem={values.vendor_id} - selectedItemProp={'id'} - defaultText={} - labelProp={'display_name'} + } + onContactSelected={onChangeSelected('vendor_id')} /> @@ -140,7 +109,7 @@ function BillFormHeader({ className={classNames( 'form-group--due-date', 'form-group--select-list', - CLASSES.FILL + CLASSES.FILL, )} intent={errors.due_date && touched.due_date && Intent.DANGER} helperText={ diff --git a/client/src/containers/Purchases/PaymentMades/PaymentMadeFormHeader.js b/client/src/containers/Purchases/PaymentMades/PaymentMadeFormHeader.js index edda30e8f..3172ffcd0 100644 --- a/client/src/containers/Purchases/PaymentMades/PaymentMadeFormHeader.js +++ b/client/src/containers/Purchases/PaymentMades/PaymentMadeFormHeader.js @@ -16,7 +16,7 @@ import { CLASSES } from 'common/classes'; import { momentFormatter, compose, tansformDateValue } from 'utils'; import { AccountsSelectList, - ListSelect, + ContactSelecetList, ErrorMessage, FieldRequiredHint, Money, @@ -60,39 +60,14 @@ function PaymentMadeFormHeader({ }, [setFieldValue], ); - - const handleVenderRenderer = useCallback( - (vender, { handleClick }) => ( - - ), - [], - ); - const triggerFullAmountChanged = (value) => { onFullAmountChanged && onFullAmountChanged(value); - } + }; const handleFullAmountBlur = (event) => { 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( (filedName) => { return (item) => { @@ -131,18 +106,11 @@ function PaymentMadeFormHeader({ } > - } - itemRenderer={handleVenderRenderer} - itemPredicate={handleFilterVender} - popoverProps={{ minimal: true }} - onItemSelect={onChangeSelect('vendor_id')} - selectedItem={values.vendor_id} - selectedItemProp={'id'} - defaultText={} - labelProp={'display_name'} - buttonProps={{ disabled: !isNewMode }} + } + onContactSelected={onChangeSelect('vendor_id')} disabled={!isNewMode} /> diff --git a/client/src/containers/Sales/Estimate/EstimateFormHeader.js b/client/src/containers/Sales/Estimate/EstimateFormHeader.js index c120a6ebb..1cbfdc8d4 100644 --- a/client/src/containers/Sales/Estimate/EstimateFormHeader.js +++ b/client/src/containers/Sales/Estimate/EstimateFormHeader.js @@ -14,7 +14,7 @@ import { momentFormatter, compose, tansformDateValue } from 'utils'; import classNames from 'classnames'; import { CLASSES } from 'common/classes'; import { - ListSelect, + ContactSelecetList, ErrorMessage, FieldRequiredHint, 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 const onChangeCustomer = useCallback( (filedName) => { @@ -99,17 +84,11 @@ function EstimateFormHeader({ } > - } - itemRenderer={CustomerRenderer} - itemPredicate={filterCustomer} - popoverProps={{ minimal: true }} - onItemSelect={onChangeCustomer('customer_id')} - selectedItem={values.customer_id} - selectedItemProp={'id'} - defaultText={} - labelProp={'display_name'} + } + onContactSelected={onChangeCustomer('customer_id')} /> diff --git a/client/src/containers/Sales/Invoice/InvoiceFormHeader.js b/client/src/containers/Sales/Invoice/InvoiceFormHeader.js index 7ea33ecc4..ea9512e4f 100644 --- a/client/src/containers/Sales/Invoice/InvoiceFormHeader.js +++ b/client/src/containers/Sales/Invoice/InvoiceFormHeader.js @@ -13,7 +13,7 @@ import { momentFormatter, compose, tansformDateValue } from 'utils'; import classNames from 'classnames'; import { CLASSES } from 'common/classes'; import { - ListSelect, + ContactSelecetList, ErrorMessage, FieldRequiredHint, 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 const onChangeCustomer = useCallback( (filedName) => { @@ -99,17 +84,11 @@ function InvoiceFormHeader({ } > - } - itemRenderer={CustomerRenderer} - itemPredicate={filterCustomer} - popoverProps={{ minimal: true }} - onItemSelect={onChangeCustomer('customer_id')} - selectedItem={values.customer_id} - selectedItemProp={'id'} - defaultText={} - labelProp={'display_name'} + } + onContactSelected={onChangeCustomer('customer_id')} /> diff --git a/client/src/containers/Sales/PaymentReceive/PaymentReceiveFormHeader.js b/client/src/containers/Sales/PaymentReceive/PaymentReceiveFormHeader.js index 1164aea1e..8bea8f3f9 100644 --- a/client/src/containers/Sales/PaymentReceive/PaymentReceiveFormHeader.js +++ b/client/src/containers/Sales/PaymentReceive/PaymentReceiveFormHeader.js @@ -16,7 +16,7 @@ import { CLASSES } from 'common/classes'; import { momentFormatter, compose, tansformDateValue } from 'utils'; import { AccountsSelectList, - ListSelect, + ContactSelecetList, ErrorMessage, FieldRequiredHint, Hint, @@ -55,31 +55,6 @@ function PaymentReceiveFormHeader({ [setFieldValue], ); - const handleCusomterRenderer = useCallback( - (custom, { handleClick }) => ( - - ), - [], - ); - - 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( (filedName) => { return (item) => { @@ -124,17 +99,11 @@ function PaymentReceiveFormHeader({ } > - } - itemRenderer={handleCusomterRenderer} - itemPredicate={handleFilterCustomer} - popoverProps={{ minimal: true }} - onItemSelect={onChangeSelect('customer_id')} - selectedItem={values.customer_id} - selectedItemProp={'id'} - defaultText={} - labelProp={'display_name'} + } + onContactSelected={onChangeSelect('customer_id')} /> diff --git a/client/src/containers/Sales/Receipt/ReceiptFormHeader.js b/client/src/containers/Sales/Receipt/ReceiptFormHeader.js index 390442ac2..004f71d76 100644 --- a/client/src/containers/Sales/Receipt/ReceiptFormHeader.js +++ b/client/src/containers/Sales/Receipt/ReceiptFormHeader.js @@ -15,7 +15,7 @@ import classNames from 'classnames'; import { CLASSES } from 'common/classes'; import { AccountsSelectList, - ListSelect, + ContactSelecetList, ErrorMessage, FieldRequiredHint, Icon, @@ -44,32 +44,6 @@ function ReceiptFormHeader({ [setFieldValue], ); - const CustomerRenderer = useCallback( - (cutomer, { 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 const onChangeSelect = useCallback( (filedName) => { @@ -108,17 +82,11 @@ function ReceiptFormHeader({ } > - } - itemRenderer={CustomerRenderer} - itemPredicate={filterCustomer} - popoverProps={{ minimal: true }} - onItemSelect={onChangeSelect('customer_id')} - selectedItem={values.customer_id} - selectedItemProp={'id'} - defaultText={} - labelProp={'display_name'} + } + onContactSelected={onChangeSelect('customer_id')} />