bb037e13dd
## Summary Fixes #17667 - **Root cause**: `ActivityQueryResultGetterHandler` called `JSON.parse()` on the `blocknote` field and assumed the result was always an array. When the stored value was valid JSON but not an array (e.g., `"{}"`), `blocknote.map()` crashed with `blocknote.map is not a function`, breaking the entire notes page. - **Fix**: Replaced the object-level `ActivityQueryResultGetterHandler` (hardcoded for `note`/`task` only) with a generic field-level `RichTextV2FieldQueryResultGetterHandler` that safely parses blocknote JSON with `Array.isArray` validation and gracefully skips malformed values instead of crashing. - **Bonus**: The new handler works for **all** objects with `RICH_TEXT_V2` fields (not just `note`/`task`), following the same pattern as the existing `FilesFieldQueryResultGetterHandler`. ## Changes | File | Change | |------|--------| | `rich-text-v2-field-query-result-getter.handler.ts` | New field-level handler with safe blocknote parsing | | `common-result-getters.service.ts` | Register new handler, remove `note`/`task` object handlers | | `activity-query-result-getter.handler.ts` | Deleted (replaced by field-level handler) | | `rich-text-v2-field-query-result-getter.handler.spec.ts` | 9 tests covering all edge cases | ## Test plan - [x] Unit tests pass (9 tests covering: null blocknote, non-string blocknote, invalid JSON, non-array JSON like `"{}"`, no images, external URLs, internal URLs, multiple fields) - [x] Lint passes (`lint:diff-with-main`) - [x] Typecheck passes Made with [Cursor](https://cursor.com) --------- Co-authored-by: Cursor <cursoragent@cursor.com>