New column chooser#4409
Draft
haynesjm42 wants to merge 107 commits into
Draft
Conversation
Add ColumnChooserModel, ColumnChooser, PinSectionModel, and PinSection as minimal shells with correct Hoist patterns. Export from desktop/cmp/grid/index.ts. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implement core ColumnChooser data flow: read target GridModel's column tree and columnState, build internal ColumnChooserRecord objects, and display them in three pin-zone grids (left, center, right) with checkbox toggles for visibility. - Define ColumnChooserRecord interface for internal grid records - Implement buildRecords() to walk GridModel columns recursively, handling both leaf Columns and ColumnGroups - Create PinSectionModel with managed internal GridModel for each pin zone - Wire reactive sync from target GridModel's columnState/columns to pin section grids - Add visibility toggle via onCellClicked handler with Icon.checkSquare/square rendering - Filter records by pin zone, excluding groups with no leaves in that zone Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Enable treeMode on each PinSectionModel's internal GridModel with isTreeColumn on the name column. - loadRecords() now accepts a showGroups parameter: in tree mode it builds a nested children structure for AG Grid tree rendering; in flat mode it loads leaf records directly with no nesting. - Added hasColumnGroups computed to ColumnChooserModel that checks whether the target grid has any ColumnGroup columns. - syncFromGridModel() now passes showGroups to loadRecords(), and a new reaction re-syncs on showGroups change. - ColumnChooser toolbar renders a tree/flat toggle button (omitted when no column groups exist). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add a text input to the ColumnChooser toolbar that filters the column list by name. A debounced reaction applies a FilterTestFn to each PinSectionModel's store whenever `filterText` changes — leaf records match on name (case-insensitive contains), group records are kept when any of their descendant leaf columns match. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Shows the chooserDescription of the currently selected column in a styled panel at the bottom of the ColumnChooser. Adds reactions to ensure only one pin section (left/center/right) can have an active selection at a time. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Enable AG Grid managed row dragging on each pin section grid so users can reorder columns by dragging rows. On drag end, the new order is read from AG Grid and pushed to the target GridModel via updateColumnState(). Also exports row drag event types from kit/ag-grid and removes the sortBy constraint that would conflict with managed row drag. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Enable dragging columns between pin zones (left, center, right) to change their pin state using AG Grid's addRowDropZone API. Each grid registers the other two as drop targets via getRowDropZoneParams. A MobX reaction watches for all three AG APIs to become available before wiring drop zones. Also adds min-height to pin sections so empty zones remain viable drop targets. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…hooser Adds a restore-defaults toolbar button that calls gridModel.restoreDefaultsAsync(). Conditionally hides left/right pin sections when they have no columns. Adds CSS class modifiers (--center / --pinned) to PinSection for differentiated styling. Updates SCSS with border, radius, background, section labels, and proper flex sizing for center vs pinned zones. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Use record.data.visible directly in checkbox renderer instead of cell value v, which is unreliable in treeMode - Add explicit renderer for name column to read record.data.name, bypassing tree column ID-based values - Add flex: 1 to grid in PinSection so it fills available space Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Sort records by sortOrder (from columnState) before loading into internal grids, both in flat mode (leaf sort) and tree mode (sort children within each group, sort root records) - Add rendererIsComplex: true to visibility checkbox column to ensure AG Grid always re-renders when data changes, fixing stale checkbox state after toggles Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AG Grid's treeData mode sorts rows by tree path, overriding our columnState-based ordering. Switch to a flat grid where: - Records are loaded in exact columnState order with a depth field - Name column renderer applies left padding based on depth for visual hierarchy - Group rows render in bold to distinguish from leaf columns - Full control over row order without AG Grid tree sorting interference Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…nChooser" This reverts commit 3b8d1b2.
This reverts commit 45a3de8.
Walk columnState (display order) instead of the column definition tree. For each leaf column, look up its parent group chain and create group instances as needed. Adjacent columns sharing the same group merge under one group node; non-adjacent columns from the same group produce separate split-group instances with unique IDs. Also adds treeStyle: none and expandLevel: -1 to internal grids, renames ColumnChooserRecord to ColumnChooserData, and fixes comments. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove PinSectionModel and PinSection — consolidate into a single grid owned directly by ColumnChooserModel. Pin zone handling will be added back later. Move all grid config (action column, tree column, sort, store) into ColumnChooserModel. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Use managed row drag (rowDragManaged) for visual feedback without any grid sort (sort was causing AG Grid to hide drag handles) - Add dedicated drag handle column separate from tree column (agGroupCellRenderer suppresses rowDrag handles) - Read new order from AG Grid on drag end via forEachNodeAfterFilterAndSort - Fix StoreRecord data access: use node.data.data.isGroup/id (StoreRecord.data contains the raw data fields, not the StoreRecord itself) - Append any excludeFromChooser columns to maintain complete columnState Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace ag-grid's managed row dragging with unmanaged mode using suppressMoveWhenRowDragging and isRowValidDropPosition. This gives full control over drop validation, shows a highlight indicator line during drag, and computes the new column order on drop rather than reading ag-grid's post-move display order. Key changes: - getValidDropPosition() validates drops, enforces lockColumnGroups constraints, prevents dropping groups inside themselves - handleRowDragEnd() computes new columnState from drop target/position, with group merging/splitting handled automatically by buildRecords() - Drag disabled while filter is active - Fix setShowGroups declaration to use `declare` so it doesn't shadow the @bindable-generated prototype method - Export IsRowValidDropPositionParams/Result and RowDropTargetPosition types from kit/ag-grid Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This reverts commit f42482f.
- IdlePanel - message to better explain rationale, full-width "I'm back" button + click handler on entire viewport. - Admin metrics - autosize all rows so start-collapsed expands cleanly, use `segmentedControl` for three state source filter
The convention was previously framed as "plain ASCII in code comments," which is broader than the actual concern. The motivating issue is em-dashes specifically - they cause encoding friction with tooling (grep, MCP) and offer no benefit in monospace code. Other Unicode characters (arrows, math symbols, accented letters) don't trip the same problems and can aid clarity, so the rule shouldn't reject them by implication. Updates `CLAUDE.md` bullet and the `Avoid Unicode in Code Comments` heading + body in `docs/coding-conventions.md` to be explicit about this distinction. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Cleans out deprecation shims whose scheduled removal has come due. Replacements have all shipped previously. - `loadModel` getters on `HoistModel`, `HoistService`, `UrlStore`, `RestFormModel` (v82) - `XH.appLoadModel` (v82) - `GridModel.applyColumnStateChanges()` (v82) - Static defaults setters on `GridModel`, `ChartModel`, `ExceptionHandler`, `FetchService` (v85) - Filter helpers `withFilterByField`/`withFilterByKey`/`replaceFilterByKey`/`withFilterByTypes` (v85) CHANGELOG and v85 upgrade notes updated; the upgrade notes carry the full removed-to-replacement table for sweeping app code.
Synchronizes JSDoc on the load/refresh APIs across `Loadable`, `LoadSupport`,
`HoistModel`, and `HoistService` so MCP/CLI consumers see consistent, complete
descriptions on every entry point (interface JSDoc does not propagate through
`implements`, and `@param` content is stripped from MCP descriptions - so the
critical "passed directly, not wrapped in a config" footgun was previously
invisible to agents).
- `LoadSpec.meta` JSDoc clarifies the always-defined guarantee (defaults to
`{}`); `LoadSpecConfig` gets interface-level JSDoc matching the `*Config`
convention
- All four entry points (`loadAsync`, `refreshAsync`, `autoRefreshAsync`,
`doLoadAsync`) now share identical wording across the four locations, with
the asymmetry footgun and the `meta` semantics in the description
- `HoistModel.doLoadAsync` / `loadAsync` and parallel methods elsewhere link
to the lifecycle doc anchor (`docs/lifecycle-models-and-services.md#loading-doloadasync`)
- Brief JSDoc added to `loadObserver`/`lastLoadRequested`/`lastLoadCompleted`/
`lastLoadException` accessors on `HoistModel` and `HoistService` (previously
surfaced empty in MCP)
- Normalize `loadAsync` parameter type to `LoadSpecConfig` on `Loadable`,
`HoistService`, and `UrlStore` (was `LoadSpec | Partial<LoadSpec>`); now
matches `HoistModel` and `LoadSupport`
- `core/README.md` Load Support section: new paragraph documenting `LoadSpec.meta`
with caller/consumer example, plus a callout on the calling-shape asymmetry
between `loadAsync` and `refreshAsync`/`autoRefreshAsync`
The v85 changelog, upgrade notes, and the version-compatibility matrix were pre-populated for an anticipated hoist-core 38.1 patch release that never shipped — hoist-core went 38.0 → 39.0 directly. v39 is the right "recommended pairing" for v85's tracing changes (both releases drop alwaysSampleErrors and add name-based sampleRules), and v85's hard minimum stays at 38.0. - CHANGELOG: "hoist-core >= 38.1 is recommended" → "hoist-core >= 39.0 is recommended" - docs/upgrade-notes/v85-upgrade-notes.md: same swap in Prerequisites - docs/version-compatibility.md: v85 row Recommended/Max Tested 38.1 → 39.0; replaced phantom 38.1 entry in the Reverse Lookup table with a real 39.0 row noting the v39 features and that there's no hard hoist-react bump from 38.0 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Hoist P/R Checklist ------------------- **Pull request authors:** Review and check off the below. Items that do not apply can also be checked off to indicate they have been considered. If unclear if a step is relevant, please leave unchecked and note in comments. - [x] Caught up with `develop` branch as of last change. - [x] Added CHANGELOG entry, or determined not required. - [x] Reviewed for breaking changes, added `breaking-change` label + CHANGELOG if so. - [x] Updated doc comments / prop-types, or determined not required. - [x] Reviewed and tested on Mobile, or determined not required. - [X] Created Toolbox branch / PR, or determined not required. **If your change is still a WIP**, please use the "Create draft pull request" option in the split button below to indicate it is not ready yet for a final review. > **Pull request reviewers:** when merging this P/R, please consider using a *squash commit* to > collapse multiple intermediate commits into a single commit representing the overall feature > change. This helps keep the commit log clean and easy to scan across releases. PRs containing a > single commit should be *rebased* when possible. --------- Co-authored-by: David Ryan Hall <david.ryan.hall@gmail.com> Co-authored-by: petedarinzo <peter.darinzo@gmail.com> Co-authored-by: lbwexler <lbwexler@xh.io>
#4116 placed its entries under v80 by mistake. Moved the breaking-change and library bullets into the existing v86.0.0-SNAPSHOT sections and normalized dep versions to major.minor.
- Surface the published version (linked to its npm page) plus pack stats (file count, tarball size, unpacked size) on each run's summary page. - Stats are best-effort: the version line always renders, the stats table is skipped silently if packing fails, and `continue-on-error` ensures a summary glitch can never fail an otherwise-good publish. - Clean up `npm publish` tag handling in Deploy Release to use a bash array (`TAG_ARGS`) instead of unquoted word-splitting - identical behavior, lints cleanly under actionlint/shellcheck (SC2086). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
`docs/planning/` and `docs/archive/` are dev-internal (documentation roadmap, trace artifacts, historical pre-v56 changelog) and are not part of the MCP doc registry served by the shipped doc tools, so they offer nothing to consumers. Dropping them removes 5 files (~333 KB) from the npm tarball. Note: `build/types/**/*.d.ts` is intentionally retained - it is the declaration output that apps referencing `@xh/hoist` as a composite TS project resolve against, which isolates Hoist source from app-level strict compiler rules. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Reorganize git/VCS guidance into a dedicated `## Git Workflow` section: - Add high-level gatekeeping rules: branching, committing, and pushing all require an explicit ask. Pushing is never done unless explicitly requested. Committing is context-dependent - default to asking, except in orchestrated multi-agent work on a feature branch where the go-ahead comes from the plan. - Add branch-creation guidance: default to `git switch -c` from current HEAD; require `--no-track` when specifying a base ref to avoid inheriting an unintended upstream. - Move the existing feature-branch workflow and commit/PR/comment formatting guidance under this section as subsections (the latter relocated out of "Code Style"). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The JDK version is set per-application (Hoist Core supports a range - 17, 21, 25), not fixed framework-wide, and is increasingly 21 or a 21/25 split. Refresh the docs accordingly: - `development-environment.md`: rework the JDK prerequisite to delegate the version to the application's `majorJavaVersion` in `gradle.properties` (consumed by the Gradle toolchain in `build.gradle`). Call out the three places the version must agree - local JDK, `gradle.properties`, and the `xhio/xh-tomcat` container image tag - and note Temurin as the Actions build-runner distribution. Drop the stale JetBrains-distro / hot-reloading guidance. - `build-and-deploy-app.md`: update the example Tomcat image tag from `next-jdk17` to the current `next-tc10-jdk21` format. - `version-compatibility.md`: soften the historical "Java 17" era note to "Java 17+". Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- We've been adjusting to Claude-enhanced development workflow for the past few months now, and these attributions are now more noise than a useful signal. - Devs are assumed to be using Claude and other agentic assistance as a matter of course (just like we use IDEs) but are ultimately the humans "authoring" the change.
* Take new major version of commander - new nodejs floor only, no other changes should be required for our usage in the docs/ts CLIs. * Run `yarn upgrade`. * Clean up Libraries section of our CHANGELOG to get back to our standard.
Bumps [anthropics/claude-code-action](https://github.com/anthropics/claude-code-action) from 1.0.132 to 1.0.133. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/anthropics/claude-code-action/releases">anthropics/claude-code-action's releases</a>.</em></p> <blockquote> <h2>v1.0.133</h2> <h2>What's Changed</h2> <ul> <li>Use workload identity federation for Claude auth in CI workflows by <a href="https://github.com/ashwin-ant"><code>@ashwin-ant</code></a> in <a href="https://redirect.github.com/anthropics/claude-code-action/pull/1344">anthropics/claude-code-action#1344</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/anthropics/claude-code-action/compare/v1...v1.0.133">https://github.com/anthropics/claude-code-action/compare/v1...v1.0.133</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/anthropics/claude-code-action/commit/787c5a0ce96a9a6cfb050ea0c8f4c05f2447c251"><code>787c5a0</code></a> chore: bump Claude Code to 2.1.150 and Agent SDK to 0.3.150</li> <li><a href="https://github.com/anthropics/claude-code-action/commit/4257c8e0591343e1130ae550a49ae34dd17c7060"><code>4257c8e</code></a> Use workload identity federation for Claude auth in CI workflows (<a href="https://redirect.github.com/anthropics/claude-code-action/issues/1344">#1344</a>)</li> <li>See full diff in <a href="https://github.com/anthropics/claude-code-action/compare/bbfaf8e1ffe3e688f7ab65ceee78de241e24a238...787c5a0ce96a9a6cfb050ea0c8f4c05f2447c251">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [xh/hoist-dev-utils](https://github.com/xh/hoist-dev-utils) from 12.1.1 to 12.2.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/xh/hoist-dev-utils/releases">xh/hoist-dev-utils's releases</a>.</em></p> <blockquote> <h2>v12.2.0</h2> <h2>What's Changed</h2> <ul> <li>Enable webpack HMR for CSS/SCSS in dev by <a href="https://github.com/cnrudd"><code>@cnrudd</code></a> in <a href="https://redirect.github.com/xh/hoist-dev-utils/pull/68">xh/hoist-dev-utils#68</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/xh/hoist-dev-utils/compare/v12.1.1...v12.2.0">https://github.com/xh/hoist-dev-utils/compare/v12.1.1...v12.2.0</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/xh/hoist-dev-utils/blob/develop/CHANGELOG.md">xh/hoist-dev-utils's changelog</a>.</em></p> <blockquote> <h1>Changelog</h1> <h2>12.2.0 - 2026-05-26</h2> <h3>🎁 New Features</h3> <ul> <li>Enabled webpack Hot Module Replacement for CSS/SCSS in development. Style edits now apply in place without a full page reload, preserving scroll position and in-app state. JS/TS edits continue to trigger a full reload.</li> </ul> <h2>v12.1.1 - 2026-05-19</h2> <h3>⚙️ Technical</h3> <ul> <li>Removed <code>html-webpack-tags-plugin</code> dependency. It was used in a single spot to inject the <code>preflight.js</code> script tag and has been unmaintained since 2021, pulling in deprecated transitive deps (<code>glob@7</code>, <code>inflight</code>) that surfaced as warnings on install. The preflight tag is now emitted directly from the <code>static/index.html</code> template, with a <code>preflightHash</code> template parameter (sourced from the webpack compilation hash) preserving cache-busting.</li> </ul> <h3>📚 Libraries</h3> <ul> <li>html-webpack-tags-plugin <code>3.0 → removed</code></li> <li>terser-webpack-plugin <code>5.5 → 5.6</code></li> </ul> <h2>v12.1.0 - 2026-04-29</h2> <h3>🎁 New Features</h3> <ul> <li>Replaced the animated PNG on the static loader page with an inline SVG that visually matches Hoist React's in-app <code>Spinner</code> component (FA <code>spinner-third</code> with a CSS rotation). Eliminates a style discontinuity at the JS-bundle handoff.</li> <li>New <code>preloadSpinnerColor</code> config controls the stroke color of the loader spinner. Defaults to <code>[#888](https://github.com/xh/hoist-dev-utils/issues/888)</code>. Pairs with the existing <code>preloadBackgroundColor</code>.</li> </ul> <h3>📚 Libraries</h3> <ul> <li>terser-webpack-plugin <code>5.4 → 5.5</code>we u</li> </ul> <h2>v12.0.1 - 2026-04-18</h2> <h3>📚 Libraries</h3> <ul> <li>autoprefixer <code>10.4 → 10.5</code></li> <li>lodash <code>4.17 → 4.x (allows update to 4.18 w/security fixes and future)</code></li> <li>sass-embedded <code>1.98 → 1.99</code></li> <li>webpack <code>5.105 → 5.106</code></li> <li>webpack-bundle-analyzer <code>5.2 → 5.3</code></li> </ul> <h2>v12.0.0 - 2026-03-31</h2> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/xh/hoist-dev-utils/commit/7859ec783cee69e3f26cd81cb30cd5cab5bc44b6"><code>7859ec7</code></a> Update changelog for release</li> <li><a href="https://github.com/xh/hoist-dev-utils/commit/8dd69852a6ef8703a20949e628cfe669ed691760"><code>8dd6985</code></a> Enable webpack HMR for CSS/SCSS in dev (<a href="https://redirect.github.com/xh/hoist-dev-utils/issues/68">#68</a>)</li> <li>See full diff in <a href="https://github.com/xh/hoist-dev-utils/compare/899c39c72b4154a3bef180e1939755a1672036c5...7859ec783cee69e3f26cd81cb30cd5cab5bc44b6">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…unction (#4350) ## Summary Two related additions to the persistence layer: **1. `pathPrefix` on `PersistOptions`** — an inheritable, dot-delimited prefix that prepends to the resolved `path` and concatenates (rather than replaces) when merged through parent `persistWith` chains. Resolves a long-standing gap where setting `path` on a parent model's `persistWith` would silently overwrite the natural per-property/per-aspect path used by `@persist`, `markPersist`, `GridModel`, `PanelModel`, and other consumers, causing collisions when multiple persisted targets shared the same parent provider. **2. New exported `persistOptions()` function** — public replacement for the static `PersistenceProvider.mergePersistOptions` method. Same merge semantics (later arguments win, type-related keys swap together, `pathPrefix` concatenates), but lives next to the `PersistOptions` interface in `core/persist/PersistOptions.ts` and tolerates `null`/`undefined` arguments to skip them. The old static method now emits a runtime `apiDeprecated` warning and will be removed in v87. Internal call sites in hoist-react (`HoistBase`, `@persist`, `GridModel`/`ZoneGridModel`/`TabContainerModel`/`GroupingChooserModel`/`FilterChooserModel`/`CardModel`/`FormModel` init-persist) have been migrated to the new function and the spread-into-`PersistOptions` idiom (`{...persistWith, path: 'foo'}`) eliminated in favor of `persistOptions(persistWith, {path: 'foo'})`. This also surfaced and fixed several spots where `pathPrefix` would have been silently dropped by plain spread. See [`docs/persistence.md`](docs/persistence.md#configuration-inheritance) for the inheritance rules and recommended child-model patterns. ## Hoist P/R Checklist - [x] Caught up with `develop` branch as of last change. - [x] Added CHANGELOG entry, or determined not required. - [x] Reviewed for breaking changes, added `breaking-change` label + CHANGELOG if so. (No breaking changes — `mergePersistOptions` still works, just deprecated.) - [x] Updated doc comments / prop-types, or determined not required. (Updated `docs/persistence.md` and field JSDoc.) - [x] Reviewed and tested on Mobile, or determined not required. (Framework-level change in `core/persist`; no platform-specific behavior.) - [x] Created Toolbox branch / PR, or determined not required. (Branch `feat/persistPathPrefix` migrates Toolbox usages to `persistOptions()` — no PR yet.) ## Test plan - [x] Smoke-tested in Toolbox (inlineHoist mode): app boots, persisted state restores correctly, no console errors/warnings/deprecation messages across multiple pages. - [x] `tsc --noEmit` clean in both hoist-react and Toolbox. - [ ] Verify existing `markPersist` / `@persist` flows on a model without `persistWith` still work. - [ ] Verify a parent model with `persistWith: {prefKey, pathPrefix: 'reports'}` correctly nests `@persist` properties under `reports.<propertyName>`. - [ ] Verify a `GridModel` inheriting that `persistWith` resolves columns/sort/grouping to `reports.grid.columns` etc. - [ ] Verify two sibling `GridModel`s with distinct `path` values do not collide. - [ ] Verify a child custom `HoistModel` constructed via `persistOptions(this.persistWith, {pathPrefix: 'detail'})` resolves to `reports.detail.*`. --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: Lee Wexler <lbwexler@xh.io>
# Conflicts: # CHANGELOG.md # appcontainer/AppContainerModel.ts # cmp/viewmanager/DataAccess.ts # core/HoistBase.ts # core/HoistService.ts # core/Span.ts # core/index.ts # core/load/LoadSupport.ts # core/load/Loadable.ts # core/model/HoistModel.ts # core/runner/RunContext.ts # core/runner/Runner.ts # core/runner/index.ts # core/types/Interfaces.ts # docs/version-compatibility.md # mcp/server.ts # svc/ConfigService.ts # svc/EnvironmentService.ts # svc/FetchService.ts # svc/IdentityService.ts # svc/PrefService.ts # svc/README.md # svc/TraceService.ts # svc/TrackService.ts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Hoist P/R Checklist
Pull request authors: Review and check off the below. Items that do not apply can also be
checked off to indicate they have been considered. If unclear if a step is relevant, please leave
unchecked and note in comments.
developbranch as of last change.breaking-changelabel + CHANGELOG if so.If your change is still a WIP, please use the "Create draft pull request" option in the split
button below to indicate it is not ready yet for a final review.