diff --git a/src/common/drawers.js b/src/common/drawers.js index 449f51485..3a1b21032 100644 --- a/src/common/drawers.js +++ b/src/common/drawers.js @@ -10,4 +10,8 @@ export const DRAWERS = { BILL_DRAWER: 'bill-drawer', INVENTORY_ADJUSTMENT_DRAWER: 'inventory-adjustment-drawer', CASHFLOW_TRNASACTION_DRAWER: 'cashflow-transaction-drawer', + + QUICK_WRITE_VENDOR: 'quick-write-vendor', + QUICK_CREATE_CUSTOMER: 'quick-create-customer', + QUICK_CREATE_ITEM: 'quick-create-item', }; diff --git a/src/components/AccountsSelectList.js b/src/components/AccountsSelectList.js index 75a7d3e09..9ed337284 100644 --- a/src/components/AccountsSelectList.js +++ b/src/components/AccountsSelectList.js @@ -1,13 +1,55 @@ import React, { useCallback, useState, useEffect, useMemo } from 'react'; import { MenuItem, Button } from '@blueprintjs/core'; import { Select } from '@blueprintjs/select'; -import { MenuItemNestedText, FormattedMessage as T } from 'components'; +import * as R from 'ramda'; import classNames from 'classnames'; + +import { MenuItemNestedText, FormattedMessage as T } from 'components'; import { filterAccountsByQuery } from './utils'; import { nestedArrayToflatten } from 'utils'; import { CLASSES } from 'common/classes'; -export default function AccountsSelectList({ +import withDialogActions from 'containers/Dialog/withDialogActions'; + +// Create new account renderer. +const createNewItemRenderer = (query, active, handleClick) => { + return ( + + ); +}; + +// Create new item from the given query string. +const createNewItemFromQuery = (name) => { + return { + name, + }; +}; + +// Filters accounts items. +const filterAccountsPredicater = (query, account, _index, exactMatch) => { + const normalizedTitle = account.name.toLowerCase(); + const normalizedQuery = query.toLowerCase(); + + if (exactMatch) { + return normalizedTitle === normalizedQuery; + } else { + return `${account.code} ${normalizedTitle}`.indexOf(normalizedQuery) >= 0; + } +}; + +/** + * Accounts select list. + */ +function AccountsSelectList({ + // #withDialogActions + openDialog, + + // #ownProps accounts, initialAccountId, selectedAccountId, @@ -21,6 +63,8 @@ export default function AccountsSelectList({ filterByNormal, filterByRootTypes, + allowCreate, + buttonProps = {}, }) { const flattenAccounts = useMemo( @@ -51,6 +95,7 @@ export default function AccountsSelectList({ [initialAccountId, filteredAccounts], ); + // Select account item. const [selectedAccount, setSelectedAccount] = useState( initialAccount || null, ); @@ -76,31 +121,25 @@ export default function AccountsSelectList({ ); }, []); - const onAccountSelect = useCallback( + // Handle the account item select. + const handleAccountSelect = useCallback( (account) => { - setSelectedAccount({ ...account }); - onAccountSelected && onAccountSelected(account); - }, - [setSelectedAccount, onAccountSelected], - ); - - // Filters accounts items. - const filterAccountsPredicater = useCallback( - (query, account, _index, exactMatch) => { - const normalizedTitle = account.name.toLowerCase(); - const normalizedQuery = query.toLowerCase(); - - if (exactMatch) { - return normalizedTitle === normalizedQuery; + if (account.id) { + setSelectedAccount({ ...account }); + onAccountSelected && onAccountSelected(account); } else { - return ( - `${account.code} ${normalizedTitle}`.indexOf(normalizedQuery) >= 0 - ); + openDialog('account-form'); } }, - [], + [setSelectedAccount, onAccountSelected, openDialog], ); + // Maybe inject new item props to select component. + const maybeCreateNewItemRenderer = allowCreate ? createNewItemRenderer : null; + const maybeCreateNewItemFromQuery = allowCreate + ? createNewItemFromQuery + : null; + return ( } />} + itemRenderer={handleContactRenderer} + itemPredicate={itemPredicate} + filterable={true} + disabled={disabled} + onItemSelect={handleContactSelect} + popoverProps={{ minimal: true, usePortal: !popoverFill }} + className={classNames(CLASSES.FORM_GROUP_LIST_SELECT, { + [CLASSES.SELECT_LIST_FILL_POPOVER]: popoverFill, + })} + inputProps={{ + placeholder: intl.get('filter_'), + }} + {...restProps} + > + +