From 2a8b25a3664b05e8c9ee36a95e42654a254bef7b Mon Sep 17 00:00:00 2001 From: Jed Fox <git@jedfox.com> Date: Thu, 23 Feb 2023 15:14:16 -0500 Subject: [PATCH] Fix error cases in displaying filters/rules (#678) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add missing imported_payee case * Switch over to a `switch` to ensure no other cases are missed * Fix switching from “amount†to “amount (inflow/outflow)†* fix crash when parsing null value as number * Fix formatting for “payee/category/account contains†filters --- .../src/components/ManageRules.js | 62 +++++++++++-------- .../src/components/accounts/Filters.js | 7 ++- packages/loot-core/src/shared/rules.js | 8 ++- 3 files changed, 48 insertions(+), 29 deletions(-) diff --git a/packages/desktop-client/src/components/ManageRules.js b/packages/desktop-client/src/components/ManageRules.js index ac85aa98d..b4fba6868 100644 --- a/packages/desktop-client/src/components/ManageRules.js +++ b/packages/desktop-client/src/components/ManageRules.js @@ -51,6 +51,7 @@ let SchedulesQuery = liveQueryContext(q('schedules').select('*')); export function Value({ value, field, + valueIsRaw, inline = false, data: dataProp, describe = x => x.name, @@ -93,35 +94,44 @@ export function Value({ } else if (typeof value === 'boolean') { return value ? 'true' : 'false'; } else { - if (field === 'amount') { - return integerToCurrency(value); - } else if (field === 'date') { - if (value) { - if (value.frequency) { - return getRecurringDescription(value); + switch (field) { + case 'amount': + return integerToCurrency(value); + case 'date': + if (value) { + if (value.frequency) { + return getRecurringDescription(value); + } + return formatDate(parseISO(value), dateFormat); } - return formatDate(parseISO(value), dateFormat); - } - return null; - } else if (field === 'month') { - return value - ? formatDate(parseISO(value), getMonthYearFormat(dateFormat)) - : null; - } else if (field === 'year') { - return value ? formatDate(parseISO(value), 'yyyy') : null; - } else if (field === 'notes') { - return value; - } else { - if (data && data.length) { - let item = data.find(item => item.id === value); - if (item) { - return describe(item); - } else { - return '(deleted)'; + return null; + case 'month': + return value + ? formatDate(parseISO(value), getMonthYearFormat(dateFormat)) + : null; + case 'year': + return value ? formatDate(parseISO(value), 'yyyy') : null; + case 'notes': + case 'imported_payee': + return value; + case 'payee': + case 'category': + case 'account': + if (valueIsRaw) { + return value; + } + if (data && data.length) { + let item = data.find(item => item.id === value); + if (item) { + return describe(item); + } else { + return '(deleted)'; + } } - } else { + return '…'; - } + default: + throw new Error(`Unknown field ${field}`); } } } diff --git a/packages/desktop-client/src/components/accounts/Filters.js b/packages/desktop-client/src/components/accounts/Filters.js index cee34db07..f0bf65859 100644 --- a/packages/desktop-client/src/components/accounts/Filters.js +++ b/packages/desktop-client/src/components/accounts/Filters.js @@ -486,7 +486,12 @@ function FilterExpression({ {mapField(field, options)} </Text>{' '} <Text style={{ color: colors.n3 }}>{friendlyOp(op)}</Text>{' '} - <Value value={value} field={field} inline={true} /> + <Value + value={value} + field={field} + inline={true} + valueIsRaw={op === 'contains'} + /> </> )} </div> diff --git a/packages/loot-core/src/shared/rules.js b/packages/loot-core/src/shared/rules.js index a6823369f..beb08f8f1 100644 --- a/packages/loot-core/src/shared/rules.js +++ b/packages/loot-core/src/shared/rules.js @@ -147,7 +147,11 @@ export function parse(item) { switch (item.type) { case 'number': { let parsed = item.value; - if (item.field === 'amount' && item.op !== 'isbetween') { + if ( + item.field === 'amount' && + item.op !== 'isbetween' && + parsed != null + ) { parsed = integerToAmount(parsed); } return { ...item, value: parsed }; @@ -197,7 +201,7 @@ export function makeValue(value, cond) { return { ...cond, error: null, - value: value ? currencyToAmount(value) || 0 : 0, + value: value ? currencyToAmount(String(value)) || 0 : 0, }; } break; -- GitLab