Compare commits

...
Author SHA1 Message Date
Sonarly Claude Code aba5c93a6f TEXT filter throws on "IS" operand from stale/mismatched persisted view filter
https://sonarly.com/issue/12715?type=bug

The TEXT filter handler in `turnRecordFilterIntoGqlOperationFilter` only supports CONTAINS and DOES_NOT_CONTAIN operands, but a persisted view filter has operand "IS" on a TEXT-typed field, causing an unhandled throw that crashes the People record table view.

Fix: Changed the TEXT filter's `default` case in `turnRecordFilterIntoRecordGqlOperationFilter` from throwing a `CustomError` to returning `undefined`. This makes the function resilient to stale or mismatched operands (like `IS`) persisted in view filters for TEXT fields.

The function's return type is `RecordGqlOperationFilter | undefined`, and all callers already handle `undefined` via `.filter(isDefined)` — so returning `undefined` simply skips the invalid filter instead of crashing the page. This is consistent with other guard clauses in the same function (e.g., missing field metadata at line 82-84, empty value at line 86-90).

Also removed the now-unused `CustomError` import.
2026-03-10 22:08:58 +00:00
@@ -41,7 +41,6 @@ import { type DateTimeFilter } from '@/types/RecordGqlOperationFilter';
import {
checkIfShouldComputeEmptinessFilter,
checkIfShouldSkipFiltering,
CustomError,
getFilterTypeFromFieldType,
getNextPeriodStart,
getPeriodStart,
@@ -130,10 +129,7 @@ export const turnRecordFilterIntoRecordGqlOperationFilter = ({
},
};
default:
throw new CustomError(
`Unknown operand ${recordFilter.operand} for ${filterType} filter`,
'UNKNOWN_OPERAND_FOR_FILTER',
);
return;
}
case 'TS_VECTOR':
switch (recordFilter.operand) {