You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix(dashboards): opt widgets out of global filters their object lacks (2.2.1) (#458)
2.2.0 fixed only the built-in `dateRange` picker, but ObjectStack 15
(framework#2501) injects EVERY dashboard filter — dateRange AND every
globalFilters[] entry — into each widget's analytics query. Widgets on
objects without the filtered column still crashed with
`SqliteError: no such column: <field>` and rendered as error cards.
- Executive `Lead Source` filter: crm_account has no `lead_source`, so
total_accounts / new_accounts_by_month / accounts_by_industry threw
`no such column: lead_source`. Add `lead_source: false` to their
filterBindings (contact/lead keep filtering — they have the field).
- CRM `Owner` filter: crm_product has no `owner`, so top_products would
crash the same way. Add `owner: false` to its filterBindings.
- Audited the full filter×object matrix: Sales (all opportunity_metrics)
and Service (created_date/owner/priority all on crm_case) need nothing.
Browser-verified by actually SELECTING the filter values (Lead Source = Web):
account widgets stay populated, contact/lead filter correctly, zero analytics
errors in the server log. verify (validate/build/test 17/17) green.
Co-authored-by: Jack Zhuang <277994282+os-zhuang@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: CHANGELOG.md
+10Lines changed: 10 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,6 +2,16 @@
2
2
3
3
All notable changes to HotCRM are documented in this file. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); HotCRM follows [Semantic Versioning](https://semver.org/).
4
4
5
+
## [2.2.1] — 2026-07-20
6
+
7
+
Follow-up patch to 2.2.0. The dashboard-filter fix in 2.2.0 only covered the built-in `dateRange` picker; the **`globalFilters[]`** have the same propagation behaviour (ObjectStack 15 / framework#2501 injects every dashboard filter into each widget's query) and were still crashing widgets on objects that lack the filtered field. Browser-verified by actually selecting the filter values, not just loading the dashboards.
8
+
9
+
### Fixed
10
+
11
+
-**Selecting the Executive dashboard's `Lead Source` filter crashed every account widget.** The `lead_source` global filter was injected into each widget's query; `crm_account` has no `lead_source` column, so `total_accounts`, `new_accounts_by_month`, and `accounts_by_industry` failed with `SqliteError: no such column: lead_source`. Added `lead_source: false` to those three widgets' [`filterBindings`](src/dashboards/executive.dashboard.ts) (they keep `dateRange: false` too). `crm_contact` and `crm_lead`*do* have `lead_source`, so `total_contacts` / `open_leads` correctly keep filtering. Verified in the browser: selecting `Lead Source = Web` now returns filtered/empty results with zero analytics errors.
12
+
-**CRM dashboard's `Owner` filter would crash `top_products`.**`crm_product` has no `owner` column, so the `owner` global filter would fail the product-category widget the same way. Added `owner: false` to its [`filterBindings`](src/dashboards/crm.dashboard.ts) (alongside the existing `dateRange: false`).
13
+
- Full field-vs-filter matrix audited across all four dashboards: Sales (all `opportunity_metrics`, which has `owner`/`type`/`close_date`) and Service (`created_date`/`owner`/`priority` all on `crm_case`) needed no change.
14
+
5
15
## [2.2.0] — 2026-07-20
6
16
7
17
Platform upgrade to ObjectStack **16.0.0-rc.1** — the 16 release-candidate line (from 14.7, skipping the entire 15.x line). Manifest `specVersion` now declares `^16.0.0-rc.1` (was `^14.0.0`); app version `2.2.0`. ObjectStack 16 finishes the ADR-0049 "enforce-or-remove" sweep (dead metadata props now fail loudly instead of parsing inert), converges the hook/action org identifier on `organizationId`, flips `.strict()` on dashboard-widget / view-form / page schemas, and — most consequentially for this app — makes the `ai` capability a **fail-fast hard requirement** resolved to the closed `@objectstack/service-ai` package. Built, validated, type-checked, unit-tested (17/17), and browser-verified against `@objectstack/* 16.0.0-rc.1` (boot → 38 plugins loaded → 17 flows / 15 trigger-bound → `/_console/` login renders at HTTP 200 with no boot or console errors).
0 commit comments