diff --git a/packages/desktop-client/src/components/accounts/TransactionsTable.js b/packages/desktop-client/src/components/accounts/TransactionsTable.js index e6a26461fab0c6d0b20e0e17de3df15dc3e2908f..16c2dd18cf167f4f58a63b8a7a51e97a25e5d13a 100644 --- a/packages/desktop-client/src/components/accounts/TransactionsTable.js +++ b/packages/desktop-client/src/components/accounts/TransactionsTable.js @@ -69,6 +69,7 @@ import { CellButton, useTableNavigator, Table, + UnexposedCellContent, } from '../table'; function getDisplayValue(obj, name) { @@ -392,6 +393,8 @@ function PayeeCell({ onUpdate, onCreatePayee, onManagePayees, + onNavigateToTransferAccount, + onNavigateToSchedule, }) { let isCreatingPayee = useRef(false); @@ -405,7 +408,6 @@ function PayeeCell({ name="payee" value={payeeId} valueStyle={[valueStyle, inherited && { color: colors.n8 }]} - formatter={() => getPayeePretty(transaction, payee, transferAcct)} exposed={focused} onExpose={!isPreview && (name => onEdit(id, name))} onUpdate={async value => { @@ -418,6 +420,20 @@ function PayeeCell({ isCreatingPayee.current = false; } }} + unexposedContent={ + <> + <PayeeIcons + transaction={transaction} + transferAccount={transferAcct} + onNavigateToTransferAccount={onNavigateToTransferAccount} + onNavigateToSchedule={onNavigateToSchedule} + /> + <UnexposedCellContent + value={payeeId} + formatter={() => getPayeePretty(transaction, payee, transferAcct)} + /> + </> + } > {({ onBlur, @@ -473,6 +489,8 @@ function PayeeIcons({ } let buttonStyle = { + marginLeft: -5, + marginRight: 2, width: 23, height: 23, color: 'inherit', @@ -490,43 +508,41 @@ function PayeeIcons({ color: 'inherit', }; - let onScheduleIconClick = () => onNavigateToSchedule(scheduleId); - let recurring = schedule && schedule._date && !!schedule._date.frequency; - let ScheduledIcon = () => ( - <Button bare style={buttonStyle} onClick={onScheduleIconClick}> + + return schedule ? ( + <Button + bare + style={buttonStyle} + onClick={e => { + e.stopPropagation(); + onNavigateToSchedule(scheduleId); + }} + > {recurring ? ( <ArrowsSynchronize style={scheduleIconStyle} /> ) : ( <CalendarIcon style={scheduleIconStyle} /> )} </Button> - ); - - let onTransferIconClick = () => - !isTemporaryId(transaction.id) && - onNavigateToTransferAccount(transferAccount.id); - - let TransferDirectionIcon = () => ( - <Button bare style={buttonStyle} onClick={onTransferIconClick}> + ) : transferAccount ? ( + <Button + bare + style={buttonStyle} + onClick={e => { + e.stopPropagation(); + if (!isTemporaryId(transaction.id)) { + onNavigateToTransferAccount(transferAccount.id); + } + }} + > {(transaction._inverse ? -1 : 1) * transaction.amount > 0 ? ( <LeftArrow2 style={transferIconStyle} /> ) : ( <RightArrow2 style={transferIconStyle} /> )} </Button> - ); - - return ( - <View style={{ flex: 1, flexDirection: 'row', alignItems: 'stretch' }}> - {schedule && <Cell exposed={true}>{ScheduledIcon}</Cell>} - {!schedule && transferAccount && ( - <Cell exposed={true}>{TransferDirectionIcon}</Cell> - )} - - {children} - </View> - ); + ) : null; } const Transaction = memo(function Transaction(props) { @@ -820,40 +836,29 @@ const Transaction = memo(function Transaction(props) { )} </CustomCell> )} - {(() => { - let cell = ( - <PayeeCell - id={id} - payeeId={payeeId} - accountId={accountId} - focused={focusedField === 'payee'} - inherited={inheritedFields && inheritedFields.has('payee')} - payees={payees} - accounts={accounts} - valueStyle={valueStyle} - transaction={transaction} - payee={payee} - transferAcct={transferAcct} - importedPayee={importedPayee} - isPreview={isPreview} - onEdit={onEdit} - onUpdate={onUpdate} - onCreatePayee={onCreatePayee} - onManagePayees={onManagePayees} - /> - ); - - return ( - <PayeeIcons - transaction={transaction} - transferAccount={transferAcct} - onNavigateToTransferAccount={onNavigateToTransferAccount} - onNavigateToSchedule={onNavigateToSchedule} - > - {cell} - </PayeeIcons> - ); - })()} + {(() => ( + <PayeeCell + id={id} + payeeId={payeeId} + accountId={accountId} + focused={focusedField === 'payee'} + inherited={inheritedFields && inheritedFields.has('payee')} + payees={payees} + accounts={accounts} + valueStyle={valueStyle} + transaction={transaction} + payee={payee} + transferAcct={transferAcct} + importedPayee={importedPayee} + isPreview={isPreview} + onEdit={onEdit} + onUpdate={onUpdate} + onCreatePayee={onCreatePayee} + onManagePayees={onManagePayees} + onNavigateToTransferAccount={onNavigateToTransferAccount} + onNavigateToSchedule={onNavigateToSchedule} + /> + ))()} {isPreview ? ( <Cell name="notes" width="flex" /> diff --git a/packages/desktop-client/src/components/table.tsx b/packages/desktop-client/src/components/table.tsx index 5b8fe3edbef28c23bf12919cc988962bf37a2dcf..ffc52d5ef66fef987fb2d3271361254353d969b3 100644 --- a/packages/desktop-client/src/components/table.tsx +++ b/packages/desktop-client/src/components/table.tsx @@ -162,6 +162,24 @@ export const Field = forwardRef<HTMLDivElement, FieldProps>(function Field( ); }); +export function UnexposedCellContent({ + value, + formatter, +}: Pick<CellProps, 'value' | 'formatter'>) { + return ( + <Text + style={{ + flexGrow: 1, + whiteSpace: 'nowrap', + overflow: 'hidden', + textOverflow: 'ellipsis', + }} + > + {formatter ? formatter(value) : value} + </Text> + ); +} + type CellProps = Omit<ComponentProps<typeof View>, 'children' | 'value'> & { formatter?: (value: string, type?: unknown) => string; focused?: boolean; @@ -170,6 +188,7 @@ type CellProps = Omit<ComponentProps<typeof View>, 'children' | 'value'> & { plain?: boolean; exposed?: boolean; children?: ReactNode | (() => ReactNode); + unexposedContent?: ReactNode; value?: string; valueStyle?: CSSProperties; onExpose?: (name: string) => void; @@ -188,6 +207,7 @@ export function Cell({ plain, style, valueStyle, + unexposedContent, ...viewProps }: CellProps) { let mouseCoords = useRef(null); @@ -231,9 +251,10 @@ export function Cell({ <View style={[ { + flexDirection: 'row', flex: 1, padding: '0 5px', - justifyContent: 'center', + alignItems: 'center', }, styles.smallText, valueStyle, @@ -242,27 +263,24 @@ export function Cell({ // the user does a direct click, not if they also drag the // mouse to select something onMouseDown={e => (mouseCoords.current = [e.clientX, e.clientY])} - onMouseUp={e => { - if ( - mouseCoords.current && - Math.abs(e.clientX - mouseCoords.current[0]) < 5 && - Math.abs(e.clientY - mouseCoords.current[1]) < 5 - ) { - onExpose && onExpose(name); - } - }} // When testing, allow the click handler to be used instead - onClick={global.IS_TESTING && (() => onExpose && onExpose(name))} + onClick={ + global.IS_TESTING + ? () => onExpose && onExpose(name) + : e => { + if ( + mouseCoords.current && + Math.abs(e.clientX - mouseCoords.current[0]) < 5 && + Math.abs(e.clientY - mouseCoords.current[1]) < 5 + ) { + onExpose && onExpose(name); + } + } + } > - <Text - style={{ - whiteSpace: 'nowrap', - overflow: 'hidden', - textOverflow: 'ellipsis', - }} - > - {formatter ? formatter(value) : value} - </Text> + {unexposedContent || ( + <UnexposedCellContent value={value} formatter={formatter} /> + )} </View> )} </View> diff --git a/upcoming-release-notes/1260.md b/upcoming-release-notes/1260.md new file mode 100644 index 0000000000000000000000000000000000000000..0985b1cb0be28c2858413ff9d5667d7ef3c041e5 --- /dev/null +++ b/upcoming-release-notes/1260.md @@ -0,0 +1,6 @@ +--- +category: Bugfix +authors: [j-f1] +--- + +Fix transaction list scrolling behavior