diff --git a/packages/desktop-client/src/components/reports/ChooseGraph.tsx b/packages/desktop-client/src/components/reports/ChooseGraph.tsx index 0c8825046cad60f2cb783a9cd8ba8bd39f191e14..66574f564d77df38f44e7addd1cd3e99d64bad04 100644 --- a/packages/desktop-client/src/components/reports/ChooseGraph.tsx +++ b/packages/desktop-client/src/components/reports/ChooseGraph.tsx @@ -48,9 +48,19 @@ function ChooseGraph({ const listScrollRef = useRef<HTMLDivElement>(null); const totalScrollRef = useRef<HTMLDivElement>(null); - const handleScrollTotals = scroll => { - headerScrollRef.current.scrollLeft = scroll.target.scrollLeft; - listScrollRef.current.scrollLeft = scroll.target.scrollLeft; + const handleScroll = scroll => { + if (scroll.target.id === 'header') { + totalScrollRef.current.scrollLeft = scroll.target.scrollLeft; + listScrollRef.current.scrollLeft = scroll.target.scrollLeft; + } + if (scroll.target.id === 'total') { + headerScrollRef.current.scrollLeft = scroll.target.scrollLeft; + listScrollRef.current.scrollLeft = scroll.target.scrollLeft; + } + if (scroll.target.id === 'list') { + headerScrollRef.current.scrollLeft = scroll.target.scrollLeft; + totalScrollRef.current.scrollLeft = scroll.target.scrollLeft; + } }; if (graphType === 'AreaGraph') { @@ -96,7 +106,8 @@ function ChooseGraph({ <View> <ReportTableHeader headerScrollRef={headerScrollRef} - interval={mode === 'time' && months} + handleScroll={handleScroll} + interval={mode === 'time' && data.monthData} scrollWidth={scrollWidth} groupBy={groupBy} balanceType={balanceType} @@ -104,6 +115,7 @@ function ChooseGraph({ <ReportTable saveScrollWidth={saveScrollWidth} listScrollRef={listScrollRef} + handleScroll={handleScroll} > <ReportTableList data={data} @@ -116,7 +128,7 @@ function ChooseGraph({ </ReportTable> <ReportTableTotals totalScrollRef={totalScrollRef} - handleScrollTotals={handleScrollTotals} + handleScroll={handleScroll} scrollWidth={scrollWidth} data={data} mode={mode} diff --git a/packages/desktop-client/src/components/reports/ReportTable.tsx b/packages/desktop-client/src/components/reports/ReportTable.tsx index a16f47c4cd938b4c6f24e86f346c040bed26fbab..d2d4e5d209be773f53c6cdcc1685e194c4f8c4fe 100644 --- a/packages/desktop-client/src/components/reports/ReportTable.tsx +++ b/packages/desktop-client/src/components/reports/ReportTable.tsx @@ -1,4 +1,9 @@ -import React, { useLayoutEffect, useRef, type ReactNode } from 'react'; +import React, { + type UIEventHandler, + useLayoutEffect, + useRef, + type ReactNode, +} from 'react'; import { type RefProp } from 'react-spring'; import { type CSSProperties } from '../../style'; @@ -9,6 +14,7 @@ type ReportTableProps = { listScrollRef?: RefProp<HTMLDivElement>; style?: CSSProperties; children?: ReactNode; + handleScroll?: UIEventHandler<HTMLDivElement>; }; export default function ReportTable({ @@ -16,6 +22,7 @@ export default function ReportTable({ listScrollRef, style, children, + handleScroll, }: ReportTableProps) { const contentRef = useRef<HTMLDivElement>(null); @@ -28,6 +35,8 @@ export default function ReportTable({ return ( <View innerRef={listScrollRef} + onScroll={handleScroll} + id="list" style={{ overflowY: 'auto', scrollbarWidth: 'none', @@ -38,7 +47,6 @@ export default function ReportTable({ ...style, }} tabIndex={1} - data-testid="table" > <View> <div ref={contentRef}>{children}</div> diff --git a/packages/desktop-client/src/components/reports/ReportTableHeader.tsx b/packages/desktop-client/src/components/reports/ReportTableHeader.tsx index 7a1f5be90e56aa752f6d25e0b99bf52ec1871c12..da1e795258ab0ee5d33bf6007c8c7bd8cbe49587 100644 --- a/packages/desktop-client/src/components/reports/ReportTableHeader.tsx +++ b/packages/desktop-client/src/components/reports/ReportTableHeader.tsx @@ -1,55 +1,60 @@ -import React, { type Ref } from 'react'; - -import * as d from 'date-fns'; +import React, { type UIEventHandler } from 'react'; +import { type RefProp } from 'react-spring'; import { styles, theme } from '../../style'; import View from '../common/View'; import { Row, Cell } from '../table'; -import { type Month } from './entities'; +import { type MonthData } from './entities'; type ReportTableHeaderProps = { scrollWidth?: number; groupBy: string; - interval?: Month[]; + interval?: MonthData[]; balanceType: string; - headerScrollRef?: Ref<HTMLDivElement>; + headerScrollRef: RefProp<HTMLDivElement>; + handleScroll?: UIEventHandler<HTMLDivElement>; }; -export default function ReportTableHeader({ +function ReportTableHeader({ scrollWidth, groupBy, interval, balanceType, headerScrollRef, + handleScroll, }: ReportTableHeaderProps) { return ( - <View - innerRef={headerScrollRef} + <Row + collapsed={true} style={{ - overflowX: 'auto', - scrollbarWidth: 'none', - '::-webkit-scrollbar': { display: 'none' }, justifyContent: 'center', - borderTopWidth: 1, + borderBottomWidth: 1, borderColor: theme.tableBorder, + color: theme.tableHeaderText, + backgroundColor: theme.tableHeaderBackground, + fontWeight: 600, }} > - <Row - collapsed={true} + <View + innerRef={headerScrollRef} + onScroll={handleScroll} + id="header" style={{ - color: theme.tableHeaderText, - backgroundColor: theme.tableHeaderBackground, - fontWeight: 600, + overflowX: 'auto', + scrollbarWidth: 'none', + '::-webkit-scrollbar': { display: 'none' }, + flexDirection: 'row', + flex: 1, }} > <Cell style={{ - minWidth: 125, + width: 120, + flexShrink: 0, ...styles.tnum, }} value={groupBy} - width="flex" /> {interval ? interval.map((header, index) => { @@ -60,8 +65,7 @@ export default function ReportTableHeader({ ...styles.tnum, }} key={index} - // eslint-disable-next-line rulesdir/typography - value={d.format(d.parseISO(`${header}-01`), "MMM ''yy")} + value={header.date} width="flex" /> ); @@ -102,8 +106,9 @@ export default function ReportTableHeader({ value="Average" width="flex" /> - {scrollWidth > 0 && <Cell width={scrollWidth} />} - </Row> - </View> + </View> + </Row> ); } + +export default ReportTableHeader; diff --git a/packages/desktop-client/src/components/reports/ReportTableList.tsx b/packages/desktop-client/src/components/reports/ReportTableList.tsx index ddfdeca2c409f0f96f18c39c4dbb55ea4f398cae..40939b0e640a38d9beb63816ebe5021c72d2be18 100644 --- a/packages/desktop-client/src/components/reports/ReportTableList.tsx +++ b/packages/desktop-client/src/components/reports/ReportTableList.tsx @@ -47,10 +47,10 @@ const TableRow = memo( > <Cell value={item[groupByItem]} - width="flex" title={item[groupByItem].length > 12 && item[groupByItem]} style={{ - minWidth: 125, + width: 120, + flexShrink: 0, ...styles.tnum, }} /> diff --git a/packages/desktop-client/src/components/reports/ReportTableTotals.tsx b/packages/desktop-client/src/components/reports/ReportTableTotals.tsx index 625ba16f81f08b7fef78ec5d06e734348bf4de32..3fa158a03b97ae996e2390afdce3dd21af79c0ab 100644 --- a/packages/desktop-client/src/components/reports/ReportTableTotals.tsx +++ b/packages/desktop-client/src/components/reports/ReportTableTotals.tsx @@ -1,4 +1,4 @@ -import React, { type UIEventHandler } from 'react'; +import React, { type UIEventHandler, useLayoutEffect, useState } from 'react'; import { type RefProp } from 'react-spring'; import { @@ -20,45 +20,63 @@ type ReportTableTotalsProps = { mode: string; monthsCount: number; totalScrollRef: RefProp<HTMLDivElement>; - handleScrollTotals: UIEventHandler<HTMLDivElement>; + handleScroll: UIEventHandler<HTMLDivElement>; }; -export default function ReportTableTotals({ +function ReportTableTotals({ data, scrollWidth, balanceTypeOp, mode, monthsCount, totalScrollRef, - handleScrollTotals, + handleScroll, }: ReportTableTotalsProps) { + const [scrollWidthTotals, setScrollWidthTotals] = useState(0); + + useLayoutEffect(() => { + if (totalScrollRef.current) { + const [parent, child] = [ + totalScrollRef.current.offsetParent + ? totalScrollRef.current.parentElement.scrollHeight + : 0, + totalScrollRef.current ? totalScrollRef.current.scrollHeight : 0, + ]; + setScrollWidthTotals(parent > 0 && child > 0 && parent - child); + } + }); + const average = amountToInteger(data[balanceTypeOp]) / monthsCount; return ( - <View - innerRef={totalScrollRef} - onScroll={handleScrollTotals} + <Row + collapsed={true} + height={32 + scrollWidthTotals} style={{ - overflowX: 'auto', borderTopWidth: 1, borderColor: theme.tableBorder, justifyContent: 'center', + color: theme.tableHeaderText, + backgroundColor: theme.tableHeaderBackground, + fontWeight: 600, }} > - <Row - collapsed={true} + <View + innerRef={totalScrollRef} + onScroll={handleScroll} + id="total" style={{ - color: theme.tableHeaderText, - backgroundColor: theme.tableHeaderBackground, - fontWeight: 600, + overflowX: 'auto', + flexDirection: 'row', + flex: 1, }} > <Cell style={{ - minWidth: 125, + width: 120, + flexShrink: 0, ...styles.tnum, }} value="Totals" - width="flex" /> {mode === 'time' ? data.monthData.map(item => { @@ -133,9 +151,9 @@ export default function ReportTableTotals({ width="flex" privacyFilter /> - - {scrollWidth > 0 && <Cell width={scrollWidth} />} - </Row> - </View> + </View> + </Row> ); } + +export default ReportTableTotals; diff --git a/packages/desktop-client/src/components/reports/entities.d.ts b/packages/desktop-client/src/components/reports/entities.d.ts index d58698837380243eb08253b585ee0799b04bf574..db251812ee7ecca053f815f6b96e5d7a3c660072 100644 --- a/packages/desktop-client/src/components/reports/entities.d.ts +++ b/packages/desktop-client/src/components/reports/entities.d.ts @@ -31,19 +31,16 @@ export type MonthData = { totalTotals: number; }; -/* this will be used in a future PR - -export type GroupedEntity = { +type GroupedEntity = { id: string; name: string; date?: string; - monthData: Array<MonthData>; - categories?: Array<ItemEntity>; + monthData: MonthData[]; + categories?: ItemEntity[]; totalAssets: number; totalDebts: number; totalTotals: number; }; -*/ export type Month = { month: string; diff --git a/upcoming-release-notes/2085.md b/upcoming-release-notes/2085.md new file mode 100644 index 0000000000000000000000000000000000000000..5f3fefcdb98ed17dfb4fbcae0283ae72e447052b --- /dev/null +++ b/upcoming-release-notes/2085.md @@ -0,0 +1,6 @@ +--- +category: Bugfix +authors: [carkom] +--- + +Realign and fix header/totals row for table graph in custom reports