Merge branch 'feature/viewDetail'

This commit is contained in:
elforjani3
2021-08-01 17:42:32 +02:00
125 changed files with 3987 additions and 1896 deletions

View File

@@ -11,7 +11,7 @@ const CheckboxEditableCell = ({
const [value, setValue] = React.useState(initialValue);
const onChange = (e) => {
setValue(e.target.value);
setValue(e.target.checked);
};
const onBlur = () => {
payload.updateData(index, id, value);
@@ -24,12 +24,13 @@ const CheckboxEditableCell = ({
return (
<FormGroup
// intent={error ? Intent.DANGER : null}
intent={error ? Intent.DANGER : null}
className={classNames(Classes.FILL)}
>
<Checkbox
value={value}
onChange={onChange}
checked={initialValue}
onBlur={onBlur}
minimal={true}
className="ml2"

View File

@@ -7,6 +7,10 @@ import AccountDrawer from 'containers/Drawers/AccountDrawer';
import ManualJournalDrawer from 'containers/Drawers/ManualJournalDrawer';
import ExpenseDrawer from 'containers/Drawers/ExpenseDrawer';
import BillDrawer from 'containers/Drawers/BillDrawer';
import InvoiceDetailDrawer from 'containers/Drawers/InvoiceDetailDrawer';
import ReceiptDetailDrawer from 'containers/Drawers/ReceiptDetailDrawer';
import PaymentReceiveDetailDrawer from 'containers/Drawers/PaymentReceiveDetailDrawer';
import PaymentMadeDetailDrawer from 'containers/Drawers/PaymentMadeDetailDrawer';
export default function DrawersContainer() {
return (
@@ -19,6 +23,10 @@ export default function DrawersContainer() {
<ManualJournalDrawer name={'journal-drawer'} />
<ExpenseDrawer name={'expense-drawer'} />
<BillDrawer name={'bill-drawer'} />
<InvoiceDetailDrawer name={'invoice-detail-drawer'} />
<ReceiptDetailDrawer name={'receipt-detail-drawer'} />
<PaymentReceiveDetailDrawer name={'payment-receive-detail-drawer'} />
<PaymentMadeDetailDrawer name={'payment-made-detail-drawer'} />
</div>
);
}

View File

@@ -1,6 +1,6 @@
import React from 'react';
import 'style/components/Drawers/BillDrawer.scss';
import 'style/components/Drawers/ViewDetail/ViewDetail.scss';
import { BillDrawerProvider } from './BillDrawerProvider';
import BillDrawerDetails from './BillDrawerDetails';

View File

@@ -3,15 +3,24 @@ import { Tabs, Tab } from '@blueprintjs/core';
import intl from 'react-intl-universal';
import LocatedLandedCostTable from './LocatedLandedCostTable';
import JournalEntriesTable from '../../JournalEntriesTable/JournalEntriesTable';
import { useBillDrawerContext } from './BillDrawerProvider';
/**
* Bill view details.
*/
export default function BillDrawerDetails() {
const { data } = useBillDrawerContext();
return (
<div className="bill-drawer">
<Tabs animate={true} large={true} selectedTabId="landed_cost">
<div className="view-detail-drawer">
<Tabs animate={true} large={true} defaultSelectedTabId="landed_cost">
<Tab title={intl.get('details')} id={'details'} disabled={true} />
<Tab
title={intl.get('journal_entries')}
id={'journal_entries'}
panel={<JournalEntriesTable transactions={data} />}
/>
<Tab
title={intl.get('located_landed_cost')}
id={'landed_cost'}

View File

@@ -2,6 +2,7 @@ import React from 'react';
import intl from 'react-intl-universal';
import { DrawerHeaderContent, DashboardInsider } from 'components';
import { useBillLocatedLandedCost } from 'hooks/query';
import { useTransactionsByReference } from 'hooks/query';
const BillDrawerContext = React.createContext();
@@ -9,6 +10,16 @@ const BillDrawerContext = React.createContext();
* Bill drawer provider.
*/
function BillDrawerProvider({ billId, ...props }) {
// Handle fetch transaction by reference.
const { data, isLoading: isTransactionLoading } = useTransactionsByReference(
{
reference_id: billId,
reference_type: 'Bill',
},
{ enabled: !!billId },
);
// Handle fetch bill located landed cost transaction.
const { isLoading: isLandedCostLoading, data: transactions } =
useBillLocatedLandedCost(billId, {
@@ -19,10 +30,11 @@ function BillDrawerProvider({ billId, ...props }) {
const provider = {
transactions,
billId,
data,
};
return (
<DashboardInsider loading={isLandedCostLoading}>
<DashboardInsider loading={isLandedCostLoading || isTransactionLoading}>
<DrawerHeaderContent
name="bill-drawer"
title={intl.get('bill_details')}

View File

@@ -0,0 +1,31 @@
import React from 'react';
import { Tabs, Tab } from '@blueprintjs/core';
import intl from 'react-intl-universal';
import JournalEntriesTable from '../../JournalEntriesTable/JournalEntriesTable';
import { useInvoiceDetailDrawerContext } from './InvoiceDetailDrawerProvider';
/**
* Invoice view detail.
*/
export default function InvoiceDetail() {
const { data } = useInvoiceDetailDrawerContext();
return (
<div className="view-detail-drawer">
<Tabs
animate={true}
large={true}
defaultSelectedTabId="journal_entries"
renderActiveTabPanelOnly={false}
>
<Tab title={intl.get('details')} disabled={true} />
<Tab
title={intl.get('journal_entries')}
id={'journal_entries'}
panel={<JournalEntriesTable transactions={data} />}
/>
</Tabs>
</div>
);
}

View File

@@ -0,0 +1,20 @@
import React from 'react';
import 'style/components/Drawers/ViewDetail/ViewDetail.scss';
import InvoiceDetail from './InvoiceDetail';
import { InvoiceDetailDrawerProvider } from './InvoiceDetailDrawerProvider';
/**
* Invoice detail drawer content.
*/
export default function InvoiceDetailDrawerContent({
// #ownProp
invoice,
}) {
return (
<InvoiceDetailDrawerProvider invoiceId={invoice}>
<InvoiceDetail />
</InvoiceDetailDrawerProvider>
);
}

View File

@@ -0,0 +1,39 @@
import React from 'react';
import intl from 'react-intl-universal';
import { DrawerHeaderContent, DashboardInsider } from 'components';
import { useTransactionsByReference } from 'hooks/query';
const InvoiceDetailDrawerContext = React.createContext();
/**
* Invoice detail provider.
*/
function InvoiceDetailDrawerProvider({ invoiceId, ...props }) {
// Handle fetch transaction by reference.
const { data, isLoading: isTransactionLoading } = useTransactionsByReference(
{
reference_id: invoiceId,
reference_type: 'SaleInvoice',
},
{ enabled: !!invoiceId },
);
//provider.
const provider = {
data,
};
return (
<DashboardInsider loading={isTransactionLoading}>
<DrawerHeaderContent
name="invoice-detail-drawer"
title={intl.get('invoice_details')}
/>
<InvoiceDetailDrawerContext.Provider value={provider} {...props} />
</DashboardInsider>
);
}
const useInvoiceDetailDrawerContext = () =>
React.useContext(InvoiceDetailDrawerContext);
export { InvoiceDetailDrawerProvider, useInvoiceDetailDrawerContext };

View File

@@ -0,0 +1,28 @@
import React from 'react';
import { Drawer, DrawerSuspense } from 'components';
import withDrawers from 'containers/Drawer/withDrawers';
import { compose } from 'utils';
const InvoiceDetailDrawerContent = React.lazy(() =>
import('./InvoiceDetailDrawerContent'),
);
/**
* Invoice Detail drawer.
*/
function InvoiceDetailDrawer({
name,
// #withDrawer
isOpen,
payload: { invoiceId },
}) {
return (
<Drawer isOpen={isOpen} name={name} size={'750px'}>
<DrawerSuspense>
<InvoiceDetailDrawerContent invoice={invoiceId} />
</DrawerSuspense>
</Drawer>
);
}
export default compose(withDrawers())(InvoiceDetailDrawer);

View File

@@ -0,0 +1,20 @@
import React from 'react';
import 'style/components/Drawers/ViewDetail/ViewDetail.scss';
import PaymentMadeDetails from './PaymentMadeDetails';
import { PaymentMadeDetailProvider } from './PaymentMadeDetailProvider';
/**
* Payment made detail content.
*/
export default function PaymentMadeDetailContent({
// #ownProp
paymentMade,
}) {
return (
<PaymentMadeDetailProvider paymentMadeId={paymentMade}>
<PaymentMadeDetails />
</PaymentMadeDetailProvider>
);
}

View File

@@ -0,0 +1,39 @@
import React from 'react';
import intl from 'react-intl-universal';
import { DrawerHeaderContent, DashboardInsider } from 'components';
import { useTransactionsByReference } from 'hooks/query';
const PaymentMadeDetailContext = React.createContext();
/**
* Payment made detail provider.
*/
function PaymentMadeDetailProvider({ paymentMadeId, ...props }) {
// Handle fetch transaction by reference.
const { data, isLoading: isTransactionLoading } = useTransactionsByReference(
{
reference_id: paymentMadeId,
reference_type: 'paymentMade',
},
{ enabled: !!paymentMadeId },
);
//provider.
const provider = {
data,
};
return (
<DashboardInsider loading={isTransactionLoading}>
<DrawerHeaderContent
name="payment-made-detail-drawer"
title={intl.get('payment_made_details')}
/>
<PaymentMadeDetailContext.Provider value={provider} {...props} />
</DashboardInsider>
);
}
const usePaymentMadeDetailContext = () =>
React.useContext(PaymentMadeDetailContext);
export { PaymentMadeDetailProvider, usePaymentMadeDetailContext };

View File

@@ -0,0 +1,23 @@
import React from 'react';
import { Tabs, Tab } from '@blueprintjs/core';
import intl from 'react-intl-universal';
import JournalEntriesTable from '../../JournalEntriesTable/JournalEntriesTable';
/**
* payment made view detail.
*/
export default function PaymentMadeDetails() {
return (
<div className="view-detail-drawer">
<Tabs animate={true} large={true} defaultSelectedTabId="journal_entries">
<Tab title={intl.get('details')} id={'details'} disabled={true} />
<Tab
title={intl.get('journal_entries')}
id={'journal_entries'}
panel={<JournalEntriesTable journal={[]} />}
/>
</Tabs>
</div>
);
}

View File

@@ -0,0 +1,29 @@
import React from 'react';
import { Drawer, DrawerSuspense } from 'components';
import withDrawers from 'containers/Drawer/withDrawers';
import { compose } from 'utils';
const PaymentMadeDetailContent = React.lazy(() =>
import('./PaymentMadeDetailContent'),
);
/**
* Payment made detail drawer.
*/
function PaymentMadeDetailDrawer({
name,
// #withDrawer
isOpen,
payload: { paymentMadeId },
}) {
return (
<Drawer isOpen={isOpen} name={name} size={'750px'}>
<DrawerSuspense>
<PaymentMadeDetailContent paymentMade={paymentMadeId} />
</DrawerSuspense>
</Drawer>
);
}
export default compose(withDrawers())(PaymentMadeDetailDrawer);

View File

@@ -0,0 +1,26 @@
import React from 'react';
import { Tabs, Tab } from '@blueprintjs/core';
import intl from 'react-intl-universal';
import JournalEntriesTable from '../../JournalEntriesTable/JournalEntriesTable';
import { usePaymentReceiveDetailContext } from './PaymentReceiveDetailProvider';
/**
* payment receive view detail.
*/
export default function PaymentReceiveDetail() {
const { data } = usePaymentReceiveDetailContext();
return (
<div className="view-detail-drawer">
<Tabs animate={true} large={true} defaultSelectedTabId="journal_entries">
<Tab title={intl.get('details')} id={'details'} disabled={true} />
<Tab
title={intl.get('journal_entries')}
id={'journal_entries'}
panel={<JournalEntriesTable transactions={data} />}
/>
</Tabs>
</div>
);
}

View File

@@ -0,0 +1,21 @@
import React from 'react';
import 'style/components/Drawers/ViewDetail/ViewDetail.scss';
import PaymentReceiveDetail from './PaymentReceiveDetail';
import { PaymentReceiveDetailProvider } from './PaymentReceiveDetailProvider';
/**
* Payment receive detail content.
*/
export default function PaymentReceiveDetailContent({
// #ownProp
paymentReceive,
}) {
return (
<PaymentReceiveDetailProvider paymentReceiveId={paymentReceive}>
<PaymentReceiveDetail />
</PaymentReceiveDetailProvider>
);
}

View File

@@ -0,0 +1,39 @@
import React from 'react';
import intl from 'react-intl-universal';
import { DrawerHeaderContent, DashboardInsider } from 'components';
import { useTransactionsByReference } from 'hooks/query';
const PaymentReceiveDetailContext = React.createContext();
/**
* Payment receive detail provider.
*/
function PaymentReceiveDetailProvider({ paymentReceiveId, ...props }) {
// Handle fetch transaction by reference.
const { data, isLoading: isTransactionLoading } = useTransactionsByReference(
{
reference_id: paymentReceiveId,
reference_type: 'paymentReceive',
},
{ enabled: !!paymentReceiveId },
);
//provider.
const provider = { data };
return (
<DashboardInsider loading={isTransactionLoading}>
<DrawerHeaderContent
name="payment-receive-detail-drawer"
title={intl.get('payment_receive_details')}
/>
<PaymentReceiveDetailContext.Provider value={provider} {...props} />
</DashboardInsider>
);
}
const usePaymentReceiveDetailContext = () =>
React.useContext(PaymentReceiveDetailContext);
export { PaymentReceiveDetailProvider, usePaymentReceiveDetailContext };

View File

@@ -0,0 +1,29 @@
import React from 'react';
import { Drawer, DrawerSuspense } from 'components';
import withDrawers from 'containers/Drawer/withDrawers';
import { compose } from 'utils';
const PaymentReceiveDetailContent = React.lazy(() =>
import('./PaymentReceiveDetailContent'),
);
/**
* Payment receive detail drawer
*/
function PaymentReceiveDetailDrawer({
name,
// #withDrawer
isOpen,
payload: { paymentReceiveId },
}) {
return (
<Drawer isOpen={isOpen} name={name} size={'750px'}>
<DrawerSuspense>
<PaymentReceiveDetailContent paymentReceive={paymentReceiveId} />
</DrawerSuspense>
</Drawer>
);
}
export default compose(withDrawers())(PaymentReceiveDetailDrawer);

View File

@@ -0,0 +1,26 @@
import React from 'react';
import { Tabs, Tab } from '@blueprintjs/core';
import intl from 'react-intl-universal';
import JournalEntriesTable from '../../JournalEntriesTable/JournalEntriesTable';
import { useReceiptDetailDrawerContext } from './ReceiptDetailDrawerProvider';
/**
* Receipt view detail.
*/
export default function ReceiptDetail() {
const { data } = useReceiptDetailDrawerContext();
return (
<div className="view-detail-drawer">
<Tabs animate={true} large={true} defaultSelectedTabId="journal_entries">
<Tab title={intl.get('details')} id={'details'} disabled={true} />
<Tab
title={intl.get('journal_entries')}
id={'journal_entries'}
panel={<JournalEntriesTable transactions={data} />}
/>
</Tabs>
</div>
);
}

View File

@@ -0,0 +1,20 @@
import React from 'react';
import 'style/components/Drawers/ViewDetail/ViewDetail.scss';
import ReceiptDetail from './ReceiptDetail';
import { ReceiptDetailDrawerProvider } from './ReceiptDetailDrawerProvider';
/**
* Receipt detail drawer content.
*/
export default function ReceiptDetailDrawerContent({
// #ownProp
receipt,
}) {
return (
<ReceiptDetailDrawerProvider receiptId={receipt}>
<ReceiptDetail />
</ReceiptDetailDrawerProvider>
);
}

View File

@@ -0,0 +1,40 @@
import React from 'react';
import intl from 'react-intl-universal';
import { DrawerHeaderContent, DashboardInsider } from 'components';
import { useTransactionsByReference } from 'hooks/query';
// useTransactionsByReference
const ReceiptDetailDrawerContext = React.createContext();
/**
* Receipt detail provider.
*/
function ReceiptDetailDrawerProvider({ receiptId, ...props }) {
// Handle fetch transaction by reference.
const { data, isLoading: isTransactionLoading } = useTransactionsByReference(
{
reference_id: receiptId,
reference_type: 'SaleReceipt',
},
{ enabled: !!receiptId },
);
//provider.
const provider = {
data,
};
return (
<DashboardInsider loading={isTransactionLoading}>
<DrawerHeaderContent
name="receipt-detail-drawer"
title={intl.get('receipt_details')}
/>
<ReceiptDetailDrawerContext.Provider value={provider} {...props} />
</DashboardInsider>
);
}
const useReceiptDetailDrawerContext = () =>
React.useContext(ReceiptDetailDrawerContext);
export { ReceiptDetailDrawerProvider, useReceiptDetailDrawerContext };

View File

@@ -0,0 +1,29 @@
import React from 'react';
import { Drawer, DrawerSuspense } from 'components';
import withDrawers from 'containers/Drawer/withDrawers';
import { compose } from 'utils';
const ReceiptDetailDrawerContent = React.lazy(() =>
import('./ReceiptDetailDrawerContent'),
);
/**
* Receipt Detail drawer.
*/
function ReceiptDetailDrawer({
name,
// #withDrawer
isOpen,
payload: { receiptId },
}) {
return (
<Drawer isOpen={isOpen} name={name} size={'750px'}>
<DrawerSuspense>
<ReceiptDetailDrawerContent receipt={receiptId} />
</DrawerSuspense>
</Drawer>
);
}
export default compose(withDrawers())(ReceiptDetailDrawer);

View File

@@ -79,10 +79,7 @@ function ExpenseForm({
}
const categories = values.categories.filter(
(category) =>
category.amount &&
category.index &&
category.expense_account_id &&
category.landed_cost,
category.amount && category.index && category.expense_account_id,
);
const form = {

View File

@@ -31,7 +31,7 @@ export const defaultExpenseEntry = {
amount: '',
expense_account_id: '',
description: '',
landed_cost: false,
landed_cost: 0,
};
export const defaultExpense = {

View File

@@ -0,0 +1,51 @@
import React from 'react';
import { DataTable, Card } from 'components';
import intl from 'react-intl-universal';
import moment from 'moment';
/**
* Journal entries table.
*/
export default function JournalEntriesTable({ transactions }) {
const columns = React.useMemo(
() => [
{
Header: intl.get('date'),
accessor: 'date',
// accessor: (r) => moment(new Date()).format('YYYY MMM DD'),
width: 150,
},
{
Header: intl.get('account_name'),
accessor: 'accountName',
width: 150,
},
{
Header: intl.get('contact'),
accessor: 'contactTypeFormatted',
width: 150,
},
{
Header: intl.get('credit'),
accessor: ({ credit }) => credit.formattedAmount,
width: 100,
},
{
Header: intl.get('debit'),
accessor: ({ debit }) => debit.formattedAmount,
width: 100,
},
],
[],
);
return (
<Card>
<DataTable
columns={columns}
data={transactions}
className={'datatable--journal-entries'}
/>
</Card>
);
}

View File

@@ -12,6 +12,7 @@ import withPaymentMadeActions from './withPaymentMadeActions';
import withPaymentMade from './withPaymentMade';
import withSettings from 'containers/Settings/withSettings';
import withAlertsActions from 'containers/Alert/withAlertActions';
import withDrawerActions from 'containers/Drawer/withDrawerActions';
import { usePaymentMadesTableColumns, ActionsMenu } from './components';
import { usePaymentMadesListContext } from './PaymentMadesListProvider';
@@ -27,6 +28,9 @@ function PaymentMadesTable({
// #withAlerts
openAlert,
// #withDrawerActions
openDrawer,
}) {
// Payment mades table columns.
const columns = usePaymentMadesTableColumns();
@@ -53,6 +57,11 @@ function PaymentMadesTable({
openAlert('payment-made-delete', { paymentMadeId: paymentMade.id });
};
// Handle view detail payment made.
const handleViewDetailPaymentMade = ({ id }) => {
openDrawer('payment-receive-detail-drawer', { paymentMadeId: id });
};
// Handle datatable fetch data once the table state change.
const handleDataTableFetchData = useCallback(
({ pageIndex, pageSize, sortBy }) => {
@@ -89,6 +98,7 @@ function PaymentMadesTable({
payload={{
onEdit: handleEditPaymentMade,
onDelete: handleDeletePaymentMade,
onViewDetails: handleViewDetailPaymentMade,
}}
/>
);
@@ -98,6 +108,7 @@ export default compose(
withPaymentMadeActions,
withPaymentMade(({ paymentMadesTableState }) => ({ paymentMadesTableState })),
withAlertsActions,
withDrawerActions,
withSettings(({ organizationSettings }) => ({
baseCurrency: organizationSettings?.baseCurrency,
})),

View File

@@ -26,15 +26,14 @@ export function AmountAccessor(row) {
*/
export function ActionsMenu({
row: { original },
payload: { onEdit, onDelete },
payload: { onEdit, onDelete, onViewDetails },
}) {
return (
<Menu>
<MenuItem
icon={<Icon icon="reader-18" />}
text={intl.get('view_details')}
onClick={safeCallback(onViewDetails, original)}
/>
<MenuDivider />
<MenuItem
@@ -70,8 +69,6 @@ export function ActionsCell(props) {
* Retrieve payment mades table columns.
*/
export function usePaymentMadesTableColumns() {
return React.useMemo(
() => [
{

View File

@@ -79,6 +79,12 @@ function InvoicesDataTable({
const handleQuickPaymentReceive = ({ id }) => {
openDialog('quick-payment-receive', { invoiceId: id });
};
// Handle view detail invoice.
const handleViewDetailInvoice = ({ id }) => {
openDrawer('invoice-detail-drawer', { invoiceId: id });
};
// Handles fetch data once the table state change.
const handleDataTableFetchData = useCallback(
({ pageSize, pageIndex, sortBy }) => {
@@ -123,6 +129,7 @@ function InvoicesDataTable({
onEdit: handleEditInvoice,
onDrawer: handleDrawerInvoice,
onQuick: handleQuickPaymentReceive,
onViewDetails: handleViewDetailInvoice,
baseCurrency,
}}
/>

View File

@@ -95,7 +95,7 @@ export const handleDeleteErrors = (errors) => {
};
export function ActionsMenu({
payload: { onEdit, onDeliver, onDelete, onDrawer, onQuick },
payload: { onEdit, onDeliver, onDelete, onDrawer, onQuick, onViewDetails },
row: { original },
}) {
return (
@@ -103,6 +103,7 @@ export function ActionsMenu({
<MenuItem
icon={<Icon icon="reader-18" />}
text={intl.get('view_details')}
onClick={safeCallback(onViewDetails, original)}
/>
<MenuDivider />
<MenuItem

View File

@@ -62,6 +62,11 @@ function PaymentReceivesDataTable({
openDrawer('payment-receive-drawer', { paymentReceiveId: id });
};
// Handle view detail payment receive..
const handleViewDetailPaymentReceive = ({ id }) => {
openDrawer('payment-receive-detail-drawer', { paymentReceiveId: id });
};
// Handle datatable fetch once the table's state changing.
const handleDataTableFetchData = useCallback(
({ pageIndex, pageSize, sortBy }) => {
@@ -103,6 +108,7 @@ function PaymentReceivesDataTable({
onDelete: handleDeletePaymentReceive,
onEdit: handleEditPaymentReceive,
onDrawer: handleDrawerPaymentReceive,
onViewDetails: handleViewDetailPaymentReceive,
}}
/>
);

View File

@@ -19,15 +19,14 @@ import { safeCallback } from 'utils';
*/
export function ActionsMenu({
row: { original: paymentReceive },
payload: { onEdit, onDelete, onDrawer },
payload: { onEdit, onDelete, onDrawer, onViewDetails },
}) {
return (
<Menu>
<MenuItem
icon={<Icon icon="reader-18" />}
text={intl.get('view_details')}
onClick={safeCallback(onViewDetails, paymentReceive)}
/>
<MenuDivider />
<MenuItem
@@ -82,8 +81,6 @@ export function ActionsCell(props) {
* Retrieve payment receives columns.
*/
export function usePaymentReceivesColumns() {
return React.useMemo(
() => [
{
@@ -128,7 +125,7 @@ export function usePaymentReceivesColumns() {
accessor: 'reference_no',
width: 140,
className: 'reference_no',
}
},
],
[],
);

View File

@@ -60,14 +60,19 @@ function ReceiptsDataTable({
openAlert('receipt-delete', { receiptId: receipt.id });
};
// Handle drawer receipts.
const handleDrawerReceipt = ({ id }) => {
openDrawer('receipt-drawer', { receiptId: id });
};
// Handles receipt close action.
const handleCloseReceipt = (receipt) => {
openAlert('receipt-close', { receiptId: receipt.id });
};
// Handle drawer receipts.
const handleDrawerReceipt = ({ id }) => {
openDrawer('receipt-drawer', { receiptId: id });
// Handle view detail receipt.
const handleViewDetailReceipt = ({ id }) => {
openDrawer('receipt-detail-drawer', { receiptId: id });
};
// Handles the datable fetch data once the state changing.
@@ -112,6 +117,7 @@ function ReceiptsDataTable({
onDelete: handleDeleteReceipt,
onClose: handleCloseReceipt,
onDrawer: handleDrawerReceipt,
onViewDetails: handleViewDetailReceipt,
baseCurrency,
}}
/>

View File

@@ -16,16 +16,15 @@ import { Choose, Money, Icon, If } from 'components';
import moment from 'moment';
export function ActionsMenu({
payload: { onEdit, onDelete, onClose, onDrawer },
payload: { onEdit, onDelete, onClose, onDrawer, onViewDetails },
row: { original: receipt },
}) {
return (
<Menu>
<MenuItem
icon={<Icon icon="reader-18" />}
text={intl.get('view_details')}
onClick={safeCallback(onViewDetails, receipt)}
/>
<MenuDivider />
<MenuItem
@@ -94,8 +93,6 @@ export function StatusAccessor(receipt) {
* Retrieve receipts table columns.
*/
export function useReceiptsTableColumns() {
return React.useMemo(
() => [
{

View File

@@ -466,3 +466,22 @@ export function useInventoryItemDetailsReport(query, props) {
},
);
}
/**
* Retrieve transactions by reference report.
*/
export function useTransactionsByReference(query, props) {
return useRequestQuery(
[t.TRANSACTIONS_BY_REFERENCE, query],
{
method: 'get',
url: `/financial_statements/transactions-by-reference`,
params: query,
},
{
select: (res) => res.data.data,
defaultData: {},
...props,
},
);
}

View File

@@ -23,6 +23,7 @@ const FINANCIAL_REPORTS = {
INVENTORY_VALUATION: 'INVENTORY_VALUATION',
CASH_FLOW_STATEMENT: 'CASH_FLOW_STATEMENT',
INVENTORY_ITEM_DETAILS: 'INVENTORY_ITEM_DETAILS',
TRANSACTIONS_BY_REFERENCE: 'TRANSACTIONS_BY_REFERENCE',
};
const BILLS = {

View File

@@ -1166,5 +1166,11 @@
"From transaction": "From transaction",
"Landed": "Landed",
"This options allows you to be able to add additional cost eg. freight then allocate cost to the items in your bills.": "This options allows you to be able to add additional cost eg. freight then allocate cost to the items in your bills.",
"Once your delete this located landed cost, you won't be able to restore it later, Are your sure you want to delete this transaction?": "Once your delete this located landed cost, you won't be able to restore it later, Are your sure you want to delete this transaction?"
"Once your delete this located landed cost, you won't be able to restore it later, Are your sure you want to delete this transaction?": "Once your delete this located landed cost, you won't be able to restore it later, Are your sure you want to delete this transaction?",
"journal_entries":"Journal entries",
"contact":"Contact",
"invoice_details":"Invoice details",
"receipt_details":"Receipt details",
"payment_receive_details":"Payment receive details",
"payment_made_details":"Payment made details"
}

View File

@@ -6,7 +6,8 @@ import t from 'store/types';
const getSubscriptionPlans = () => [
{
name: intl.get('Starter'),
slug: 'starter',
slug: 'free',
// slug: 'starter',
description: [
intl.get('Sale and purchase invoices.'),
intl.get('Customers/vendors accounts.'),

View File

@@ -1,11 +1,11 @@
@import '../../Base.scss';
@import '../../../Base.scss';
.bill-drawer {
.view-detail-drawer {
.bp3-tabs {
.bp3-tab-list {
position: relative;
background-color: #FFF;
background-color: #fff;
&:before {
content: '';
position: absolute;
@@ -31,10 +31,10 @@
}
}
.bp3-tab-panel{
.bp3-tab-panel {
margin-top: 0;
.card{
.card {
margin: 15px;
}
}
@@ -42,7 +42,6 @@
.datatable--landed-cost-transactions {
.table {
.tbody,
.tbody-inner {
height: auto;
@@ -55,11 +54,11 @@
.tr .td {
padding: 0.6rem;
&.amount{
&.amount {
font-weight: 600;
}
}
}
}
}
}
}