feat: item payment transactions.

This commit is contained in:
elforjani13
2021-12-19 17:29:25 +02:00
parent 8390e5ea6b
commit f9fe3506c5
13 changed files with 235 additions and 168 deletions

View File

@@ -0,0 +1,8 @@
import intl from 'react-intl-universal';
export default [
{ name: 'invoices', label: intl.get('invoices') },
{ name: 'estimates', label: intl.get('estimates') },
{ name: 'receipts', label: intl.get('receipts') },
{ name: 'bills', label: intl.get('bills') },
];

View File

@@ -1,10 +1,7 @@
import React from 'react';
import ItemDetailTab from './ItemDetailTab';
import ItemDetailActionsBar from './ItemDetailActionsBar';
import ItemDetailHeader from './ItemDetailHeader';
import { ItemPaymentTransactions } from './ItemPaymentTransactions';
import { Card } from 'components';
/**
* Item detail.
@@ -13,10 +10,7 @@ export default function ItemDetail() {
return (
<div className="item-drawer">
<ItemDetailActionsBar />
<ItemPaymentTransactions />
<Card>
<ItemDetailHeader />
</Card>
<ItemDetailTab />
</div>
);
}

View File

@@ -8,6 +8,9 @@ const ItemDetailDrawerContext = React.createContext();
* Item detail provider
*/
function ItemDetailDrawerProvider({ itemId, ...props }) {
// transaction type payload.
const [value, setValue] = React.useState('invoices');
// Fetches the given item detail.
const { isLoading: isItemLoading, data: item } = useItem(itemId, {
enabled: !!itemId,
@@ -18,6 +21,8 @@ function ItemDetailDrawerProvider({ itemId, ...props }) {
item,
itemId,
isItemLoading,
value,
setValue,
};
return (

View File

@@ -3,7 +3,7 @@ import intl from 'react-intl-universal';
import { defaultTo } from 'lodash';
import classNames from 'classnames';
import { If, DetailsMenu, DetailItem } from 'components';
import { If, DetailsMenu, DetailItem, Card } from 'components';
import { useItemDetailDrawerContext } from './ItemDetailDrawerProvider';
/**
@@ -13,70 +13,72 @@ export default function ItemDetailHeader() {
const { item } = useItemDetailDrawerContext();
return (
<div class="item-drawer__content">
<DetailsMenu direction={'vertical'}>
<DetailItem
name={'name'}
label={intl.get('item_name')}
children={item.name}
/>
<DetailItem
label={intl.get('sell_price')}
children={item.sell_price_formatted}
align={'right'}
/>
<DetailItem
label={intl.get('cost_price')}
children={item.cost_price_formatted}
align={'right'}
/>
</DetailsMenu>
<DetailsMenu direction={'horizantal'}>
<DetailItem label={intl.get('item_type')} children={item.type} />
<DetailItem
label={intl.get('item_code')}
children={defaultTo(item.code, '-')}
/>
<If condition={item.type === 'inventory'}>
<DetailItem name={'quantity'} label={intl.get('quantity_on_hand')}>
<span
className={classNames({
mines: item.quantity_on_hand <= 0,
plus: item.quantity_on_hand > 0,
})}
>
{defaultTo(item.quantity_on_hand, '-')}
</span>
</DetailItem>
</If>
<DetailItem
label={intl.get('category_name')}
children={defaultTo(item.category?.name, '-')}
/>
<DetailItem
label={intl.get('sell_account_id')}
children={defaultTo(item?.sell_account?.name, '-')}
/>
<DetailItem
label={intl.get('cost_account_id')}
children={defaultTo(item.cost_account?.name, '-')}
/>
<If condition={item.type === 'inventory'}>
<Card>
<div class="item-drawer__content">
<DetailsMenu direction={'vertical'}>
<DetailItem
label={intl.get('inventory_account')}
children={defaultTo(item?.inventory_account?.name, '-')}
name={'name'}
label={intl.get('item_name')}
children={item.name}
/>
</If>
<DetailItem
label={intl.get('item.sell_description')}
children={defaultTo(item.sell_description, '-')}
/>
<DetailItem
label={intl.get('item.purchase_description')}
children={defaultTo(item.cost_description, '-')}
/>
</DetailsMenu>
</div>
<DetailItem
label={intl.get('sell_price')}
children={item.sell_price_formatted}
align={'right'}
/>
<DetailItem
label={intl.get('cost_price')}
children={item.cost_price_formatted}
align={'right'}
/>
</DetailsMenu>
<DetailsMenu direction={'horizantal'}>
<DetailItem label={intl.get('item_type')} children={item.type} />
<DetailItem
label={intl.get('item_code')}
children={defaultTo(item.code, '-')}
/>
<If condition={item.type === 'inventory'}>
<DetailItem name={'quantity'} label={intl.get('quantity_on_hand')}>
<span
className={classNames({
mines: item.quantity_on_hand <= 0,
plus: item.quantity_on_hand > 0,
})}
>
{defaultTo(item.quantity_on_hand, '-')}
</span>
</DetailItem>
</If>
<DetailItem
label={intl.get('category_name')}
children={defaultTo(item.category?.name, '-')}
/>
<DetailItem
label={intl.get('sell_account_id')}
children={defaultTo(item?.sell_account?.name, '-')}
/>
<DetailItem
label={intl.get('cost_account_id')}
children={defaultTo(item.cost_account?.name, '-')}
/>
<If condition={item.type === 'inventory'}>
<DetailItem
label={intl.get('inventory_account')}
children={defaultTo(item?.inventory_account?.name, '-')}
/>
</If>
<DetailItem
label={intl.get('item.sell_description')}
children={defaultTo(item.sell_description, '-')}
/>
<DetailItem
label={intl.get('item.purchase_description')}
children={defaultTo(item.cost_description, '-')}
/>
</DetailsMenu>
</div>
</Card>
);
}

View File

@@ -0,0 +1,23 @@
import React from 'react';
import { Tab } from '@blueprintjs/core';
import { DrawerMainTabs, FormattedMessage as T } from 'components';
import { ItemPaymentTransactions } from './ItemPaymentTransactions';
import ItemDetailHeader from './ItemDetailHeader';
export default function ItemDetailTab() {
return (
<DrawerMainTabs renderActiveTabPanelOnly={true}>
<Tab
id={'overview'}
title={<T id={'overview'} />}
panel={<ItemDetailHeader />}
/>
<Tab
id={'transactions'}
title={<T id={'transactions'} />}
panel={<ItemPaymentTransactions />}
/>
</DrawerMainTabs>
);
}

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { DataTable, Card } from '../../../../components';
import { DataTable } from '../../../../components';
import { useItemDetailDrawerContext } from '../ItemDetailDrawerProvider';
import { useItemAssociatedBillTransactions } from 'hooks/query';
import { useBillTransactionsColumns } from './components';
@@ -22,16 +22,12 @@ export default function BillPaymentTransactions() {
});
return (
<div className="item-drawer__table">
<Card>
<DataTable
columns={columns}
data={paymentTransactions}
loading={isBillTransactionsLoading}
headerLoading={isBillTransactionsLoading}
progressBarLoading={isBillTransactionFetching}
/>
</Card>
</div>
<DataTable
columns={columns}
data={paymentTransactions}
loading={isBillTransactionsLoading}
headerLoading={isBillTransactionsLoading}
progressBarLoading={isBillTransactionFetching}
/>
);
}

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { DataTable, Card } from '../../../../components';
import { DataTable } from '../../../../components';
import { useItemDetailDrawerContext } from '../ItemDetailDrawerProvider';
import { useItemAssociatedEstimateTransactions } from 'hooks/query';
import { useEstimateTransactionsColumns } from './components';
@@ -22,16 +22,12 @@ export default function EstimatePaymentTransactions() {
});
return (
<div className="item-drawer__table">
<Card>
<DataTable
columns={columns}
data={paymentTransactions}
loading={isEstimateTransactionsLoading}
headerLoading={isEstimateTransactionsLoading}
progressBarLoading={isEstimateTransactionFetching}
/>
</Card>
</div>
<DataTable
columns={columns}
data={paymentTransactions}
loading={isEstimateTransactionsLoading}
headerLoading={isEstimateTransactionsLoading}
progressBarLoading={isEstimateTransactionFetching}
/>
);
}

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { DataTable, Card } from '../../../../components';
import { DataTable } from '../../../../components';
import { useItemAssociatedInvoiceTransactions } from 'hooks/query';
import { useItemDetailDrawerContext } from '../ItemDetailDrawerProvider';
import { useInvoicePaymentTransactionsColumns } from './components';
@@ -22,16 +22,12 @@ export default function InvoicePaymentTransactionsTable() {
});
return (
<div className="item-drawer__table">
<Card>
<DataTable
columns={columns}
data={paymentTransactions}
loading={isInvoiceTransactionsLoading}
headerLoading={isInvoiceTransactionsLoading}
progressBarLoading={isInvoiceTransactionFetching}
/>
</Card>
</div>
<DataTable
columns={columns}
data={paymentTransactions}
loading={isInvoiceTransactionsLoading}
headerLoading={isInvoiceTransactionsLoading}
progressBarLoading={isInvoiceTransactionFetching}
/>
);
}

View File

@@ -0,0 +1,21 @@
import React from 'react';
import InvoicePaymentTransactionsTable from './InvoicePaymentTransactionsDataTable';
import EstimatePaymentTransactionsTable from './EstimatePaymentTransactionsDataTable';
import ReceiptPaymentTransactionsTable from './ReceiptPaymentTransactionsDataTable';
import BillPaymentTransactionsTable from './BillPaymentTransactionsDataTable';
export default function ItemPaymentTransactionsContent({ tansactionType }) {
const handleType = () => {
switch (tansactionType) {
case 'invoices':
return <InvoicePaymentTransactionsTable />;
case 'estimates':
return <EstimatePaymentTransactionsTable />;
case 'receipts':
return <ReceiptPaymentTransactionsTable />;
case 'bills':
return <BillPaymentTransactionsTable />;
}
};
return handleType();
}

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { DataTable, Card } from '../../../../components';
import { DataTable } from '../../../../components';
import { useItemDetailDrawerContext } from '../ItemDetailDrawerProvider';
import { useItemAssociatedReceiptTransactions } from 'hooks/query';
import { useReceiptTransactionsColumns } from './components';
@@ -22,16 +22,12 @@ export default function ReceiptPaymentTransactions() {
});
return (
<div className="item-drawer__table">
<Card>
<DataTable
columns={columns}
data={paymentTransactions}
loading={isReceiptTransactionsLoading}
headerLoading={isReceiptTransactionsLoading}
progressBarLoading={isReceiptTransactionFetching}
/>
</Card>
</div>
<DataTable
columns={columns}
data={paymentTransactions}
loading={isReceiptTransactionsLoading}
headerLoading={isReceiptTransactionsLoading}
progressBarLoading={isReceiptTransactionFetching}
/>
);
}

View File

@@ -1,34 +1,30 @@
import React from 'react';
import { Tab } from '@blueprintjs/core';
import { DrawerMainTabs, FormattedMessage as T } from 'components';
import InvoicePaymentTransactionsTable from './InvoicePaymentTransactionsDataTable';
import EstimatePaymentTransactionsTable from './EstimatePaymentTransactionsDataTable';
import ReceiptPaymentTransactionsTable from './ReceiptPaymentTransactionsDataTable';
import BillPaymentTransactionsTable from './BillPaymentTransactionsDataTable';
import styled from 'styled-components';
import { Card, FormattedMessage as T } from 'components';
import { ItemManuTransaction } from './utils';
import { useItemDetailDrawerContext } from '../ItemDetailDrawerProvider';
import ItemPaymentTransactionContent from './ItemPaymentTransactionContent';
export const ItemPaymentTransactions = () => {
const { value } = useItemDetailDrawerContext();
return (
<DrawerMainTabs renderActiveTabPanelOnly={true}>
<Tab
id={'invoice'}
title={<T id={'invoice'} />}
panel={<InvoicePaymentTransactionsTable />}
/>
<Tab
id={'estiamte'}
title={<T id={'estimate_'} />}
panel={<EstimatePaymentTransactionsTable />}
/>
<Tab
id={'receipt'}
title={<T id={'receipt_'} />}
panel={<ReceiptPaymentTransactionsTable />}
/>
<Tab
id={'bill'}
title={'Bill'}
panel={<BillPaymentTransactionsTable />}
/>
</DrawerMainTabs>
<Card>
<ItemManuTransactions>
<T id={'item.drawer_transactions_by'} />
<ItemManuTransaction />
</ItemManuTransactions>
<ItemPaymentTransactionContent tansactionType={value} />
</Card>
);
};
const ItemManuTransactions = styled.div`
display: flex;
align-items: center;
color: #727983;
.bp3-button {
padding-left: 6px;
font-weight: 700;
}
`;

View File

@@ -0,0 +1,38 @@
import React from 'react';
import {
Button,
MenuItem,
Menu,
Popover,
PopoverInteractionKind,
Position,
} from '@blueprintjs/core';
import { FormattedMessage as T } from 'components';
import { useItemDetailDrawerContext } from '../ItemDetailDrawerProvider';
import transactions from '../../../../common/itemPaymentTranactionsOption';
export const ItemManuTransaction = () => {
const { value, setValue } = useItemDetailDrawerContext();
// const handleClickItem = (item) => {
// onChange && onChange(item);
// };
const content = transactions.map(({ name, label }) => (
<MenuItem onClick={() => setValue(name)} text={label} />
));
return (
<Popover
minimal={true}
interactionKind={PopoverInteractionKind.CLICK}
position={Position.BOTTOM_LEFT}
modifiers={{
offset: { offset: '0, 4' },
}}
content={<Menu>{content}</Menu>}
>
<Button minimal={true} text={<T id={value} />} rightIcon={'caret-down'} />
</Popover>
);
};

View File

@@ -38,28 +38,24 @@
}
}
}
&__table {
.card {
padding: 12px 15px !important;
}
.table {
.tbody,
.thead {
.tr .th {
padding: 8px 8px;
background-color: #fff;
font-size: 14px;
border-bottom: 1px solid #000;
border-top: 1px solid #000;
}
.table {
margin-top: 8px;
.tbody,
.thead {
.tr .th {
padding: 8px 8px;
background-color: #fff;
font-size: 14px;
border-bottom: 1px solid #000;
border-top: 1px solid #000;
}
.tbody {
.tr .td {
border-bottom: 0;
padding-top: 0.4rem;
padding-bottom: 0.4rem;
}
}
.tbody {
.tr .td {
border-bottom: 0;
padding-top: 0.4rem;
padding-bottom: 0.4rem;
}
}
}