From c86f0b29bf6d9a9d18a422331eb6ed51db6e1e70 Mon Sep 17 00:00:00 2001 From: elforjani3 Date: Wed, 12 Aug 2020 21:19:52 +0200 Subject: [PATCH] WIP/ Feature : Estimate & Receipt & Bill & Invoice --- client/src/components/EstimateListField.js | 42 ++- client/src/config/sidebarMenu.js | 20 +- .../Purchases/Bill/BillActionsBar.js | 148 ++++++++ .../src/containers/Purchases/Bill/BillForm.js | 334 ++++++++++++++++++ .../Purchases/Bill/BillFormFooter.js | 52 +++ .../Purchases/Bill/BillFormHeader.js | 190 ++++++++++ .../src/containers/Purchases/Bill/BillList.js | 178 ++++++++++ .../containers/Purchases/Bill/BillViewTabs.js | 110 ++++++ client/src/containers/Purchases/Bill/Bills.js | 85 +++++ .../Purchases/Bill/BillsDataTable.js | 243 +++++++++++++ .../Purchases/Bill/withBillActions.js | 32 ++ .../Purchases/Bill/withBillDetail.js | 11 + .../containers/Purchases/Bill/withBills.js | 25 ++ .../Sales/Estimate/EntriesItemsTable.js | 4 +- .../Sales/Estimate/EstimateActionsBar.js | 79 +++-- .../containers/Sales/Estimate/EstimateForm.js | 142 +++++--- .../Sales/Estimate/EstimateFormFooter.js | 27 +- .../containers/Sales/Estimate/EstimateList.js | 104 +++++- .../Sales/Estimate/EstimateViewTabs.js | 110 ++++++ .../containers/Sales/Estimate/Estimates.js | 35 +- .../Sales/Estimate/EstimatesDataTable.js | 142 +++++--- .../Sales/Estimate/withEstimateActions.js | 2 +- .../Sales/Estimate/withEstimates.js | 21 +- .../Sales/Invoice/InvoiceActionsBar.js | 78 ++-- .../containers/Sales/Invoice/InvoiceForm.js | 136 ++++--- .../Sales/Invoice/InvoiceFormFooter.js | 15 +- .../containers/Sales/Invoice/InvoiceList.js | 104 +++++- .../Sales/Invoice/InvoiceViewTabs.js | 113 ++++++ .../src/containers/Sales/Invoice/Invoices.js | 29 +- .../Sales/Invoice/InvoicesDataTable.js | 183 ++++++---- .../Sales/Invoice/withInvoiceActions.js | 4 +- .../Sales/Invoice/withInvoiceDetail.js | 6 +- .../containers/Sales/Invoice/withInvoices.js | 25 ++ .../Sales/Receipt/ReceiptActionsBar.js | 149 ++++++++ .../containers/Sales/Receipt/ReceiptForm.js | 131 ++++--- .../Sales/Receipt/ReceiptFormFooter.js | 15 +- .../Sales/Receipt/ReceiptFormHeader.js | 8 +- .../containers/Sales/Receipt/ReceiptList.js | 191 ++++++++++ .../Sales/Receipt/ReceiptViewTabs.js | 109 ++++++ .../src/containers/Sales/Receipt/Receipts.js | 23 +- .../Sales/Receipt/ReceiptsDataTable.js | 247 +++++++++++++ .../Sales/Receipt/withReceipActions.js | 4 +- .../Sales/Receipt/withReceiptDetail.js | 11 + .../containers/Sales/Receipt/withReceipts.js | 27 ++ .../containers/Vendors/withVendorActions.js | 32 ++ client/src/containers/Vendors/withVendors.js | 27 ++ client/src/lang/en/index.js | 28 +- client/src/routes/dashboard.js | 71 ++-- client/src/store/Bills/bills.actions.js | 14 +- client/src/store/Bills/bills.reducer.js | 102 ++++++ client/src/store/Bills/bills.selectors.js | 52 ++- .../src/store/Estimate/estimates.actions.js | 27 +- .../src/store/Estimate/estimates.reducer.js | 21 +- .../src/store/Estimate/estimates.selectors.js | 50 +-- client/src/store/Invoice/invoices.actions.js | 33 +- client/src/store/Invoice/invoices.reducer.js | 91 ++++- client/src/store/Invoice/invoices.selector.js | 55 ++- client/src/store/receipt/receipt.actions.js | 24 +- client/src/store/receipt/receipt.reducer.js | 103 ++++++ client/src/store/receipt/receipt.selector.js | 56 +++ client/src/store/reducers.js | 12 +- client/src/store/types.js | 2 + client/src/store/vendors/vendors.actions.js | 118 +++++++ client/src/store/vendors/vendors.reducer.js | 96 +++++ client/src/store/vendors/vendors.selectors.js | 54 +++ client/src/store/vendors/vendors.types.js | 11 + 66 files changed, 4288 insertions(+), 535 deletions(-) create mode 100644 client/src/containers/Purchases/Bill/BillActionsBar.js create mode 100644 client/src/containers/Purchases/Bill/BillForm.js create mode 100644 client/src/containers/Purchases/Bill/BillFormFooter.js create mode 100644 client/src/containers/Purchases/Bill/BillFormHeader.js create mode 100644 client/src/containers/Purchases/Bill/BillList.js create mode 100644 client/src/containers/Purchases/Bill/BillViewTabs.js create mode 100644 client/src/containers/Purchases/Bill/Bills.js create mode 100644 client/src/containers/Purchases/Bill/BillsDataTable.js create mode 100644 client/src/containers/Purchases/Bill/withBillActions.js create mode 100644 client/src/containers/Purchases/Bill/withBillDetail.js create mode 100644 client/src/containers/Purchases/Bill/withBills.js create mode 100644 client/src/containers/Sales/Estimate/EstimateViewTabs.js create mode 100644 client/src/containers/Sales/Invoice/InvoiceViewTabs.js create mode 100644 client/src/containers/Sales/Invoice/withInvoices.js create mode 100644 client/src/containers/Sales/Receipt/ReceiptList.js create mode 100644 client/src/containers/Sales/Receipt/ReceiptViewTabs.js create mode 100644 client/src/containers/Sales/Receipt/ReceiptsDataTable.js create mode 100644 client/src/containers/Sales/Receipt/withReceiptDetail.js create mode 100644 client/src/containers/Sales/Receipt/withReceipts.js create mode 100644 client/src/containers/Vendors/withVendorActions.js create mode 100644 client/src/containers/Vendors/withVendors.js create mode 100644 client/src/store/vendors/vendors.actions.js create mode 100644 client/src/store/vendors/vendors.reducer.js create mode 100644 client/src/store/vendors/vendors.selectors.js create mode 100644 client/src/store/vendors/vendors.types.js diff --git a/client/src/components/EstimateListField.js b/client/src/components/EstimateListField.js index ea37b794f..a7b94a662 100644 --- a/client/src/components/EstimateListField.js +++ b/client/src/components/EstimateListField.js @@ -1,39 +1,71 @@ import React, { useCallback, useMemo, useEffect, useState } from 'react'; -import { MenuItem, Button } from '@blueprintjs/core'; +import { MenuItem } from '@blueprintjs/core'; import ListSelect from 'components/ListSelect'; import { FormattedMessage as T } from 'react-intl'; function EstimateListField({ products, + initialProductId, selectedProductId, - onProductSelected, defautlSelectText = , + onProductSelected, }) { + const initialProduct = useMemo( + () => products.find((a) => a.id === initialProductId), + [initialProductId], + ); + + const [selectedProduct, setSelectedProduct] = useState( + initialProduct || null, + ); + + useEffect(() => { + if (typeof selectedProductId !== 'undefined') { + const product = selectedProductId + ? products.find((a) => a.id === selectedProductId) + : null; + setSelectedProduct(product); + } + }, [selectedProductId, products, setSelectedProduct]); + const onProductSelect = useCallback( (product) => { + setSelectedProduct({ ...product }); onProductSelected && onProductSelected(product); }, [onProductSelected], ); const productRenderer = useCallback( - (item, { handleClick, modifiers, query }) => ( - + (item, { handleClick }) => ( + ), [], ); + const filterProduct = useCallback((query, product, _index, exactMatch) => { + const normalizedTitle = product.name.toLowerCase(); + const normalizedQuery = query.toLowerCase(); + + if (exactMatch) { + return normalizedTitle === normalizedQuery; + } else { + return normalizedTitle.indexOf(normalizedQuery) >= 0; + } + }, []); + return ( } itemRenderer={productRenderer} + itemPredicate={filterProduct} popoverProps={{ minimal: true }} onItemSelect={onProductSelect} selectedItem={`${selectedProductId}`} selectedItemProp={'id'} labelProp={'name'} - defaultText={defautlSelectText} + defaultText={selectedProduct ? selectedProduct.name : defautlSelectText} /> ); } diff --git a/client/src/config/sidebarMenu.js b/client/src/config/sidebarMenu.js index 9e72634cf..8945fa9dd 100644 --- a/client/src/config/sidebarMenu.js +++ b/client/src/config/sidebarMenu.js @@ -42,21 +42,35 @@ export default [ text: , href: '/estimates/new', }, + // { + // text: , + // href: '/estimates', + // }, { text: , href: '/invoices/new', }, + // { + // text: , + // href: '/invoices', + // }, { text: , href: '/payment-receive/new', }, { divider: true, + text: , + href: '/invoices', }, { text: , href: '/receipts/new', }, + // { + // text: , + // href: '/receipts', + // }, ], }, { @@ -64,8 +78,12 @@ export default [ children: [ { text: , - href: '/bill/new', + href: '/bills/new', }, + // { + // text: , + // href: '/bills', + // }, { text: , }, diff --git a/client/src/containers/Purchases/Bill/BillActionsBar.js b/client/src/containers/Purchases/Bill/BillActionsBar.js new file mode 100644 index 000000000..dad1c4f2b --- /dev/null +++ b/client/src/containers/Purchases/Bill/BillActionsBar.js @@ -0,0 +1,148 @@ +import React, { useCallback, useState, useMemo } from 'react'; +import Icon from 'components/Icon'; +import { + Button, + Classes, + Menu, + MenuItem, + Popover, + NavbarDivider, + NavbarGroup, + PopoverInteractionKind, + Position, + Intent, +} from '@blueprintjs/core'; + +import classNames from 'classnames'; +import { useRouteMatch, useHistory } from 'react-router-dom'; +import { FormattedMessage as T, useIntl } from 'react-intl'; + +import { connect } from 'react-redux'; +import FilterDropdown from 'components/FilterDropdown'; +import DashboardActionsBar from 'components/Dashboard/DashboardActionsBar'; + +import { If, DashboardActionViewsList } from 'components'; + +import withResourceDetail from 'containers/Resources/withResourceDetails'; +import withBillActions from './withBillActions'; +import withBills from './withBills'; + +import { compose } from 'utils'; + +function BillActionsBar({ + // #withResourceDetail + resourceFields, + + //#withBills + billsViews, + + //#withBillActions + addBillsTableQueries, + + // #own Porps + onFilterChanged, + selectedRows = [], +}) { + const history = useHistory(); + const { path } = useRouteMatch(); + const [filterCount, setFilterCount] = useState(0); + const { formatMessage } = useIntl(); + + const handleClickNewBill = useCallback(() => { + history.push('/bills/new'); + }, [history]); + + // const FilterDropdown = FilterDropdown({ + // initialCondition: { + // fieldKey: '', + // compatator: '', + // value: '', + // }, + // fields: resourceFields, + // onFilterChange: (filterConditions) => { + // addBillsTableQueries({ + // filter_roles: filterConditions || '', + // }); + // onFilterChanged && onFilterChanged(filterConditions); + // }, + // }); + + const hasSelectedRows = useMemo(() => selectedRows.length > 0, [ + selectedRows, + ]); + + return ( + + + + +