From 23ea8a311fbafd6c729f21aef97b70d33190bea8 Mon Sep 17 00:00:00 2001 From: Josh Krebs Date: Thu, 21 Sep 2023 16:04:18 -0700 Subject: [PATCH 01/16] refactor MonthsContext to tsx --- .../{MonthsContext.js => MonthsContext.tsx} | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) rename packages/desktop-client/src/components/budget/{MonthsContext.js => MonthsContext.tsx} (53%) diff --git a/packages/desktop-client/src/components/budget/MonthsContext.js b/packages/desktop-client/src/components/budget/MonthsContext.tsx similarity index 53% rename from packages/desktop-client/src/components/budget/MonthsContext.js rename to packages/desktop-client/src/components/budget/MonthsContext.tsx index dd321a75a99..8fd945afece 100644 --- a/packages/desktop-client/src/components/budget/MonthsContext.js +++ b/packages/desktop-client/src/components/budget/MonthsContext.tsx @@ -1,15 +1,37 @@ -import React, { createContext } from 'react'; +import React, { createContext, type ReactNode } from 'react'; import * as monthUtils from 'loot-core/src/shared/months'; -export function getValidMonthBounds(bounds, startMonth, endMonth) { +type BoundsProps = { + start: string; + end: string; +}; + +export function getValidMonthBounds( + bounds: BoundsProps, + startMonth: undefined | string, + endMonth: string, +) { return { start: startMonth < bounds.start ? bounds.start : startMonth, end: endMonth > bounds.end ? bounds.end : endMonth, }; } -export let MonthsContext = createContext(); +type MonthsContextProps = { + months: string[]; + type: string; +}; + +export let MonthsContext = createContext(null); + +type MonthsProviderProps = { + startMonth: string | undefined; + numMonths: number; + monthBounds: BoundsProps; + type: string; + children: ReactNode; +}; export function MonthsProvider({ startMonth, @@ -17,7 +39,7 @@ export function MonthsProvider({ monthBounds, type, children, -}) { +}: MonthsProviderProps) { let endMonth = monthUtils.addMonths(startMonth, numMonths - 1); let bounds = getValidMonthBounds(monthBounds, startMonth, endMonth); let months = monthUtils.rangeInclusive(bounds.start, bounds.end); From 6004788f11cdcfce1b3bb5de921da736bb5ba6ee Mon Sep 17 00:00:00 2001 From: Josh Krebs Date: Sat, 23 Sep 2023 13:41:14 -0700 Subject: [PATCH 02/16] work on RenderMonths --- .../src/components/budget/IncomeHeader.tsx | 2 - .../src/components/budget/MonthsContext.tsx | 2 + .../src/components/budget/RenderMonths.js | 36 ------------- .../src/components/budget/RenderMonths.tsx | 51 +++++++++++++++++++ 4 files changed, 53 insertions(+), 38 deletions(-) delete mode 100644 packages/desktop-client/src/components/budget/RenderMonths.js create mode 100644 packages/desktop-client/src/components/budget/RenderMonths.tsx diff --git a/packages/desktop-client/src/components/budget/IncomeHeader.tsx b/packages/desktop-client/src/components/budget/IncomeHeader.tsx index d8cec93eb4f..9bfc9ab6342 100644 --- a/packages/desktop-client/src/components/budget/IncomeHeader.tsx +++ b/packages/desktop-client/src/components/budget/IncomeHeader.tsx @@ -27,8 +27,6 @@ function IncomeHeader({ MonthComponent, onShowNewGroup }: IncomeHeaderProps) { ); diff --git a/packages/desktop-client/src/components/budget/MonthsContext.tsx b/packages/desktop-client/src/components/budget/MonthsContext.tsx index 8fd945afece..6be65f9ac9f 100644 --- a/packages/desktop-client/src/components/budget/MonthsContext.tsx +++ b/packages/desktop-client/src/components/budget/MonthsContext.tsx @@ -7,6 +7,7 @@ type BoundsProps = { end: string; }; +// eslint-disable-next-line import/no-unused-modules export function getValidMonthBounds( bounds: BoundsProps, startMonth: undefined | string, @@ -33,6 +34,7 @@ type MonthsProviderProps = { children: ReactNode; }; +// eslint-disable-next-line import/no-unused-modules export function MonthsProvider({ startMonth, numMonths, diff --git a/packages/desktop-client/src/components/budget/RenderMonths.js b/packages/desktop-client/src/components/budget/RenderMonths.js deleted file mode 100644 index 044f2ca702d..00000000000 --- a/packages/desktop-client/src/components/budget/RenderMonths.js +++ /dev/null @@ -1,36 +0,0 @@ -import React, { useContext } from 'react'; - -import * as monthUtils from 'loot-core/src/shared/months'; - -import { theme } from '../../style'; -import View from '../common/View'; -import NamespaceContext from '../spreadsheet/NamespaceContext'; - -import { MonthsContext } from './MonthsContext'; - -function RenderMonths({ component: Component, editingIndex, args, style }) { - let { months, type } = useContext(MonthsContext); - - return months.map((month, index) => { - let editing = editingIndex === index; - - return ( - - - - - - ); - }); -} - -export default RenderMonths; diff --git a/packages/desktop-client/src/components/budget/RenderMonths.tsx b/packages/desktop-client/src/components/budget/RenderMonths.tsx new file mode 100644 index 00000000000..d7d07944b92 --- /dev/null +++ b/packages/desktop-client/src/components/budget/RenderMonths.tsx @@ -0,0 +1,51 @@ +import React, { type ReactNode, useContext, type CSSProperties } from 'react'; + +import * as monthUtils from 'loot-core/src/shared/months'; + +import { theme } from '../../style'; +import View from '../common/View'; +import NamespaceContext from '../spreadsheet/NamespaceContext'; + +import { MonthsContext } from './MonthsContext'; + +type RenderMonthsProps = { + component?: ReactNode; + editingIndex?: undefined; + args?: object; + style?: CSSProperties; +}; + +function RenderMonths({ + component: Component, + editingIndex, + args, + style, +}: RenderMonthsProps) { + let { months, type } = useContext(MonthsContext); + + return <> { + months.map((month, index) => { + let editing = editingIndex === index; + + return ( + + + + + + ); + }) + } + +} + +export default RenderMonths; From e2b538e08deb566283e3dadd98687887cabbc193 Mon Sep 17 00:00:00 2001 From: Josh Krebs Date: Mon, 25 Sep 2023 15:16:49 -0700 Subject: [PATCH 03/16] working solution for RenderMonths --- .../src/components/budget/IncomeHeader.tsx | 4 +- .../src/components/budget/RenderMonths.tsx | 49 ++++++++++--------- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/packages/desktop-client/src/components/budget/IncomeHeader.tsx b/packages/desktop-client/src/components/budget/IncomeHeader.tsx index 9bfc9ab6342..f06600aeec1 100644 --- a/packages/desktop-client/src/components/budget/IncomeHeader.tsx +++ b/packages/desktop-client/src/components/budget/IncomeHeader.tsx @@ -1,4 +1,4 @@ -import React, { type ReactNode } from 'react'; +import React, { type Component, type ReactNode } from 'react'; import Button from '../common/Button'; import View from '../common/View'; @@ -6,7 +6,7 @@ import View from '../common/View'; import RenderMonths from './RenderMonths'; type IncomeHeaderProps = { - MonthComponent?: ReactNode; + MonthComponent?: () => JSX.Element; onShowNewGroup: () => void; }; diff --git a/packages/desktop-client/src/components/budget/RenderMonths.tsx b/packages/desktop-client/src/components/budget/RenderMonths.tsx index d7d07944b92..0e129d721ae 100644 --- a/packages/desktop-client/src/components/budget/RenderMonths.tsx +++ b/packages/desktop-client/src/components/budget/RenderMonths.tsx @@ -1,4 +1,8 @@ -import React, { type ReactNode, useContext, type CSSProperties } from 'react'; +import React, { + type FunctionComponent, + useContext, + type CSSProperties, +} from 'react'; import * as monthUtils from 'loot-core/src/shared/months'; @@ -8,8 +12,10 @@ import NamespaceContext from '../spreadsheet/NamespaceContext'; import { MonthsContext } from './MonthsContext'; +type ComponentProps = { monthIndex: number; editing: boolean }; + type RenderMonthsProps = { - component?: ReactNode; + component?: FunctionComponent; editingIndex?: undefined; args?: object; style?: CSSProperties; @@ -23,29 +29,26 @@ function RenderMonths({ }: RenderMonthsProps) { let { months, type } = useContext(MonthsContext); - return <> { - months.map((month, index) => { + return months.map((month, index) => { let editing = editingIndex === index; - return ( - - - - - - ); - }) - } - + return ( + + + + + + ); + }) as any; } export default RenderMonths; From d0341415ad0915b3e845db5bb93eaf61715eaecb Mon Sep 17 00:00:00 2001 From: Josh Krebs Date: Mon, 25 Sep 2023 16:27:47 -0700 Subject: [PATCH 04/16] working on IncomeGroup --- .../src/components/budget/IncomeGroup.js | 42 ------------ .../src/components/budget/IncomeGroup.tsx | 67 +++++++++++++++++++ .../src/components/budget/index.js | 4 ++ 3 files changed, 71 insertions(+), 42 deletions(-) delete mode 100644 packages/desktop-client/src/components/budget/IncomeGroup.js create mode 100644 packages/desktop-client/src/components/budget/IncomeGroup.tsx diff --git a/packages/desktop-client/src/components/budget/IncomeGroup.js b/packages/desktop-client/src/components/budget/IncomeGroup.js deleted file mode 100644 index f7d260fff54..00000000000 --- a/packages/desktop-client/src/components/budget/IncomeGroup.js +++ /dev/null @@ -1,42 +0,0 @@ -import React from 'react'; - -import { theme } from '../../style'; -import { Row } from '../table'; - -import RenderMonths from './RenderMonths'; -import SidebarGroup from './SidebarGroup'; - -function IncomeGroup({ - group, - editingCell, - collapsed, - MonthComponent, - onEditName, - onSave, - onToggleCollapse, - onShowNewCategory, -}) { - return ( - - - - - ); -} - -export default IncomeGroup; diff --git a/packages/desktop-client/src/components/budget/IncomeGroup.tsx b/packages/desktop-client/src/components/budget/IncomeGroup.tsx new file mode 100644 index 00000000000..f99f1e4c801 --- /dev/null +++ b/packages/desktop-client/src/components/budget/IncomeGroup.tsx @@ -0,0 +1,67 @@ +import React, { type ComponentProps } from 'react'; + +import { theme } from '../../style'; +import { Row } from '../table'; + +import RenderMonths from './RenderMonths'; +import SidebarGroup from './SidebarGroup'; + +type IncomeGroupProps = { + group: { + id: string; + hidden: number; + categories: object[]; + is_income: number; + name: string; + sort_order: number; + tombstone: number; + }; + editingCell: { id: string; cell: string } | null; + collapsed: boolean; + MonthComponent: () => JSX.Element; + onEditName: (id: string) => void; + onSave: (group: object) => Promise; + onToggleCollapse: (id: string) => void; + onShowNewCategory: (groupId: string) => void; +}; + +function IncomeGroup({ + group, + editingCell, + collapsed, + MonthComponent, + onEditName, + onSave, + onToggleCollapse, + onShowNewCategory, +}: IncomeGroupProps) { + console.log('group', group); + console.log('editing cell', editingCell); + console.log('collapsed', collapsed); + console.log('MonthComponent', MonthComponent); + console.log('onEditName', onEditName); + console.log('onSave', onSave); + console.log('onToggleCollapse', onToggleCollapse); + console.log('onShowNewCategory', onShowNewCategory); + + return ( + + + + + ); +} + +export default IncomeGroup; diff --git a/packages/desktop-client/src/components/budget/index.js b/packages/desktop-client/src/components/budget/index.js index 59b9aac759f..23c04cbf12f 100644 --- a/packages/desktop-client/src/components/budget/index.js +++ b/packages/desktop-client/src/components/budget/index.js @@ -45,6 +45,10 @@ function Budget(props) { const [prewarmStartMonth, setPrewarmStartMonth] = useState( props.startMonth || currentMonth, ); + console.log('Budget props:', props); + console.log('currentMonth: ', currentMonth); + // console.log('type of cuurentMonth: ', typeofcurrentMonth); + const [newCategoryForGroup, setNewCategoryForGroup] = useState(null); const [isAddingGroup, setIsAddingGroup] = useState(false); const [collapsed, setCollapsed] = useState(props.collapsedPrefs || []); From 9bee7bceaf6d86d8401897ad731ca852b250e66e Mon Sep 17 00:00:00 2001 From: Josh Krebs Date: Mon, 25 Sep 2023 16:35:25 -0700 Subject: [PATCH 05/16] refactor IncomeGroup to tsx --- .../src/components/budget/IncomeGroup.tsx | 20 +++++++------------ .../src/components/budget/IncomeHeader.tsx | 2 +- .../src/components/budget/index.js | 3 --- 3 files changed, 8 insertions(+), 17 deletions(-) diff --git a/packages/desktop-client/src/components/budget/IncomeGroup.tsx b/packages/desktop-client/src/components/budget/IncomeGroup.tsx index f99f1e4c801..8ee4faa73b7 100644 --- a/packages/desktop-client/src/components/budget/IncomeGroup.tsx +++ b/packages/desktop-client/src/components/budget/IncomeGroup.tsx @@ -1,4 +1,4 @@ -import React, { type ComponentProps } from 'react'; +import React from 'react'; import { theme } from '../../style'; import { Row } from '../table'; @@ -35,15 +35,6 @@ function IncomeGroup({ onToggleCollapse, onShowNewCategory, }: IncomeGroupProps) { - console.log('group', group); - console.log('editing cell', editingCell); - console.log('collapsed', collapsed); - console.log('MonthComponent', MonthComponent); - console.log('onEditName', onEditName); - console.log('onSave', onSave); - console.log('onToggleCollapse', onToggleCollapse); - console.log('onShowNewCategory', onShowNewCategory); - return ( + onShowNewCategory={onShowNewCategory} + /> ); diff --git a/packages/desktop-client/src/components/budget/IncomeHeader.tsx b/packages/desktop-client/src/components/budget/IncomeHeader.tsx index f06600aeec1..a797ceacc2b 100644 --- a/packages/desktop-client/src/components/budget/IncomeHeader.tsx +++ b/packages/desktop-client/src/components/budget/IncomeHeader.tsx @@ -1,4 +1,4 @@ -import React, { type Component, type ReactNode } from 'react'; +import React from 'react'; import Button from '../common/Button'; import View from '../common/View'; diff --git a/packages/desktop-client/src/components/budget/index.js b/packages/desktop-client/src/components/budget/index.js index 23c04cbf12f..5b8d8aed040 100644 --- a/packages/desktop-client/src/components/budget/index.js +++ b/packages/desktop-client/src/components/budget/index.js @@ -45,9 +45,6 @@ function Budget(props) { const [prewarmStartMonth, setPrewarmStartMonth] = useState( props.startMonth || currentMonth, ); - console.log('Budget props:', props); - console.log('currentMonth: ', currentMonth); - // console.log('type of cuurentMonth: ', typeofcurrentMonth); const [newCategoryForGroup, setNewCategoryForGroup] = useState(null); const [isAddingGroup, setIsAddingGroup] = useState(false); From 2c934ed4835da6d0a6143ea0084b4a10a92f3861 Mon Sep 17 00:00:00 2001 From: Josh Krebs Date: Mon, 25 Sep 2023 18:24:46 -0700 Subject: [PATCH 06/16] refactor SideBarGroup to tsx --- .../{SidebarGroup.js => SidebarGroup.tsx} | 49 +++++++++++++++++-- 1 file changed, 46 insertions(+), 3 deletions(-) rename packages/desktop-client/src/components/budget/{SidebarGroup.js => SidebarGroup.tsx} (77%) diff --git a/packages/desktop-client/src/components/budget/SidebarGroup.js b/packages/desktop-client/src/components/budget/SidebarGroup.tsx similarity index 77% rename from packages/desktop-client/src/components/budget/SidebarGroup.js rename to packages/desktop-client/src/components/budget/SidebarGroup.tsx index f470ebb31ce..6e2481020d3 100644 --- a/packages/desktop-client/src/components/budget/SidebarGroup.js +++ b/packages/desktop-client/src/components/budget/SidebarGroup.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { CSSProperties, useState } from 'react'; import ExpandArrow from '../../icons/v0/ExpandArrow'; import CheveronDown from '../../icons/v1/CheveronDown'; @@ -11,6 +11,35 @@ import NotesButton from '../NotesButton'; import { InputCell } from '../table'; import { Tooltip } from '../tooltips'; +type InputPropsProps = { + style: CSSProperties; + placeholder: string; +} + +type SidebarGroupProps = { + group: { + id: string; + hidden: number; + categories: object[]; + is_income: number; + name: string; + sort_order: number; + tombstone: number; + }; + editing?: boolean; + collapsed: boolean; + dragPreview?: () => void; + innerRef?: () => void; + borderColor?: string; + style?: CSSProperties; + onEdit?: (id: string) => void; + onSave?: (group: object) => Promise; + onDelete?: (id: string) => Promise; + onShowNewCategory?: (groupId: string) => void; + onHideNewGroup?: () => void; + onToggleCollapse?: (id: string) => void; +} + function SidebarGroup({ group, editing, @@ -25,7 +54,20 @@ function SidebarGroup({ onShowNewCategory, onHideNewGroup, onToggleCollapse, -}) { +}: SidebarGroupProps) { + console.log('group', group); + console.log('editing', editing); + console.log('collapsed', collapsed); + console.log('dragPreview', dragPreview); + console.log('innerRef', innerRef); + console.log('borderColor', borderColor); + console.log('onEdit', onEdit); + console.log('onSave', onSave); + console.log('onDelete', onDelete); + console.log('onShowNewCategory', onShowNewCategory); + console.log('onShowNewCategory', onShowNewCategory); + console.log('onHideNewGroup', onHideNewGroup); + console.log('onToggleCollapse', onToggleCollapse); const temporary = group.id === 'new'; const [menuOpen, setMenuOpen] = useState(false); @@ -143,7 +185,7 @@ function SidebarGroup({ > displayed} + formatter={value => displayed.toString()} width="flex" exposed={editing} onUpdate={value => { @@ -160,6 +202,7 @@ function SidebarGroup({ onBlur={() => onEdit(null)} style={{ fontWeight: 600 }} inputProps={{ + value: undefined, style: { marginLeft: 20 }, placeholder: temporary ? 'New Group Name' : '', }} From ccd8235ca83e53764ed23bd5e2b4eab47c492aab Mon Sep 17 00:00:00 2001 From: Josh Krebs Date: Wed, 27 Sep 2023 14:52:44 -0700 Subject: [PATCH 07/16] fix SidebarGroup formatter type --- .../src/components/budget/RenderMonths.tsx | 4 ++-- .../src/components/budget/SidebarGroup.tsx | 24 +++---------------- .../desktop-client/src/components/table.tsx | 2 +- 3 files changed, 6 insertions(+), 24 deletions(-) diff --git a/packages/desktop-client/src/components/budget/RenderMonths.tsx b/packages/desktop-client/src/components/budget/RenderMonths.tsx index 0e129d721ae..95d4507d812 100644 --- a/packages/desktop-client/src/components/budget/RenderMonths.tsx +++ b/packages/desktop-client/src/components/budget/RenderMonths.tsx @@ -27,7 +27,7 @@ function RenderMonths({ args, style, }: RenderMonthsProps) { - let { months, type } = useContext(MonthsContext); + let { months } = useContext(MonthsContext); return months.map((month, index) => { let editing = editingIndex === index; @@ -48,7 +48,7 @@ function RenderMonths({ ); - }) as any; + }) as unknown as JSX.Element; } export default RenderMonths; diff --git a/packages/desktop-client/src/components/budget/SidebarGroup.tsx b/packages/desktop-client/src/components/budget/SidebarGroup.tsx index 6e2481020d3..c8473d2c0e2 100644 --- a/packages/desktop-client/src/components/budget/SidebarGroup.tsx +++ b/packages/desktop-client/src/components/budget/SidebarGroup.tsx @@ -1,4 +1,4 @@ -import React, { CSSProperties, useState } from 'react'; +import React, { type CSSProperties, useState } from 'react'; import ExpandArrow from '../../icons/v0/ExpandArrow'; import CheveronDown from '../../icons/v1/CheveronDown'; @@ -11,11 +11,6 @@ import NotesButton from '../NotesButton'; import { InputCell } from '../table'; import { Tooltip } from '../tooltips'; -type InputPropsProps = { - style: CSSProperties; - placeholder: string; -} - type SidebarGroupProps = { group: { id: string; @@ -38,7 +33,7 @@ type SidebarGroupProps = { onShowNewCategory?: (groupId: string) => void; onHideNewGroup?: () => void; onToggleCollapse?: (id: string) => void; -} +}; function SidebarGroup({ group, @@ -55,19 +50,6 @@ function SidebarGroup({ onHideNewGroup, onToggleCollapse, }: SidebarGroupProps) { - console.log('group', group); - console.log('editing', editing); - console.log('collapsed', collapsed); - console.log('dragPreview', dragPreview); - console.log('innerRef', innerRef); - console.log('borderColor', borderColor); - console.log('onEdit', onEdit); - console.log('onSave', onSave); - console.log('onDelete', onDelete); - console.log('onShowNewCategory', onShowNewCategory); - console.log('onShowNewCategory', onShowNewCategory); - console.log('onHideNewGroup', onHideNewGroup); - console.log('onToggleCollapse', onToggleCollapse); const temporary = group.id === 'new'; const [menuOpen, setMenuOpen] = useState(false); @@ -185,7 +167,7 @@ function SidebarGroup({ > displayed.toString()} + formatter={value => displayed} width="flex" exposed={editing} onUpdate={value => { diff --git a/packages/desktop-client/src/components/table.tsx b/packages/desktop-client/src/components/table.tsx index 7d0d2aca3cb..95cb64a8760 100644 --- a/packages/desktop-client/src/components/table.tsx +++ b/packages/desktop-client/src/components/table.tsx @@ -131,7 +131,7 @@ export function UnexposedCellContent({ } type CellProps = Omit, 'children' | 'value'> & { - formatter?: (value: string, type?: unknown) => string; + formatter?: (value: string, type?: unknown) => string | JSX.Element; focused?: boolean; textAlign?: CSSProperties['textAlign']; alignItems?: CSSProperties['alignItems']; From 8f76cd801ce5434ae7b8973f0f2f4e71d2699969 Mon Sep 17 00:00:00 2001 From: Josh Krebs Date: Wed, 27 Sep 2023 15:16:02 -0700 Subject: [PATCH 08/16] add release notes --- upcoming-release-notes/1743.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 upcoming-release-notes/1743.md diff --git a/upcoming-release-notes/1743.md b/upcoming-release-notes/1743.md new file mode 100644 index 00000000000..f69263a092e --- /dev/null +++ b/upcoming-release-notes/1743.md @@ -0,0 +1,6 @@ +--- +category: Maintenance +authors: [Jod929] +--- + +Refactor the following to tsx: IncomeGroup, IncomeHeader, MonthsContext, RenderMonths, SidebarGroup. \ No newline at end of file From 210012b8658da60def391881fd5cb06cb3daec25 Mon Sep 17 00:00:00 2001 From: Neil <55785687+carkom@users.noreply.github.com> Date: Mon, 2 Oct 2023 09:46:28 -0700 Subject: [PATCH 09/16] Regression fixes (#1752) * regression fixes * notes * VRT updates --- ...-transactions-by-date-1-chromium-linux.png | Bin 9483 -> 9332 bytes .../budget/report/BudgetSummary.tsx | 3 +-- .../src/components/filters/FiltersMenu.js | 1 + upcoming-release-notes/1752.md | 6 ++++++ 4 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 upcoming-release-notes/1752.md diff --git a/packages/desktop-client/e2e/transactions.test.js-snapshots/Transactions-filters-transactions-by-date-1-chromium-linux.png b/packages/desktop-client/e2e/transactions.test.js-snapshots/Transactions-filters-transactions-by-date-1-chromium-linux.png index c20a4937f120fc38fa5dc5492f0b8d9d3f771e21..9834323223e1d0e033aa4caff1c9b653f1d81a7c 100644 GIT binary patch literal 9332 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 I1uzQwFF4F!2><{9 literal 9483 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 H8h`o^CnTtL diff --git a/packages/desktop-client/src/components/budget/report/BudgetSummary.tsx b/packages/desktop-client/src/components/budget/report/BudgetSummary.tsx index ebf6d1c782c..676c21536c0 100644 --- a/packages/desktop-client/src/components/budget/report/BudgetSummary.tsx +++ b/packages/desktop-client/src/components/budget/report/BudgetSummary.tsx @@ -379,7 +379,6 @@ export function BudgetSummary({ month }: BudgetSummaryProps) { fontWeight: 500, textDecorationSkip: 'ink', }, - currentMonth === month && { textDecoration: 'underline' }, ])}`} > {monthUtils.format(month, 'MMMM')} @@ -473,7 +472,7 @@ export function BudgetSummary({ month }: BudgetSummaryProps) { padding: '10px 20px', justifyContent: 'space-between', backgroundColor: theme.tableRowHeaderBackground, - borderTop: '1px solid ' + theme.tableRowHeaderText, + borderTop: '1px solid ' + theme.tableBorder, }} > = currentMonth} /> diff --git a/packages/desktop-client/src/components/filters/FiltersMenu.js b/packages/desktop-client/src/components/filters/FiltersMenu.js index e74030b9d9b..73f5d68ebee 100644 --- a/packages/desktop-client/src/components/filters/FiltersMenu.js +++ b/packages/desktop-client/src/components/filters/FiltersMenu.js @@ -184,6 +184,7 @@ function ConfigureField({ {field === 'amount' || field === 'date' ? (