diff --git a/packages/server/src/api/controllers/Banking/ExcludeBankTransactionsController.ts b/packages/server/src/api/controllers/Banking/ExcludeBankTransactionsController.ts index e425247d2..e38e818b3 100644 --- a/packages/server/src/api/controllers/Banking/ExcludeBankTransactionsController.ts +++ b/packages/server/src/api/controllers/Banking/ExcludeBankTransactionsController.ts @@ -46,6 +46,10 @@ export class ExcludeBankTransactionsController extends BaseController { query('account_id').optional().isNumeric().toInt(), query('page').optional().isNumeric().toInt(), query('page_size').optional().isNumeric().toInt(), + query('min_date').optional({ nullable: true }).isISO8601().toDate(), + query('max_date').optional({ nullable: true }).isISO8601().toDate(), + query('min_amount').optional({ nullable: true }).isFloat().toFloat(), + query('max_amount').optional({ nullable: true }).isFloat().toFloat(), ], this.validationResult, this.getExcludedBankTransactions.bind(this) diff --git a/packages/server/src/api/controllers/Banking/RecognizedTransactionsController.ts b/packages/server/src/api/controllers/Banking/RecognizedTransactionsController.ts index b52c4ebe1..15de0ae89 100644 --- a/packages/server/src/api/controllers/Banking/RecognizedTransactionsController.ts +++ b/packages/server/src/api/controllers/Banking/RecognizedTransactionsController.ts @@ -21,6 +21,10 @@ export class RecognizedTransactionsController extends BaseController { query('page').optional().isNumeric().toInt(), query('page_size').optional().isNumeric().toInt(), query('account_id').optional().isNumeric().toInt(), + query('min_date').optional({ nullable: true }).isISO8601().toDate(), + query('max_date').optional({ nullable: true }).isISO8601().toDate(), + query('min_amount').optional({ nullable: true }).isFloat().toFloat(), + query('max_amount').optional({ nullable: true }).isFloat().isFloat(), ], this.validationResult, this.getRecognizedTransactions.bind(this) diff --git a/packages/server/src/api/controllers/Cashflow/NewCashflowTransaction.ts b/packages/server/src/api/controllers/Cashflow/NewCashflowTransaction.ts index 963e5b061..554d22bf6 100644 --- a/packages/server/src/api/controllers/Cashflow/NewCashflowTransaction.ts +++ b/packages/server/src/api/controllers/Cashflow/NewCashflowTransaction.ts @@ -84,8 +84,10 @@ export default class NewCashflowTransactionController extends BaseController { param('id').exists().isNumeric().toInt(), query('page').optional().isNumeric().toInt(), query('page_size').optional().isNumeric().toInt(), - query('min_date').optional().isISO8601().toDate(), - query('max_date').optional().isISO8601().toDate(), + query('min_date').optional({ nullable: true }).isISO8601().toDate(), + query('max_date').optional({ nullable: true }).isISO8601().toDate(), + query('min_amount').optional({ nullable: true }).isFloat().toFloat(), + query('max_amount').optional({ nullable: true }).isFloat().toFloat(), ]; } diff --git a/packages/webapp/src/containers/CashFlow/AccountTransactions/AccountTransactionsDateFilter.tsx b/packages/webapp/src/containers/CashFlow/AccountTransactions/AccountTransactionsDateFilter.tsx index 64eb3760c..f15debd91 100644 --- a/packages/webapp/src/containers/CashFlow/AccountTransactions/AccountTransactionsDateFilter.tsx +++ b/packages/webapp/src/containers/CashFlow/AccountTransactions/AccountTransactionsDateFilter.tsx @@ -67,7 +67,7 @@ export function AccountTransactionsDateFilterForm({ + ); diff --git a/packages/webapp/src/containers/CashFlow/AccountTransactions/AllTransactionsUncategorizedBoot.tsx b/packages/webapp/src/containers/CashFlow/AccountTransactions/AllTransactionsUncategorizedBoot.tsx index 2ca46e588..37fd3ad18 100644 --- a/packages/webapp/src/containers/CashFlow/AccountTransactions/AllTransactionsUncategorizedBoot.tsx +++ b/packages/webapp/src/containers/CashFlow/AccountTransactions/AllTransactionsUncategorizedBoot.tsx @@ -37,8 +37,8 @@ function AccountUncategorizedTransactionsBootRoot({ hasNextPage: hasUncategorizedTransactionsNextPage, } = useAccountUncategorizedTransactionsInfinity(accountId, { page_size: 50, - min_date: uncategorizedTransactionsFilter?.fromDate, - max_date: uncategorizedTransactionsFilter?.toDate, + min_date: uncategorizedTransactionsFilter?.fromDate || null, + max_date: uncategorizedTransactionsFilter?.toDate || null, }); // Memorized the cashflow account transactions. const uncategorizedTransactions = React.useMemo( diff --git a/packages/webapp/src/containers/CashFlow/AccountTransactions/ExcludedTransactions/ExcludedTransactionsTableBoot.tsx b/packages/webapp/src/containers/CashFlow/AccountTransactions/ExcludedTransactions/ExcludedTransactionsTableBoot.tsx index 9fd86a240..dc1d19860 100644 --- a/packages/webapp/src/containers/CashFlow/AccountTransactions/ExcludedTransactions/ExcludedTransactionsTableBoot.tsx +++ b/packages/webapp/src/containers/CashFlow/AccountTransactions/ExcludedTransactions/ExcludedTransactionsTableBoot.tsx @@ -1,9 +1,11 @@ // @ts-nocheck import React from 'react'; import { flatten, map } from 'lodash'; +import * as R from 'ramda'; import { IntersectionObserver } from '@/components'; import { useAccountTransactionsContext } from '../AccountTransactionsProvider'; import { useExcludedBankTransactionsInfinity } from '@/hooks/query/bank-rules'; +import { withBanking } from '../../withBanking'; interface ExcludedBankTransactionsContextValue { isExcludedTransactionsLoading: boolean; @@ -27,7 +29,11 @@ interface ExcludedBankTransactionsTableBootProps { /** * Account uncategorized transctions provider. */ -function ExcludedBankTransactionsTableBoot({ +function ExcludedBankTransactionsTableBootRoot({ + // #withBanking + uncategorizedTransactionsFilter, + + // #ownProps children, }: ExcludedBankTransactionsTableBootProps) { const { accountId } = useAccountTransactionsContext(); @@ -44,6 +50,8 @@ function ExcludedBankTransactionsTableBoot({ } = useExcludedBankTransactionsInfinity({ page_size: 50, account_id: accountId, + min_date: uncategorizedTransactionsFilter?.fromDate || null, + max_date: uncategorizedTransactionsFilter.toDate || null, }); // Memorized the cashflow account transactions. const excludedBankTransactions = React.useMemo( @@ -84,6 +92,12 @@ function ExcludedBankTransactionsTableBoot({ ); } +const ExcludedBankTransactionsTableBoot = R.compose( + withBanking(({ uncategorizedTransactionsFilter }) => ({ + uncategorizedTransactionsFilter, + })), +)(ExcludedBankTransactionsTableBootRoot); + const useExcludedTransactionsBoot = () => React.useContext(ExcludedTransactionsContext); diff --git a/packages/webapp/src/containers/CashFlow/AccountTransactions/RecognizedTransactions/RecognizedTransactionsTableBoot.tsx b/packages/webapp/src/containers/CashFlow/AccountTransactions/RecognizedTransactions/RecognizedTransactionsTableBoot.tsx index 5d99b4a45..af0e7fed2 100644 --- a/packages/webapp/src/containers/CashFlow/AccountTransactions/RecognizedTransactions/RecognizedTransactionsTableBoot.tsx +++ b/packages/webapp/src/containers/CashFlow/AccountTransactions/RecognizedTransactions/RecognizedTransactionsTableBoot.tsx @@ -1,9 +1,11 @@ // @ts-nocheck import React from 'react'; import { flatten, map } from 'lodash'; -import { IntersectionObserver } from '@/components'; +import * as R from 'ramda'; +import { IntersectionObserver, NumericInputCell } from '@/components'; import { useAccountTransactionsContext } from '../AccountTransactionsProvider'; import { useRecognizedBankTransactionsInfinity } from '@/hooks/query/bank-rules'; +import { withBanking } from '../../withBanking'; interface RecognizedTransactionsContextValue { isRecongizedTransactionsLoading: boolean; @@ -27,7 +29,10 @@ interface RecognizedTransactionsTableBootProps { /** * Account uncategorized transctions provider. */ -function RecognizedTransactionsTableBoot({ +function RecognizedTransactionsTableBootRoot({ + // #withBanking + uncategorizedTransactionsFilter, + children, }: RecognizedTransactionsTableBootProps) { const { accountId } = useAccountTransactionsContext(); @@ -44,6 +49,8 @@ function RecognizedTransactionsTableBoot({ } = useRecognizedBankTransactionsInfinity({ page_size: 50, account_id: accountId, + min_date: uncategorizedTransactionsFilter.fromDate || null, + max_date: uncategorizedTransactionsFilter?.toDate || null, }); // Memorized the cashflow account transactions. const recognizedTransactions = React.useMemo( @@ -84,6 +91,12 @@ function RecognizedTransactionsTableBoot({ ); } +const RecognizedTransactionsTableBoot = R.compose( + withBanking(({ uncategorizedTransactionsFilter }) => ({ + uncategorizedTransactionsFilter, + })), +)(RecognizedTransactionsTableBootRoot); + const useRecognizedTransactionsBoot = () => React.useContext(RecognizedTransactionsContext); diff --git a/packages/webapp/src/containers/CashFlow/AccountTransactions/UncategorizedTransactions/AccountUncategorizedDateFilter.tsx b/packages/webapp/src/containers/CashFlow/AccountTransactions/UncategorizedTransactions/AccountUncategorizedDateFilter.tsx index 5de4d073f..7443a7e14 100644 --- a/packages/webapp/src/containers/CashFlow/AccountTransactions/UncategorizedTransactions/AccountUncategorizedDateFilter.tsx +++ b/packages/webapp/src/containers/CashFlow/AccountTransactions/UncategorizedTransactions/AccountUncategorizedDateFilter.tsx @@ -1,8 +1,9 @@ // @ts-nocheck +import { useState } from 'react'; import * as R from 'ramda'; import moment from 'moment'; import { Box, Icon } from '@/components'; -import { Button, Classes, Popover, Position } from '@blueprintjs/core'; +import { Classes, Popover, Position } from '@blueprintjs/core'; import { withBankingActions } from '../../withBankingActions'; import { withBanking } from '../../withBanking'; import { AccountTransactionsDateFilterForm } from '../AccountTransactionsDateFilter'; @@ -29,17 +30,31 @@ function AccountUncategorizedDateFilterRoot({ ? `Date: ${fromDateFormatted} → ${toDateFormatted}` : 'Date Filter'; + // Popover open state. + const [isOpen, setIsOpen] = useState(false); + + // Handle the filter form submitting. + const handleSubmit = () => { + setIsOpen(false); + }; + return ( - + } position={Position.RIGHT} popoverClassName={Classes.POPOVER_CONTENT} + isOpen={isOpen} + onClose={() => setIsOpen(false)} > - }> + } + onClick={() => setIsOpen(!isOpen)} + > {buttonText} @@ -64,6 +79,9 @@ export const UncategorizedTransactionsDateFilter = R.compose( // #withBanking uncategorizedTransactionsFilter, + + // #ownProps + onSubmit, }) => { const initialValues = { ...uncategorizedTransactionsFilter, @@ -74,6 +92,7 @@ export const UncategorizedTransactionsDateFilter = R.compose( fromDate: values.fromDate, toDate: values.toDate, }); + onSubmit && onSubmit(values); }; return (