toga-ai 1.0.593 → 1.0.594

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -96,7 +96,10 @@ Per-column header controls, each a popover trigger with `data-active` / `data-op
96
96
  is hidden while the input is focused; both the trigger button and the icon span carry
97
97
  `data-active`. The clear button must not widen the input row (fixed-width menu).
98
98
  - **`HeaderFilterRange`** — numeric, modes exactly/moreThan/lessThan + a range toggle
99
- (min/max); emits `{ key, value }[]` (`eq`/`min`/`max`/`between`).
99
+ (min/max); emits `{ key, value }[]` (`eq`/`min`/`max`/`between`). Reads its persisted
100
+ operator/values back from a `filterParams` prop (not `filterValue`, which collapses to the
101
+ literal `"active"` when a range filter is set); `PrimaryTableHeaderCell` must pass
102
+ `filterParams` through.
100
103
  - **`HeaderFilterMultiselect`** — checkbox list with "Select All"; emits comma-joined slugs.
101
104
  - **`HeaderFilterDate`** — calendar picker, modes exactly/before/after + range; converts
102
105
  `MM/DD/YYYY` ↔ URL `YYYY-MM-DD`; calendar + mode dropdown both portalled.
@@ -148,12 +151,31 @@ Per-column header controls, each a popover trigger with `data-active` / `data-op
148
151
  never for data fetching. A visible column can still *look* missing when `shrinkColumns` freezes
149
152
  it to a tiny width because its measured header+body content is minimal (see
150
153
  [primary-table-templates](primary-table-templates.md)).
154
+ - **Filter presentational components must seed their internal mode/value state from props.**
155
+ The filter mode/operator survives the URL round-trip — it is persisted as a URL key suffix
156
+ (`_starts`/`_ends`/`_eq`/`_excludes` for text; `_min`/`_max`/`_eq`/`_between` for range),
157
+ rehydrated into TanStack `columnFilters` by toga25-supply `useServerTableUrlState`, and
158
+ carried through `PrimaryTableHeaderCell`. But `HeaderFilterSearch`/`HeaderFilterRange` are
159
+ remounted fresh each time a filter popover opens, so if they don't seed local state from
160
+ their props (`filterMode` / `filterParams`) they hard-default (`includes` for text,
161
+ `exactly` for range) and reopening a filter *shows the wrong mode* even though the applied
162
+ filter is correct. Fixed via a `useEffect` seeding `filterMode` from `filterModeProp` in
163
+ `HeaderFilterSearch`, and a rehydration effect keyed on `JSON.stringify(filterParams)` in
164
+ `HeaderFilterRange` that reconstructs mode + value(s) from the operator keys
165
+ (`eq`→Exactly, `min`→MoreThan, `max`→LessThan, `between`→range min/max).
151
166
  - **Table/surface meta is cached with `Infinity` staleTime/gcTime** (`useFetchTablePageMeta`), so
152
167
  after a DB metadata change (`TableViewFields`, `Core.RecordFields`) a **hard reload** is required
153
168
  to see it. And the app consumes toga-blox's built **`dist/`**, not `src/` — editing blox source
154
169
  requires `npm run build` before it takes effect at runtime.
155
170
 
156
171
  ## Change history
172
+ - 2026-08-17 — Fixed: column filter **mode** was not restored when a filter popover was reopened
173
+ (text reverted to `includes`, range to `exactly`). Root cause: the URL round-trip and
174
+ `PrimaryTableHeaderCell` preserved the mode, but `HeaderFilterSearch` (destructured
175
+ `filterMode` as `filterModeProp` and never used it) and `HeaderFilterRange` (received no
176
+ operator info) never seeded internal state from props. Seeded both from props; added a
177
+ `filterParams` prop to `HeaderFilterRange` and passed it through `PrimaryTableHeaderCell`.
178
+ (apeterson)
157
179
  - 2026-08-17 — Added gotchas on meta→column mapping: field `type`/`precision` come from
158
180
  `Core.RecordFields` (not per-view) while `isCopyable`/`isVisible`/`isSortable`/`isFilterable` are
159
181
  per-view; `isVisible` is the only column gate; `accessorFn` dot-walks and needs the join;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "toga-ai",
3
- "version": "1.0.593",
3
+ "version": "1.0.594",
4
4
  "description": "TOGA Technology Team Claude Knowledge System — shared AI coding harness with skills, knowledge base CLI, and project installer for Claude Code.",
5
5
  "keywords": [
6
6
  "claude",