Skip to content

Commit

Permalink
hide target category from cover overspending list (#3115)
Browse files Browse the repository at this point in the history
* hide target category from cover overspending list

* release note

* suggestions from joel-jeremy

* useMemo and better types

* add change to mobile

* fix build

* fix mobile
  • Loading branch information
matt-fidd authored Aug 15, 2024
1 parent af73dcd commit f715cea
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 9 deletions.
1 change: 1 addition & 0 deletions packages/desktop-client/src/components/Modals.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -511,6 +511,7 @@ export function Modals() {
title={options.title}
month={options.month}
showToBeBudgeted={options.showToBeBudgeted}
category={options.category}
onSubmit={options.onSubmit}
/>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ export function BalanceMovementMenu({

{menu === 'cover' && (
<CoverMenu
category={categoryId}
onClose={onClose}
onSubmit={fromCategoryId => {
onBudgetAction(month, 'cover-overspending', {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
import React, { useState } from 'react';
import React, { useMemo, useState } from 'react';

import {
type CategoryGroupEntity,
type CategoryEntity,
} from 'loot-core/src/types/models';

import { useCategories } from '../../../hooks/useCategories';
import { CategoryAutocomplete } from '../../autocomplete/CategoryAutocomplete';
Expand All @@ -7,26 +12,47 @@ import { InitialFocus } from '../../common/InitialFocus';
import { View } from '../../common/View';
import { addToBeBudgetedGroup } from '../util';

function removeSelectedCategory(
categoryGroups: CategoryGroupEntity[],
category?: CategoryEntity['id'],
) {
if (!category) return categoryGroups;

return categoryGroups
.map(group => ({
...group,
categories: group.categories?.filter(cat => cat.id !== category),
}))
.filter(group => group.categories?.length);
}

type CoverMenuProps = {
showToBeBudgeted?: boolean;
category?: CategoryEntity['id'];
onSubmit: (categoryId: string) => void;
onClose: () => void;
};

export function CoverMenu({
showToBeBudgeted = true,
category,
onSubmit,
onClose,
}: CoverMenuProps) {
const { grouped: originalCategoryGroups } = useCategories();
const filteredCategoryGroups = originalCategoryGroups.filter(
g => !g.is_income,
);
const expenseGroups = originalCategoryGroups.filter(g => !g.is_income);

const categoryGroups = showToBeBudgeted
? addToBeBudgetedGroup(filteredCategoryGroups)
: filteredCategoryGroups;
? addToBeBudgetedGroup(expenseGroups)
: expenseGroups;

const [categoryId, setCategoryId] = useState<string | null>(null);

const filteredCategoryGroups = useMemo(
() => removeSelectedCategory(categoryGroups, category),
[categoryGroups, category],
);

function submit() {
if (categoryId) {
onSubmit(categoryId);
Expand All @@ -40,7 +66,7 @@ export function CoverMenu({
<InitialFocus>
{node => (
<CategoryAutocomplete
categoryGroups={categoryGroups}
categoryGroups={filteredCategoryGroups}
value={categoryGroups.find(g => g.id === categoryId) ?? null}
openOnFocus={true}
onSelect={(id: string | undefined) => setCategoryId(id || null)}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,7 @@ const ExpenseCategory = memo(function ExpenseCategory({
pushModal('cover', {
title: category.name,
month,
category: category.id,
onSubmit: fromCategoryId => {
onBudgetAction(month, 'cover-overspending', {
to: category.id,
Expand Down
31 changes: 29 additions & 2 deletions packages/desktop-client/src/components/modals/CoverModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { useDispatch } from 'react-redux';

import { pushModal } from 'loot-core/client/actions';
import {
type CategoryGroupEntity,
type CategoryEntity,
} from 'loot-core/src/types/models';

import { useCategories } from '../../hooks/useCategories';
import { useInitialMount } from '../../hooks/useInitialMount';
Expand All @@ -12,45 +16,68 @@ import { Modal, ModalCloseButton, ModalHeader } from '../common/Modal2';
import { View } from '../common/View';
import { FieldLabel, TapField } from '../mobile/MobileForms';

function removeSelectedCategory(
categoryGroups: CategoryGroupEntity[],
category?: CategoryEntity['id'],
) {
if (!category) return categoryGroups;

return categoryGroups
.map(group => ({
...group,
categories: group.categories?.filter(cat => cat.id !== category),
}))
.filter(group => group.categories?.length);
}

type CoverModalProps = {
title: string;
month: string;
showToBeBudgeted?: boolean;
category?: CategoryEntity['id'];
onSubmit: (categoryId: string) => void;
};

export function CoverModal({
title,
month,
showToBeBudgeted = true,
category,
onSubmit,
}: CoverModalProps) {
const { grouped: originalCategoryGroups } = useCategories();
const [categoryGroups, categories] = useMemo(() => {
const filteredCategoryGroups = originalCategoryGroups.filter(
g => !g.is_income,
);

const expenseGroups = showToBeBudgeted
? addToBeBudgetedGroup(filteredCategoryGroups)
: filteredCategoryGroups;

const expenseCategories = expenseGroups.flatMap(g => g.categories || []);
return [expenseGroups, expenseCategories];
}, [originalCategoryGroups, showToBeBudgeted]);

const filteredCategoryGroups = useMemo(
() => removeSelectedCategory(categoryGroups, category),
[categoryGroups, category],
);

const [fromCategoryId, setFromCategoryId] = useState<string | null>(null);
const dispatch = useDispatch();

const onCategoryClick = useCallback(() => {
dispatch(
pushModal('category-autocomplete', {
categoryGroups,
categoryGroups: filteredCategoryGroups,
month,
onSelect: categoryId => {
setFromCategoryId(categoryId);
},
}),
);
}, [categoryGroups, dispatch, month]);
}, [filteredCategoryGroups, dispatch, month]);

const _onSubmit = (categoryId: string | null) => {
if (categoryId) {
Expand Down
6 changes: 6 additions & 0 deletions upcoming-release-notes/3115.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
category: Bugfix
authors: [matt-fidd]
---

Hide the target category from the cover overspending category list

0 comments on commit f715cea

Please sign in to comment.