import React, { useCallback, useMemo } from 'react'; import { Intent, Button, Classes, Popover, Tooltip, Menu, MenuItem, MenuDivider, Position, Tag, } from '@blueprintjs/core'; import { FormattedMessage as T, useIntl } from 'react-intl'; import moment from 'moment'; import classNames from 'classnames'; import Icon from 'components/Icon'; import { compose, saveInvoke } from 'utils'; import { useExpensesListContext } from './ExpensesListProvider'; import { If, Money, Choose } from 'components'; import { CLASSES } from 'common/classes'; import DataTable from 'components/DataTable'; import ExpensesEmptyStatus from './ExpensesEmptyStatus'; import withDialogActions from 'containers/Dialog/withDialogActions'; import withDashboardActions from 'containers/Dashboard/withDashboardActions'; import withExpensesActions from 'containers/Expenses/withExpensesActions'; import TableSkeletonRows from 'components/Datatable/TableSkeletonRows'; /** * Expenses datatable. */ function ExpensesDataTable({ // #withExpensesActions addExpensesTableQueries, // #ownProps onEditExpense, onDeleteExpense, onPublishExpense, onSelectedRowsChange, }) { const { formatMessage } = useIntl(); const { expenses, isExpensesLoading } = useExpensesListContext(); // Handle fetch data of manual jouranls datatable. const handleFetchData = useCallback( ({ pageIndex, pageSize, sortBy }) => { addExpensesTableQueries({ ...(sortBy.length > 0 ? { column_sort_by: sortBy[0].id, sort_order: sortBy[0].desc ? 'desc' : 'asc', } : {}), page_size: pageSize, page: pageIndex + 1, }); }, [addExpensesTableQueries], ); const handlePublishExpense = useCallback( (expense) => () => { saveInvoke(onPublishExpense, expense); }, [onPublishExpense], ); const handleEditExpense = useCallback( (expense) => () => { saveInvoke(onEditExpense, expense); }, [onEditExpense], ); const handleDeleteExpense = useCallback( (expense) => () => { saveInvoke(onDeleteExpense, expense); }, [onDeleteExpense], ); const actionMenuList = useCallback( (expense) => ( } text={formatMessage({ id: 'view_details' })} /> } text={formatMessage({ id: 'publish_expense' })} onClick={handlePublishExpense(expense)} /> } text={formatMessage({ id: 'edit_expense' })} onClick={handleEditExpense(expense)} /> } text={formatMessage({ id: 'delete_expense' })} intent={Intent.DANGER} onClick={handleDeleteExpense(expense)} /> ), [ handleEditExpense, handleDeleteExpense, handlePublishExpense, formatMessage, ], ); const onRowContextMenu = useCallback( (cell) => { return actionMenuList(cell.row.original); }, [actionMenuList], ); const expenseAccountAccessor = (_expense) => { if (_expense.categories.length === 1) { return _expense.categories[0].expense_account.name; } else if (_expense.categories.length > 1) { const mutliCategories = _expense.categories.map((category) => (
- {category.expense_account.name} ${category.amount}
)); return ( {'- Multi Categories -'} ); } }; const columns = useMemo( () => [ { id: 'payment_date', Header: formatMessage({ id: 'payment_date' }), accessor: (r) => moment(r.payment_date).format('YYYY MMM DD'), width: 140, className: 'payment_date', }, { id: 'total_amount', Header: formatMessage({ id: 'full_amount' }), accessor: (r) => ( ), className: 'total_amount', width: 150, }, { id: 'payment_account_id', Header: formatMessage({ id: 'payment_account' }), accessor: 'payment_account.name', className: 'payment_account', width: 150, }, { id: 'expense_account_id', Header: formatMessage({ id: 'expense_account' }), accessor: expenseAccountAccessor, width: 160, className: 'expense_account', }, { id: 'publish', Header: formatMessage({ id: 'publish' }), accessor: (r) => { return r.is_published ? ( ) : ( ); }, width: 100, className: 'publish', }, { id: 'description', Header: formatMessage({ id: 'description' }), accessor: (row) => ( ), disableSorting: true, width: 150, className: 'description', }, { id: 'actions', Header: '', Cell: ({ cell }) => (