Building a modern alternative to Salesforce, powered by the community.
Find a file
Sonarly Claude Code 0238d8bd53 fix: optimistically update metadata store after view filter/sort mutations
https://sonarly.com/issue/23699?type=bug

After saving view filters/sorts, the local metadata store is not updated optimistically — it waits for an asynchronous SSE event round-trip from the backend, causing the "Update view" button to remain visible and requiring a second click.

Fix: After each view save hook's mutations succeed, the metadata store (`metadataStoreState`) is now optimistically updated to reflect the new state immediately. This eliminates the dependency on the SSE round-trip for UI state reconciliation.

**What changed in each file:**

1. **`useSaveRecordFiltersToViewFilters.ts`** — After all create/update/delete filter mutations succeed, replaces the `viewFilters` entries in `metadataStoreState.current` for the current view with the computed `newViewFilters`.

2. **`useSaveRecordSortsToViewSorts.ts`** — Same pattern for `viewSorts` entries.

3. **`useSaveRecordFilterGroupsToViewFilterGroups.ts`** — Same pattern for `viewFilterGroups` entries.

4. **`useSaveAnyFieldFilterToView.ts`** — After the view update mutation succeeds, updates the `anyFieldFilterValue` field on the current view in the `views` metadata store entry.

Each optimistic update:
- Reads the current state from the metadata store (respecting draft-pending status)
- Filters out entries belonging to the current view
- Replaces them with the new computed values
- Writes directly to `.current` so the `viewsSelector` (which reads `.current`) immediately reflects the saved state

When the SSE event arrives later, the `addToDraft`/`applyChanges` pipeline will find the data already matches and skip unnecessary updates due to `isDeeplyEqual` checks.
2026-04-10 09:21:38 +00:00
.claude-pr Add file attachment support to agent chat messaging (#19517) 2026-04-09 22:37:03 +02:00
.cursor Replace typeorm binary by database:migrate:generate (#19515) 2026-04-09 16:25:10 +00:00
.github Add application-logs module with driver pattern for logic function log persistence (#19486) 2026-04-09 14:35:24 +00:00
.vscode Migrate from ESLint to OxLint (#18443) 2026-03-06 01:03:50 +01:00
.yarn Refactor dependency graph for SDK, client-sdk and create-app (#18963) 2026-03-26 10:56:52 +00:00
packages fix: optimistically update metadata store after view filter/sort mutations 2026-04-10 09:21:38 +00:00
.dockerignore Scaffold light twenty app dev container (#18734) 2026-03-18 20:10:54 +01:00
.gitattributes Consolidate Prettier config and improve consistency (#15191) 2025-10-18 12:24:35 +02:00
.gitignore polishing next home hero visual (#19284) 2026-04-02 20:26:05 +00:00
.mcp.json Fix AI chat re-renders and refactored code (#18585) 2026-03-21 12:52:21 +00:00
.nvmrc Upgrade to Node 24 (#13730) 2025-08-07 17:02:12 +02:00
.yarnrc.yml Refactor dependency graph for SDK, client-sdk and create-app (#18963) 2026-03-26 10:56:52 +00:00
CLAUDE.md Replace typeorm binary by database:migrate:generate (#19515) 2026-04-09 16:25:10 +00:00
jest.preset.js Move tools/eslint-rules to packages/twenty-eslint-rules (#17203) 2026-01-17 07:37:17 +01:00
LICENSE feat(sso): allow to use OIDC and SAML (#7246) 2024-10-21 20:07:08 +02:00
nx.json fix: replace npm pkg set with node script in set-local-version target (#19344) 2026-04-05 18:56:37 +00:00
package.json Bump @storybook/react-vite from 10.2.13 to 10.3.3 (#19232) 2026-04-02 08:49:11 +00:00
README.md docs: fix contributor docs links and typos (#18637) 2026-03-14 12:54:31 +01:00
tsconfig.base.json Revert "[hacktoberfest] feat: add fireflies" (#15589) 2025-11-04 12:25:23 +01:00
yarn.config.cjs [ENHC] Create Yarn constraints to validate node version (#10542) 2025-02-27 15:18:07 +01:00
yarn.lock chore: replace glb files and lottie with optimized variants (#19503) 2026-04-09 14:27:13 +00:00

Twenty logo

The #1 Open-Source CRM

🌐 Website · 📚 Documentation · Roadmap · Discord · Figma


Cover


Installation

See: 🚀 Self-hosting 🖥️ Local Setup

Why Twenty

We built Twenty for three reasons:

CRMs are too expensive, and users are trapped. Companies use locked-in customer data to hike prices. It shouldn't be that way.

A fresh start is required to build a better experience. We can learn from past mistakes and craft a cohesive experience inspired by new UX patterns from tools like Notion, Airtable or Linear.

We believe in open-source and community. Hundreds of developers are already building Twenty together. Once we have plugin capabilities, a whole ecosystem will grow around it.


What You Can Do With Twenty

Please feel free to flag any specific needs you have by creating an issue.

Below are a few features we have implemented to date:

Personalize layouts with filters, sort, group by, kanban and table views

Companies Kanban Views

Customize your objects and fields

Setting Custom Objects

Create and manage permissions with custom roles

Permissions

Automate workflow with triggers and actions

Workflows

Emails, calendar events, files, and more

Other Features


Stack

Thanks

Chromatic Greptile Sentry Crowdin E2B

Thanks to these amazing services that we use and recommend for UI testing (Chromatic), code review (Greptile), catching bugs (Sentry) and translating (Crowdin).

Join the Community