diff --git a/packages/desktop-client/src/components/ManageRules.js b/packages/desktop-client/src/components/ManageRules.js index ac85aa98d2d396d8120e6c520e58a5f77f760d2f..b4fba68688a4fae2be4e706b55360bce2d984a54 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 cee34db075fb1e48a6a3047da5863fe2eebe6d2f..f0bf6585919fe4ff8c91a9e4a7a0bd6f8563fe8f 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 a6823369fd71f9079081e78ccf0d4d4553ac71a4..beb08f8f19a0d2cc4ac9be7fa0f00028fe85254d 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;