From 64821e6a64b5928755f1307f5d154a7502997ddd Mon Sep 17 00:00:00 2001 From: Joel Jeremy Marquez <joeljeremy.marquez@gmail.com> Date: Mon, 3 Jun 2024 19:52:35 -0700 Subject: [PATCH] [Mobile] Auto create 2 child transactions on split (#2821) * Auto create 2 child transactions on split * Release notes * Fix typecheck error --- .../mobile/transactions/TransactionEdit.jsx | 13 ++++++++++--- packages/loot-core/src/shared/transactions.ts | 14 ++++++++++++-- upcoming-release-notes/2821.md | 6 ++++++ 3 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 upcoming-release-notes/2821.md diff --git a/packages/desktop-client/src/components/mobile/transactions/TransactionEdit.jsx b/packages/desktop-client/src/components/mobile/transactions/TransactionEdit.jsx index 033e0045d..e09e5c256 100644 --- a/packages/desktop-client/src/components/mobile/transactions/TransactionEdit.jsx +++ b/packages/desktop-client/src/components/mobile/transactions/TransactionEdit.jsx @@ -28,6 +28,7 @@ import { splitTransaction, addSplitTransaction, deleteTransaction, + makeChild, } from 'loot-core/src/shared/transactions'; import { titleFirst, @@ -284,6 +285,7 @@ const ChildTransactionEdit = forwardRef( ( { transaction, + amountFocused, amountSign, getCategory, getPrettyPayee, @@ -336,7 +338,7 @@ const ChildTransactionEdit = forwardRef( editingField && editingField !== getFieldName(transaction.id, 'amount') } - focused={transaction.amount === 0} + focused={amountFocused} value={amountToInteger(transaction.amount)} zeroSign={amountSign} style={{ marginRight: 8 }} @@ -795,10 +797,11 @@ const TransactionEditInner = memo(function TransactionEditInner({ </View> )} - {childTransactions.map(childTrans => ( + {childTransactions.map((childTrans, i, arr) => ( <ChildTransactionEdit key={childTrans.id} transaction={childTrans} + amountFocused={arr.findIndex(c => c.amount === 0) === i} amountSign={childAmountSign} ref={r => { childTransactionElementRefMap.current = { @@ -1136,7 +1139,11 @@ function TransactionEditUnconnected({ }; const onSplit = id => { - const changes = splitTransaction(transactions, id); + const changes = splitTransaction(transactions, id, parent => [ + makeChild(parent), + makeChild(parent), + ]); + setTransactions(changes.data); }; diff --git a/packages/loot-core/src/shared/transactions.ts b/packages/loot-core/src/shared/transactions.ts index ac3b7356d..96c8a7c3a 100644 --- a/packages/loot-core/src/shared/transactions.ts +++ b/packages/loot-core/src/shared/transactions.ts @@ -42,7 +42,7 @@ type GenericTransactionEntity = export function makeChild<T extends GenericTransactionEntity>( parent: T, - data: object, + data: object = {}, ) { const prefix = parent.id === 'temp' ? 'temp' : ''; @@ -277,17 +277,27 @@ export function deleteTransaction( export function splitTransaction( transactions: TransactionEntity[], id: string, + createSubtransactions?: ( + parentTransaction: TransactionEntity, + ) => TransactionEntity[], ) { return replaceTransactions(transactions, id, trans => { if (trans.is_parent || trans.is_child) { return trans; } + const subtransactions = createSubtransactions?.(trans) || [ + makeChild(trans), + ]; + return { ...trans, is_parent: true, error: num(trans.amount) === 0 ? null : SplitTransactionError(0, trans), - subtransactions: [makeChild(trans, { amount: 0, sort_order: -1 })], + subtransactions: subtransactions.map(t => ({ + ...t, + sort_order: t.sort_order || -1, + })), } as TransactionEntityWithError; }); } diff --git a/upcoming-release-notes/2821.md b/upcoming-release-notes/2821.md new file mode 100644 index 000000000..aa9e44e51 --- /dev/null +++ b/upcoming-release-notes/2821.md @@ -0,0 +1,6 @@ +--- +category: Enhancements +authors: [joel-jeremy] +--- + +Auto create two child transactions on mobile instead of one when splitting a transactions. -- GitLab