From f4008adc1653c52debf0f2b0ec79e27cca00577e Mon Sep 17 00:00:00 2001 From: Nikhil Kothari Date: Mon, 11 May 2026 13:02:11 +0530 Subject: [PATCH] fix: UI/UX issues in new banking module (#54824) * fix: enforce user permissions on bank account get_list * feat: auto-select last used bank account * fix: skeleton loaders in bank balance * fix: show empty state for no bank transactions * chore: add Stripe and PayPal logos * fix: alignment of header text in list-view * fix: wrap words in transaction description * fix: change file-dropzone color on hover --- .../BankReconciliation/BankBalance.tsx | 8 +-- .../BankReconciliation/BankPicker.tsx | 16 +++++- .../BankTransactionList.tsx | 49 ++++++++-------- .../BankReconciliation/MatchAndReconcile.tsx | 4 +- .../BankReconciliation/bankRecAtoms.ts | 4 +- .../features/BankReconciliation/logos.ts | 13 +++++ banking/src/components/ui/file-dropzone.tsx | 2 +- banking/src/components/ui/list-view.tsx | 6 +- .../doctype/bank_account/bank_account.py | 54 ++++++++---------- erpnext/public/images/bank-logos/PayPal.png | Bin 0 -> 23332 bytes erpnext/public/images/bank-logos/Stripe.svg | 9 +++ 11 files changed, 99 insertions(+), 66 deletions(-) create mode 100644 erpnext/public/images/bank-logos/PayPal.png create mode 100644 erpnext/public/images/bank-logos/Stripe.svg diff --git a/banking/src/components/features/BankReconciliation/BankBalance.tsx b/banking/src/components/features/BankReconciliation/BankBalance.tsx index 7a7b0a4925c..a46ce362140 100644 --- a/banking/src/components/features/BankReconciliation/BankBalance.tsx +++ b/banking/src/components/features/BankReconciliation/BankBalance.tsx @@ -53,7 +53,7 @@ const OpeningBalance = () => { return {_("Opening Balance")} - {isLoading ? : {formatCurrency(flt(data?.message, 2), bankAccount?.account_currency ?? getCompanyCurrency(bankAccount?.company ?? ''))}} + {isLoading ? : {formatCurrency(flt(data?.message, 2), bankAccount?.account_currency ?? getCompanyCurrency(bankAccount?.company ?? ''))}} } @@ -86,7 +86,7 @@ const ClosingBalance = () => { - {isLoading ? : {formatCurrency(flt(data?.message, 2), bankAccount?.account_currency ?? getCompanyCurrency(bankAccount?.company ?? ''))}} + {isLoading ? : {formatCurrency(flt(data?.message, 2), bankAccount?.account_currency ?? getCompanyCurrency(bankAccount?.company ?? ''))}} ) } @@ -104,7 +104,7 @@ const Difference = () => { return {_("Difference")} - {isLoading ? : + {isLoading ? : {formatCurrency(difference, bankAccount?.account_currency ?? getCompanyCurrency(bankAccount?.company ?? '')) }} @@ -175,7 +175,7 @@ const ClosingBalanceAsPerStatement = () => {
- {isLoading ? : {formatCurrency(flt(data?.message?.balance, 2), bankAccount?.account_currency ?? getCompanyCurrency(bankAccount?.company ?? ''))}} + {isLoading ? : {formatCurrency(flt(data?.message?.balance, 2), bankAccount?.account_currency ?? getCompanyCurrency(bankAccount?.company ?? ''))}}
diff --git a/banking/src/components/features/BankReconciliation/BankPicker.tsx b/banking/src/components/features/BankReconciliation/BankPicker.tsx index 9150103fd32..47b087bfa81 100644 --- a/banking/src/components/features/BankReconciliation/BankPicker.tsx +++ b/banking/src/components/features/BankReconciliation/BankPicker.tsx @@ -1,4 +1,4 @@ -import { useAtom, useSetAtom } from "jotai" +import { useAtom } from "jotai" import { SelectedBank, selectedBankAccountAtom } from "./bankRecAtoms" import { useCallback } from "react" import { useGetBankAccounts, useGetUnreconciledTransactions } from "./utils" @@ -16,9 +16,16 @@ import { useCurrentCompany } from "@/hooks/useCurrentCompany" const BankPicker = ({ className }: { className?: string }) => { - const setSelectedBank = useSetAtom(selectedBankAccountAtom) + const [selectedBank, setSelectedBank] = useAtom(selectedBankAccountAtom) const onLoadingSuccess = useCallback((data?: SelectedBank[]) => { + // If the bank is already selected, then don't set it again + if (selectedBank) { + // Check if selected bank is in the data + if (data?.some((bank: SelectedBank) => bank.name === selectedBank.name)) { + return + } + } if (!data) return if (data.length === 1) { setSelectedBank(data[0]) @@ -26,9 +33,12 @@ const BankPicker = ({ className }: { className?: string }) => { const defaultBank = data.find((bank: SelectedBank) => bank.is_default) if (defaultBank) { setSelectedBank(defaultBank) + } else { + // Select the first available bank account + setSelectedBank(data[0]) } } - }, [setSelectedBank]) + }, [setSelectedBank, selectedBank]) const selectedCompany = useCurrentCompany() diff --git a/banking/src/components/features/BankReconciliation/BankTransactionList.tsx b/banking/src/components/features/BankReconciliation/BankTransactionList.tsx index 05e35f0f289..c37165349fe 100644 --- a/banking/src/components/features/BankReconciliation/BankTransactionList.tsx +++ b/banking/src/components/features/BankReconciliation/BankTransactionList.tsx @@ -21,7 +21,7 @@ import { useDebounceValue } from "usehooks-ts" import type { ColumnDef } from "@tanstack/react-table" import { useCallback, useMemo, useState } from "react" import { Link } from "react-router" -import { Empty, EmptyTitle, EmptyHeader, EmptyMedia, EmptyDescription } from "@/components/ui/empty" +import { Empty, EmptyTitle, EmptyHeader, EmptyMedia, EmptyDescription, EmptyContent } from "@/components/ui/empty" import { InputGroup, InputGroupAddon } from "@/components/ui/input-group" const BankTransactions = () => { @@ -262,7 +262,7 @@ const BankTransactionListView = () => { {error && } - {data && data.message.length > 0 && { typeFilter={typeFilter} status={status} setStatus={setStatus} - />} - - {data && data.message.length > 0 ? ( - row.name} - maxHeight="calc(100vh - 200px)" - scrollAreaClassName="min-h-[calc(100vh-200px)]" - emptyState={ - - - - - {_("No bank transactions found")} - {_("There are no transactions in the system for the selected bank account and dates that match the filters.")} - - } - /> - ) : null} - + /> + row.name} + maxHeight="calc(100vh - 200px)" + scrollAreaClassName="min-h-[calc(100vh-200px)]" + emptyState={ + + + + + {_("No bank transactions found")} + {_("There are no transactions in the system for the selected bank account and dates that match the filters.")} + + {data && data.message.length === 0 ? + + : null} + } + /> } diff --git a/banking/src/components/features/BankReconciliation/MatchAndReconcile.tsx b/banking/src/components/features/BankReconciliation/MatchAndReconcile.tsx index 006668ac50d..32eeb672fcd 100644 --- a/banking/src/components/features/BankReconciliation/MatchAndReconcile.tsx +++ b/banking/src/components/features/BankReconciliation/MatchAndReconcile.tsx @@ -298,7 +298,7 @@ const UnreconciledTransactionItem = ({ transaction }: { transaction: Unreconcile tabIndex={0} onClick={handleSelectTransaction}>
-
+
{formatDate(transaction.date)} {transaction.transaction_type && @@ -314,7 +314,7 @@ const UnreconciledTransactionItem = ({ transaction }: { transaction: Unreconcile title={_("Matched by rule")}> {transaction.matched_transaction_rule}}
- {transaction.description} + {transaction.description}
{isWithdrawal ? : } diff --git a/banking/src/components/features/BankReconciliation/bankRecAtoms.ts b/banking/src/components/features/BankReconciliation/bankRecAtoms.ts index 4f6e51e51b1..5bb1c84ae82 100644 --- a/banking/src/components/features/BankReconciliation/bankRecAtoms.ts +++ b/banking/src/components/features/BankReconciliation/bankRecAtoms.ts @@ -15,7 +15,9 @@ export interface SelectedBank extends Pick(null) +export const selectedBankAccountAtom = atomWithStorage('bank-rec-selected-bank', null, undefined, { + getOnInit: true +}) export const bankRecDateAtom = atomWithStorage<{ fromDate: string, toDate: string }>("bank-rec-date", { fromDate: getDatesForTimePeriod('This Month').fromDate, diff --git a/banking/src/components/features/BankReconciliation/logos.ts b/banking/src/components/features/BankReconciliation/logos.ts index 8212b72c33f..a89c59ee6fc 100644 --- a/banking/src/components/features/BankReconciliation/logos.ts +++ b/banking/src/components/features/BankReconciliation/logos.ts @@ -393,5 +393,18 @@ export const BANK_LOGOS: { keywords: string[], logo: string, locale?: string[], logo: "Prime_Bank.png", locale: ['Kenya'], logoClassName: 'max-w-28' + }, + { + keywords: ["Stripe"], + logo: "Stripe.svg", + locale: ['Global'], + logoClassName: 'h-6', + darkModeInvert: true, + }, + { + keywords: ["PayPal"], + logo: "PayPal.png", + locale: ['Global'], + logoClassName: 'h-6', } ] \ No newline at end of file diff --git a/banking/src/components/ui/file-dropzone.tsx b/banking/src/components/ui/file-dropzone.tsx index ab0c6465c62..5e9cc41e631 100644 --- a/banking/src/components/ui/file-dropzone.tsx +++ b/banking/src/components/ui/file-dropzone.tsx @@ -31,7 +31,7 @@ export const FileDropzone = ({ files, setFiles, accept, multiple = true, onDrop, }, [setFiles, onDrop, multiple, onUpdate]) const { getRootProps, getInputProps } = useDropzone({ onDrop: onFileDrop, accept, multiple }) return ( -
+
{files.length === 0 ?

{multiple ? _("Drop some files here, or click to select files") : _("Drop a file here, or click to select a file")}

: null}
diff --git a/banking/src/components/ui/list-view.tsx b/banking/src/components/ui/list-view.tsx index f2d5759d5aa..ddd0c0e7020 100644 --- a/banking/src/components/ui/list-view.tsx +++ b/banking/src/components/ui/list-view.tsx @@ -382,7 +382,7 @@ function ListViewInner({
({ ({ header.getResizeHandler()(e) }} onTouchStart={header.getResizeHandler()} - className="absolute top-0 ltr:right-0 rtl:left-0 z-10 h-full w-2 max-w-[12px] cursor-col-resize touch-none select-none bg-transparent" + className="absolute top-0 ltr:-right-2 rtl:-left-2 z-10 h-full w-2 max-w-[12px] cursor-col-resize touch-none select-none bg-transparent" /> ) : null} diff --git a/erpnext/accounts/doctype/bank_account/bank_account.py b/erpnext/accounts/doctype/bank_account/bank_account.py index 0310ac0877a..e1fd656b088 100644 --- a/erpnext/accounts/doctype/bank_account/bank_account.py +++ b/erpnext/accounts/doctype/bank_account/bank_account.py @@ -12,7 +12,6 @@ from frappe.contacts.address_and_contact import ( ) from frappe.model.document import Document from frappe.utils import comma_and, get_link_to_form -from pypika import Order class BankAccount(Document): @@ -139,38 +138,35 @@ def get_list(company: str, show_disabled: bool = False): @return: A list of bank accounts """ - frappe.has_permission("Bank Account", ptype="read", throw=True) + filters = {"is_company_account": 1, "company": company} + if not show_disabled: + filters["disabled"] = 0 - bank_account = frappe.qb.DocType("Bank Account") - account = frappe.qb.DocType("Account") - - query = ( - frappe.qb.from_(bank_account) - .join(account) - .on(bank_account.account == account.name) - .select( - bank_account.name, - account.account_currency, - bank_account.account, - bank_account.company, - bank_account.account_name, - bank_account.is_default, - bank_account.bank, - bank_account.account_type, - bank_account.account_subtype, - bank_account.bank_account_no, - bank_account.last_integration_date, - bank_account.is_credit_card, - ) - .where(bank_account.is_company_account == 1) - .where(bank_account.company == company) - .orderby(bank_account.is_default, order=Order.desc) + bank_accounts = frappe.get_list( + "Bank Account", + filters=filters, + order_by="is_default desc", + fields=[ + "name", + "account", + "company", + "account_name", + "is_default", + "bank", + "account_type", + "account_subtype", + "bank_account_no", + "last_integration_date", + "is_credit_card", + ], ) - if not show_disabled: - query = query.where(bank_account.disabled == 0) + for bank_account in bank_accounts: + bank_account.account_currency = frappe.get_cached_value( + "Account", bank_account.account, "account_currency" + ) - return query.run(as_dict=True) + return bank_accounts @frappe.whitelist(methods=["GET"]) diff --git a/erpnext/public/images/bank-logos/PayPal.png b/erpnext/public/images/bank-logos/PayPal.png new file mode 100644 index 0000000000000000000000000000000000000000..601158caa4af0f21c07b43bdd15970cf1c647775 GIT binary patch literal 23332 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 CJ1MUK literal 0 HcmV?d00001 diff --git a/erpnext/public/images/bank-logos/Stripe.svg b/erpnext/public/images/bank-logos/Stripe.svg new file mode 100644 index 00000000000..f421bbcfe78 --- /dev/null +++ b/erpnext/public/images/bank-logos/Stripe.svg @@ -0,0 +1,9 @@ + + + + + + + + +