Merge remote-tracking branch 'origin/master'

This commit is contained in:
Ahmed Bouhuolia
2020-11-05 12:23:31 +02:00
9 changed files with 112 additions and 235 deletions

View 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}
/>
);
}

View File

@@ -30,6 +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 ContactSelecetList from './ContactSelecetList';
const Hint = FieldHint; const Hint = FieldHint;
@@ -67,4 +68,5 @@ export {
Row, Row,
CloudLoadingIndicator, CloudLoadingIndicator,
MoneyExchangeRate, MoneyExchangeRate,
ContactSelecetList ,
}; };

View File

@@ -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);

View File

@@ -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,
Row, Row,
@@ -49,31 +49,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
);
}
};
const handleBillNumberBlur = (event) => { const handleBillNumberBlur = (event) => {
onBillNumberChanged && onBillNumberChanged(event.currentTarget.value); onBillNumberChanged && onBillNumberChanged(event.currentTarget.value);
}; };
@@ -96,17 +71,11 @@ function BillFormHeader({
<ErrorMessage name={'vendor_id'} {...{ errors, touched }} /> <ErrorMessage name={'vendor_id'} {...{ errors, touched }} />
} }
> >
<ListSelect <ContactSelecetList
items={vendorItems} contactsList={vendorItems}
noResults={<MenuItem disabled={true} text="No results." />} selectedContactId={values.vendor_id}
itemRenderer={vendorNameRenderer} defaultSelectText={ <T id={'select_vender_account'} /> }
itemPredicate={filterVendorAccount} onContactSelected={onChangeSelected('vendor_id')}
popoverProps={{ minimal: true }}
onItemSelect={onChangeSelected('vendor_id')}
selectedItem={values.vendor_id}
selectedItemProp={'id'}
defaultText={<T id={'select_vendor_account'} />}
labelProp={'display_name'}
/> />
</FormGroup> </FormGroup>
@@ -140,7 +109,7 @@ function BillFormHeader({
className={classNames( className={classNames(
'form-group--due-date', 'form-group--due-date',
'form-group--select-list', 'form-group--select-list',
CLASSES.FILL CLASSES.FILL,
)} )}
intent={errors.due_date && touched.due_date && Intent.DANGER} intent={errors.due_date && touched.due_date && Intent.DANGER}
helperText={ helperText={

View File

@@ -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,
ListSelect, ContactSelecetList,
ErrorMessage, ErrorMessage,
FieldRequiredHint, FieldRequiredHint,
Money, Money,
@@ -60,39 +60,14 @@ 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);
} };
const handleFullAmountBlur = (event) => { const handleFullAmountBlur = (event) => {
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) => {
@@ -131,18 +106,11 @@ function PaymentMadeFormHeader({
<ErrorMessage name={'vendor_id'} {...{ errors, touched }} /> <ErrorMessage name={'vendor_id'} {...{ errors, touched }} />
} }
> >
<ListSelect <ContactSelecetList
items={vendorItems} contactsList={vendorItems}
noResults={<MenuItem disabled={true} text="No results." />} selectedContactId={values.vendor_id}
itemRenderer={handleVenderRenderer} defaultSelectText={ <T id={'select_vender_account'} /> }
itemPredicate={handleFilterVender} onContactSelected={onChangeSelect('vendor_id')}
popoverProps={{ minimal: true }}
onItemSelect={onChangeSelect('vendor_id')}
selectedItem={values.vendor_id}
selectedItemProp={'id'}
defaultText={<T id={'select_vender_account'} />}
labelProp={'display_name'}
buttonProps={{ disabled: !isNewMode }}
disabled={!isNewMode} disabled={!isNewMode}
/> />
</FormGroup> </FormGroup>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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,
ListSelect, ContactSelecetList,
ErrorMessage, ErrorMessage,
FieldRequiredHint, FieldRequiredHint,
Hint, Hint,
@@ -55,31 +55,6 @@ function PaymentReceiveFormHeader({
[setFieldValue], [setFieldValue],
); );
const handleCusomterRenderer = useCallback(
(custom, { handleClick }) => (
<MenuItem
key={custom.id}
text={custom.display_name}
onClick={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( const onChangeSelect = useCallback(
(filedName) => { (filedName) => {
return (item) => { return (item) => {
@@ -124,17 +99,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>

View File

@@ -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>