- Hoist v87 updates to React 19. Applications may require minor adjustments and should be
carefully tested.
- Apply any type adjustments needed to meet React 19's stricter typing. See https://react.dev/blog/2024/04/25/react-19-upgrade-guide#typescript-changes for more info.
- Both desktop and mobile
Popoverimplementations now render on Floating UI, rather than Popper.js, which is not React-19 compatible. This changes the underlying DOM and CSS classes for popovers. Test popover-based UI (menus, selects, date inputs, filter choosers) and adjust any custom styling that targeted Blueprint or Popper css classes (e.g.bp6-minimal). - The
popperOptionspopper.jsescape-hatch prop has been removed from the mobilePopover.
- Moved both desktop and mobile popover implementations off the deprecated, React-18-capped Popper.js
onto Floating UI for React 19 compatibility. The hoist
Popovercomponents (mobile and desktop) have been updated so no app call-site changes are required. - Applied type adjustments to meet React 19's stricter
@types/reacttyping.
- react
18.2 β 19.2
- Added
PrefService.isSet()to report whether the current user has an explicit value on file for a preference vs. receiving its server-side default - a distinction that cannot be reliably inferred by comparing the value to the default. Requires a hoist-core version that emits the backingisSetflag; against older servers all prefs report as unset.
PrefService.unset()now performs a true server-side unset, clearing the user's stored value so the preference reverts to its (possibly changing) default andisSet()reportsfalse. Previously it persisted the current default as an explicit user value. Falls back to the legacy behavior against hoist-core versions that predate thexh/unsetPrefsendpoint.- Fixed
FilterChooserpopover mode to render an opaque background when expanded.
Selectnow accepts agenerateOptionFnprop to resolve an option for a selected value that is not present in the current options list (e.g. withqueryFn-based selects or readonly forms), ensuring such values render with their proper label rather than falling back to the raw value.SegmentedControloptions (desktop and mobile) now accept atestId, emitted on the option's rendered button asdata-testidfor E2E targeting. If an option omits its owntestIdbut the control has one, an id is auto-derived as${controlTestId}-${value}- restoring parity with the legacyButtonGroupInputtest-hook pattern for apps migrating between the two.
- Fixed grid columns configured as
hiddenbecoming visible after being grouped and then ungrouped.GridModelnow re-asserts each column's configured visibility whenevergroupBychanges, keeping AG Grid's column state in sync withcolumnState. - Fixed
StoreFilterFieldand grid Find so an active quick-filter or find query no longer returns different results when the grid'sgroupBychanges. - Fixed inline grid cell editors to reliably commit their value when editing ends, including popup
editors (e.g.
textAreaEditor) within a dialog, which previously dropped edits on Enter or click-away. - Fixed
Selectto correctly handle non-primitive (object) values: selected-option matching and async query de-duplication now use deep equality, so object values no longer render as[object Object]or collide with one another. - Hardened the grid column filter's Custom tab against filters it previously mishandled - multi-value clauses are now expanded into editable rows and recombined on commit, and filters it cannot represent are left untouched rather than corrupted.
- Fixed
FilterChooserpopover mode (formerlyPopoverFilterChooser) so its collapsed control no longer disappears when opened - it now always occupies its place in the layout, so surrounding elements no longer shift. Its clear and favorites controls also respond to a single click rather than requiring the popover to be opened first. This mode is now enabled more naturally via a new optionfilterChooser({popover: true}), deprecatingPopoverFilterChooser, which remains as a thin alias. - Fixed "not a valid MIME type" console warnings from
FileChooser. Accepted extensions are now passed under a dummy MIME type key, silencing the warnings while continuing to filter selected files by extension.
- Retyped
GridModel.colChooserModelas the new cross-platformIColChooserModelinterface, replacing the bareHoistModeltype and exposingisOpen,open(), andclose()directly. - Added the exported
HoistRoutetype - Router5'sRouteextended with Hoist'somitkey - and retypedHoistAppModel.getRoutes()to return it, so declarative route exclusion (e.g.omit: !XH.getUser().isHoistAdmin) now type-checks without a cast.
- Fixed the MCP server and
hoist-tsCLI TypeScript symbol tools (search,symbol,members) returning no results on Windows, where a path-separator mismatch left the symbol index empty. Path handling is now normalized so the developer tools work on Windows as well as macOS/Linux.
- @auth0/auth0-spa-js
2.21 β 2.23 - @azure/msal-browser
5.14 β 5.16 - swiper
12.1 -> 14.0
CodeInput/JsonInputnow auto-format content for display via their configuredformatter, controlled by a newautoFormatprop. On editable inputs, content is tidied automatically on blur (never mid-edit) - users get clean, consistently-formatted JSON without reaching for the format button. Forreadonlyinputs it defaults to true, so applications can bind directly to raw source values and drop their pre-formatting logic, simplifying call sites substantially.- Grid column filter specs now support a
sortValueconfig, letting the Values tab of the filter dialog sort its entries the same way the underlying grid column sorts them. When not provided, the column's ownsortValueis used. GridModel.levelLabelsnow accepts a partial array covering only the top levels of a tree or grouped grid. The "Expand to..." menu andExpandToLevelButtonoffer one entry per labelled level, so deeper, unlabelled levels (e.g. system-managed) are no longer required and are omitted as expand-to targets - previously a too-short array disabled the feature entirely.- Added a
losslessoption tofmtQuantityto compact values to millions / billions units only when doing so loses no precision, rendering the full value otherwise (e.g.7,100,100stays7,100,100rather than collapsing to7.10m).
- Fixed grid
NumberEditorto allow starting an edit by typing-,+, or.(e.g. to enter a negative or decimal value), while reliably rejecting other non-numeric keypresses. fmtNumbernow treats aprecisionofnullas full, unrestricted precision rather than'auto', aligning aNumberInputwithprecision: nullso its blurred display matches its focused and committed (full-precision) value.- Fixed inline grid editing not ending when clicking empty grid space to the right of the last column or below the last row - such clicks now commit the active edit.
- Fixed
Icon.placeholder()to render with the correct width. CheckboxButtonno longer leaksHoistInputPropsinto underlying HTML<button>element.- Fixed
Select(andSelectEditor) dropdown menu sizing: windowed menus now auto-size to their option labels instead of the control/cell width, and an explicitmenuWidthis respected rather than overridden by content auto-sizing.
GridFilterFieldSpec.rendereris now typed as a pure value transform (GridFilterRenderer), rather than aColumnRenderer. This more accurately represents the existing run-time limitation that a complex column renderer would throw.
- Vertical (left/right)
TabContainerswitchers now render a modern rounded-pill treatment by default, customizable via new--xh-tab-switcher-vertical-*CSS variables.
- Added a mobile
SegmentedControlinput - the mobile counterpart to the desktop component, with a matchingoptions-driven API for selecting a single value from a set of mutually exclusive choices. Built on Hoist's mobileButton(no Blueprint dependency).- The shared
SegmentedControlOptionoption types now export from@xh/hoist/cmp/inputrather than the desktopSegmentedControlmodule; update any direct type imports.
- The shared
- Added a
leftIconprop to mobileTextInput. FilterChooserand grid column filters on a timestamp (date) field now filter by calendar day, comparing against full-day bounds for range and equality operators rather than midnight - e.g.> 2023-05-31excludes the 31st and= 2023-05-31matches any time that day. Filter specs now default adatesource field tofieldType: 'localDate'; setfieldType: 'date'for exact timestamps. Applications using workarounds to provide similar behavior may be able to unwind that behavior and rely on Hoist default behavior.
- Fixed the "Is blank" / "Is not blank" grid column filters for
tags-typed fields - empty tag arrays now correctly match "Is blank", and such filters are edited on the Custom tab rather than producing a phantom blank entry in the Values list. - Fixed an issue where
Gridcolumn headers could fall out of sync with body content during horizontal scrolling when bothenableFullWidthScrollanduseVirtualColumnswere enabled. - Updated
DynamicTabSwitcherto properly applytestIdpassed down byTabContainer. - Ensure publication of
router5-plugin-browserTS module augmentation. - Set an explicit
%unit on theflex-basis: 0ofTabContainer's flex shorthand to ensure that the0is not interpreted as a0pxbasis and that the container sizes as expected.β οΈ Apps that upgrade tohoist-dev-utils v13.xand useflex: 1 1 0orflex-basis: 0should verify that their flex layouts continue to work as expected and add an explicit unit if not (e.g.flex: 1 1 0%orflex-basis: 0%).
JsonBlobServiceandHoistAuthModelnow accept an optionalCallContextLikeargument on all of their public methods, allowing callers to nest their fetches within an existing trace.
- Mobile
Buttonnow defaults to a more touch-friendly height (40px, up from 28px) and rounder corners for buttons in body content. Toolbar buttons derive their height from the toolbar size so a single token drives both, landing slightly taller than before (34px, up from 28px).SegmentedControladopts the same standard height for a consistent control row.β οΈ Mobile buttons outside toolbars are now taller - verify body / form / panel layouts that pair tightly with button dimensions.
- Mobile tab content (
TabContainer) now takes the themed app background, so content reads correctly in dark mode rather than showing through to Onsen's light default page background. - Applied the active theme's
color-schemeontohtmland added atheme-colormeta tag matching the active theme's app-bar color, so browser chrome and overscroll / safe-area regions might better match the theme.
- @azure/msal-browser
5.13 β 5.14
- Fixed a circular import introduced in v86 that caused problems for apps using
@ComputeOnce. - Fixed a regression to favorites icon size for
FilterChooser.
TrackService,PrefService, andTraceServicenow flush their pending entries reliably when the page is hidden or unloaded, reacting toXH.pageStateand issuing the flush viafetch({keepalive: true})(replacing the less reliablebeforeunload+ normal-fetch approach).
- @azure/msal-browser
5.11 β 5.13 - mobx
6.15 β 6.16
See docs/upgrade-notes/v86-upgrade-notes.md for
detailed, step-by-step upgrade instructions with before/after code examples.
- Deprecated
HoistBase.withSpan()and theFetchOptions.span/loadSpecfields, in favor of theRunnerchain (runner().span()) and the newCallContextargument to fetch methods (see below for more details). Both log a warning and are scheduled for removal in v88. - Upgraded
CodeInputto CodeMirror v6 (upgraded from v5).- Removed
editorPropsprop - most use cases now supported via first-classCodeInputprops such asreadonly,language,lineNumbers, andlineWrapping. - Replaced the
modeprop withlanguage. See language-data for valid language strings (aliases and names are both accepted).
- Removed
- Redesigned
FileChooser, moving configuration from component props to theFileChooserModelconstructor config and adding a fully customizable display API.- Options such as
acceptand the file-size limits are now set onFileChooserModelrather than asFileChooserprops. - Renamed
maxSize/minSizetomaxFileSize/minFileSize. - Removed
enableMulti/enableAddMulti- usemaxFiles(set to1for single-file selection). - Removed
targetTextandshowFileGrid- customize via the newemptyDisplay/fileDisplaycontent props. The defaultfileDisplayis a file grid, or a compact card with replace / remove actions whenmaxFilesis 1. - Removed the
onFilesChange()model hook - react to the observablefilesarray or use the newonFileAccepted/onFileRejectedcallbacks.
- Options such as
DashContainerModelno longer persists per-viewiconin its layout state, aligning withDashCanvasModel. Icons now always come from theDashViewSpec. Apps that setDashViewModel.iconat runtime still see it render, but the override is no longer saved.- Removed the
serializeIcon()/deserializeIcon()helpers from@xh/hoist/icon, which existed only to support the above. - Replaced the mobile
DateInput's picker with the browser's native<input type="date">, dropping the abandonedreact-datesdependency. Removed the obsoleteformatString,initialMonth,placeholder, andsingleDatePickerPropsprops fromDateInputProps.
FileChoosergained extensive new capabilities as part of its redesign: amaxFileslimit, fully customizableemptyDisplay/fileDisplaycontent,onFileAccepted/onFileRejectedcallbacks, configurable rejection toasts,maskOnDrag/maskOnDisabledoptions, and a programmaticopenFileBrowser()method. In multi-file mode a persistent drop target sits alongside the grid - placement set via thedropTargetPlacementprop (left,top, orhidden) - so users can keep adding files until the limit is reached.- Added the
RunnerAPI - a fluent builder (viaHoistBase.runner()) that composes spanning, logging, activity tracking, metrics, and task-linking around async work and fetch calls. It threads a sharedCallContext(trace + load state) across call boundaries, which fetch methods now accept as an optional argument. - Added a client-side
MetricsService(XH.metricsService) for recording timers and counters, batched to the server's Micrometer registry. Recording requireshoist-core >= 40.0.1. - Trace spans can now chain onto a remote
traceparentreceived off-channel (e.g. a WebSocket, SSE, or queue message), in addition to a local parent span. - Desktop
DateInputnow supports acommitOnChangeprop (defaulttrue). Set tofalseto defer parsing and value commit until blur, Enter, or picker selection. Useful when configuringparseStringssuch that one format is a prefix of another (e.g.MM/DD/YYandMM/DD/YYYY), where the eager default would reformat the user's text mid-typing. SegmentedControlnow supports a per-optionintent, with an option's own intent taking precedence over the control-level default. Its control-levelintentprop was widened from'none' | 'primary'to'none' | Intent, now acceptingsuccess/warning/dangeras well (a backward-compatible widening).- Added
pathPrefixtoPersistOptions- an inheritable prefix prepended to the resolvedpath, concatenated throughpersistOptions(). Enables hierarchical namespacing of persistence so a parent model can scope all descendants (@persistproperties,markPersistcalls, childGridModel/PanelModel/ etc.) under a single shared key in one backing store. Seedocs/persistence.md. - Added exported
persistOptions()function for merging one or morePersistOptionsobjects, with later arguments overriding earlier ones. Replaces the now-deprecatedPersistenceProvider.mergePersistOptions.
- Updated the chart right-to-left "zoom out" gesture to activate for charts configured with the
modern
chart.zooming.typeHighcharts option, in addition to the legacychart.zoomType. - Improved desktop
Selectto no longer hijackHome/Endkeys, allowing native caret movement in the input. See #3930. - Fixed
GridFiltercolumn header values tab crashing with a duplicate-ID error when re-opened for atags-typed field with an active filter. - Fixed
RelativeTimestampignoring an explicitly passedmodelprop when resolving itsbindsource - the prop is now honored, falling back to the context model only when unset. - Fixed
UniqueAggregatorpermanently cachingnullon grouped cube rows after a diverge β reconverge sequence of child updates; the aggregator now falls back to a sibling re-scan when the cache could be transitioning. - Fixed a set of view title-handling bugs in the Dash components:
DashCanvasModel.loadState()wiped titles omitted from state entries,DashContainerModelignored incoming titles when reloading state over existing views (e.g. failing to reset renames onrestoreDefaultsAsync()), andDashContainertab headers lost renames after a drag. Omitted titles now reset to theDashViewSpecdefault in both components. - Fixed
DashCanvasModelnot publishing layout-only state changes - e.g.restoreDefaults()after a user had only moved or resized widgets - leaving persisted state stale. - Fixed
GridModel.beginEditAsync()ignoring a specifiedrecordwith the id0. - Fixed the
DashCanvasview menu showing aReplaceoption with an empty fly-out when no view specs remain available - the option is now hidden, matching the handling ofAdd.
- Added a
hoist-read-docMCP tool that reads a full document by exact ID, giving MCP parity with thehoist-docs readCLI andhoist-core'shoist-core-read-doc. hoist-read-doc, thehoist://docs/{id}resource, andhoist-docs readnow tolerate common doc-ID shortenings (e.g.grid,core,v85), resolving to the canonical ID or suggesting candidates when ambiguous.- Added a
hoist-docs pingCLI subcommand mirroring thehoist-pingMCP tool; both now report the indexed@xh/hoistlibrary version. - MCP/CLI symbol JSDoc is no longer truncated at the first
@-prefixed line inside a fenced code block (e.g. an@observable.refin a usage example), recovering example code, "SEE ALSO" lists, and trailing prose that were previously dropped.
- @azure/msal-browser
4.29 β 5.11- Major upgrade with broad architectural changes. Hoist no longer hard-codes
system.iframeHashTimeout; apps that override MSALsystem/cache/authoptions viamsalClientOptionsonMsalClientmust review the v4 β v5 migration guide for renamed or removed keys.
- Major upgrade with broad architectural changes. Hoist no longer hard-codes
- @codemirror
5.x β 6.x- Replaces the v5 monolithic
codemirrorpackage, with several new direct dependencies now managed by hoist-react to maintain all supported functionality. - See breaking change note above for
CodeInputprop changes.
- Replaces the v5 monolithic
- @seznam/compose-react-refs
removed- Replaced by a Hoist-owned
composeRefsutility exported from@xh/hoist/utils/react. Behavior unchanged.
- Replaced by a Hoist-owned
- @xh/hoist-dev-utils
12.x β 13.x - ag-grid
34.x β 35.x.- Apps must bump their
ag-grid-community,ag-grid-enterprise, andag-grid-reactdependencies to35.x. See the AG Grid v35 upgrade guide; no Hoist API changes required.
- Apps must bump their
- clipboard-copy
removed- Replaced by a Hoist-owned
copyToClipboardutility exported from@xh/hoist/utils/js. Behavior unchanged (async Clipboard API withexecCommandfallback).
- Replaced by a Hoist-owned
- debounce-promise
removed- Replaced by a Hoist-owned
debouncePromiseutility exported from@xh/hoist/promise. Behavior unchanged for the trailing-edge / shared-promise usage Hoist relies on; leading-edge and accumulate modes were not used and have been omitted.
- Replaced by a Hoist-owned
- golden-layout
removed- Forked the unmaintained
golden-layout1.5.9 intokit/golden-layout/, removing unused code, porting jQuery usage to native DOM, and folding existing monkey-patches into the source. See #4336.
- Forked the unmaintained
- jquery
removed- Was included due to golden-layouts consumer, which now no longer needs the library.
- Apps with previously required
"jquery": "3.x"pin in package.jsonresolutionsshould now be able to remove that pin.
- react-beautiful-dnd
removed- Replaced by
@hello-pangea/dnd18.0, a maintained, React 19-ready, drop-in fork. The now-archivedreact-beautiful-dndwill receive no further updates. No Hoist or app API changes - drag-and-drop behavior is unchanged.
- Replaced by
- react-dates
removed- The mobile
DateInputnow uses the browser's native<input type="date">. See the breaking change note above.
- The mobile
- react-dropzone
10.x β 15.x- See the
FileChooserredesign note under Breaking Changes above.
- See the
- react-select
4.3 β 5.10 - react-windowed-select
3.1 β 5.2 - semver
7.7 β 7.8
See docs/upgrade-notes/v85-upgrade-notes.md for
detailed, step-by-step upgrade instructions with before/after code examples.
Note that hoist-core >= 39.0 is recommended (not required) to pair with the span-sampling and
app-load span changes in this release.
XH.installServicesAsync()no longer accepts the spread-args form. Callers must pass an array of service classes plus the current phase'sInitContext:The// before await XH.installServicesAsync(MyServiceA, MyServiceB); // after await XH.installServicesAsync([MyServiceA, MyServiceB], ctx);
ctxis the one passed to yourAppModel.initAsync(ctx)override. Forwarding it ensures service-init spans nest under the current phase's root span (e.g.xh.client.appInitfor app-level services,xh.client.hoistInitfor Hoist-internal services).HoistService.initAsync()andHoistAppModel.initAsync()signatures now take anInitContextargument. Override signatures must be updated toinitAsync(ctx: InitContext)- the upgrade notes cover the mechanical changes and recommended ways to forwardctx.spaninto init-time fetch and async work.HoistBase.withSpan()/withSpanAsync()have been removed in favor of the newHoistBase.span()builder. Replacethis.withSpanAsync(cfg, fn)withthis.span(cfg).run(fn). The underlyingXH.traceService.withSpan()API remains for advanced use - now a single async method (the prior syncwithSpanand asyncwithSpanAsynconTraceServicehave been merged).TraceServiceno longer supports thealwaysSampleErrorsflag, which was deemed inappropriate for head-based sampling. This change is consistent with a similar update in hoist-core v39. Apps requiring full visibility into error spans for a particular set of errors should ensure they are sampled via the existing rules.- Removed several APIs that had been deprecated for one or more prior versions - including
loadModelgetters across model/service/store classes, static defaults setters onGridModel/ChartModel/ExceptionHandler/FetchService, and the legacywithFilterByField/withFilterByKey/replaceFilterByKey/withFilterByTypesfilter helpers. See the v85 upgrade notes for the full list and replacements.
- Added
Span.setTag()/setTags(). Span passed to spanned functions is now non-nullable, matching the server-side API. LoadSpecConfig.spanlets callers seed the parent trace context for a managed load via loadAsync(). This span will be made available on the LoadSpec and automatically picked up by FetchService for properly nesting fetch calls.HoistService.initAsync()andHoistAppModel.initAsync()now receive anInitContextargument carrying the current phase'sspan, so service init spans can nest under the caller's span. Pass it along to anyloadAsync()calls viaLoadSpecConfig.spanto continue the chain.sampleRulesinxhTraceConfignow support matching against the span's name via the reservednamekey (same syntax as tag-value patterns). Matches addition in hoist-core.- Added the
user.nametag to all spans. Newxh.impersonatingtag on spans shows impersonated user, if any. - Improved, properly nested spans for app loading:
xh.client.load,xh.client.hoistInit, andxh.client.appInit. - Added
Pickerprops for richer multi-select trigger rendering:multiSelectButtonStyle: 'values'shows comma-separated selected labels (overflow-ellipsed) instead of the default summary count, andmultiSelectShowCountadds a small selection-count badge to the left of the text. Both are app-wide overridable viaPicker.defaults.
- Updated
HoistBase.withSpanto auto-populatecallerwiththis, ensuring emitted spans correctly stampcode.namespace. - Fixes to built-in fetch CLIENT span: install
http.response.status_codeandurl.fulltags. - Fixed downstream app type-check failures on hoist-react asset imports by adding triple-slash
references to
assets.d.tsfrom the files that import PNGs. The ambient declarations were not reachable from consumer tsconfigs with narrowerincludepatterns. - Upgraded Swiper
11 β 12to resolve CVE-2026-27212, a critical prototype pollution vulnerability inSwiper.extendDefaults(). Apps consuming Swiper's own SCSS should update imports fromswiper/scsstoswiper/css- Swiper 12 ships CSS sources only.
- MCP/CLI symbol and member search now support multi-word queries combining class and member names
(e.g.
"StoreRecord raw"). - Expanded member-index coverage to every exported class and every exported
*Configinterface. - Added an
@mcpHintJSDoc tag for attaching short hints to indexed classes/interfaces. - All MCP tools now expose structured output via
outputSchema/structuredContent; matching CLI subcommands gained a--jsonflag. hoist-get-memberssurfaces@paramand@returnsJSDoc, including viaimplementsfallback.- Added a disk-persisted index cache at
node_modules/.cache/hoist-mcp/, dropping cold CLI search invocations from multi-second builds to sub-second loads.HOIST_MCP_NO_CACHE=1to bypass. - Added MCP server
instructionsand disambiguating language to tool descriptions. - Fixed a member-index collision where same-named owners clobbered each other's
memberNames.
- Improvements to the naming and tagging of hoist-created spans for consistency with hoist-core and easier tag-based sampling.
- Suppressed
Trace IDdisplay in exception dialogs/toasts for routine or unsampled exceptions.
- swiper
11.2 β 12.1 - @onsenui/fastclick
removed - @popperjs/core
removed - react-transition-group
removed - resize-observer-polyfill
removed
Removed dependencies were obsolete or no longer used by hoist-react internals. No app impact expected - none were part of the public API surface. Apps that imported these directly (relying on them as transitive hoist-react dependencies) must add their own direct dependencies.
- Fixed downstream app type-check failures on hoist-react asset imports by adding triple-slash
references to
assets.d.tsfrom the files that import PNGs. The ambient declarations were not reachable from consumer tsconfigs with narrowerincludepatterns. Backport of the fix originally shipped in v85.0.0.
- Fixed an unrecoverable crash when calling
XH.prompt()(and any otherFormFieldrendered without an explicitmodelprop).InstanceManager.registerModelWithTestId()dereferenced a null model when atestIdwas supplied, introduced by the v84 expansion oftestIdcoverage on built-in appcontainer components.
See docs/upgrade-notes/v84-upgrade-notes.md for
detailed, step-by-step upgrade instructions with before/after code examples.
- Requires
hoist-core >= 38.0. - Removed the
getClassName()utility from@xh/hoist/utils/react. This function had no remaining usages in the framework β theclassNamespec field onhoistCmp.factory()/hoistCmp.withFactory()handles base class merging automatically.
- Updated FontAwesome to v7, bringing subtle visual tweaks and performance optimizations to Hoist's icon library. All previously supported icons remain and no app changes should be required.
- Replaced animated PNG
Spinnerwith a FontAwesome icon-based spinner, making it scalable, themeable, and consistent with the rest of the icon system. The icon and weight can be configured globally viaSpinner.defaultsor per-instance via props. AusePngflag is available to preserve the original PNG appearance if desired. - Added client-side span sampling to
TraceService. EvaluatesxhTraceConfig.sampleRulesat span creation, with child spans inheriting their parent's decision. Thetraceparentheader now propagates the sampling flag to the server. FetchOptions.spannow accepts astringorSpanConfigin addition to an existingSpan. When a string or config is provided,FetchServicecreates and manages the parent span internally, simplifying a common tracing pattern for fetch calls.
- Added JSDoc to ~60 exported Config/Spec interfaces and improved class-level docs on key
framework classes. Added README cross-references, when-to-use guidance, and
@seenavigation links throughout. - Split Cube documentation into dedicated
data/cube/README.mdwith expanded query patterns covering grand totals, leaf drill-down, dynamic updates, andexecuteQuery(). - Enhanced MCP/CLI symbol search to match JSDoc content with multi-word AND queries (e.g.
"panel modal"findsModalSupportModel). Added disambiguation hints for duplicate symbol names and fixed resolution of symbols shadowed by dynamics stubs.
- Added support for a typed
defaultsobject onhoistCmpcomponents β static config that apps can override at bootstrap (e.g.Button.defaults.minimal = false). Instance props take precedence. Added initial defaults toButton,Panel,Spinner, andToolbar. - Added
suppressStackTraceandincludeStartMessagesfields to the Log Levels admin panel, supporting the new hoist-core per-logger logging behavior overrides. - Added
assets.d.tstype declarations for image and markdown imports (*.png,*.gif,*.jpg,*.svg,*.md), removing the need for@ts-ignoreon asset imports. - Added hardcoded
xh-prefixedtestIdprops to all desktop and mobile appcontainer components for Playwright testing support. - Namespaced auto-installed
TraceServicespan and metric tags with anxh.prefix, aligning with OTEL semantic conventions.
- Improved default grid tooltip styling β long strings now wrap at a configurable max-width
(
400pxdefault) usingpre-wrap. New--xh-grid-tooltip-*CSS variables added for app-level customization of background, border, border-radius, padding, and max-width.
- @auth0/auth0-spa-js
2.17 β 2.19 - @fortawesome/*
6.0 β 7.2 - @fortawesome/react-fontawesome
0.2 β 3.2 - dompurify
3.3 β 3.4 - lodash
4.17 β 4.18
- Fixed
EnvironmentService.ensureVersionRunnable()to correctly detect client/server version mismatches on startup. The previous check compared two values both sourced from the server response, making it a tautology that could never fail. Now compares the webpack-bakedclientVersionagainst the server-reportedappVersion.
- Improved MCP/CLI TypeScript symbol tools to surface full JSDoc documentation in search results
and resolve a discoverability gap around component Props interfaces.
hoist-search-symbolsnow includes JSDoc snippets with each result. Props interfaces (e.g.PanelProps) without their own JSDoc inherit documentation from their companion component via naming convention.hoist-get-symbolnow cross-references between Props interfaces and their components.
- Updated
WebSocketServiceto support same-originbaseUrlvalues (e.g./api/). Previously assumed a cross-originbaseUrlin dev mode. Required for compatibility with the new webpack-dev-server proxy in@xh/hoist-dev-utilsv12.
- Update upgrade notes skill to properly register upgrade note
See docs/upgrade-notes/v83-upgrade-notes.md for
detailed, step-by-step upgrade instructions with before/after code examples.
- Requires
hoist-core >= 37.0(paired major release β tracing and metrics features depend on new server-side infrastructure). - Deprecated ad-hoc static properties on
GridModel,ChartModel,ExceptionHandler, andFetchServicein favor of the newstatic defaultspattern. Old properties log warnings and are scheduled for removal in v85. - Removed
downloadjsdependency. Apps that importeddownloadjsdirectly (relying on it as a transitive hoist-react dependency) must replace those usages. Use the newdownloadBlob(blob, filename)ordownloadViaUrl(url, filename?)utilities from@xh/hoist/utils/jsinstead.
- Added
TraceServiceβ client-side distributed OTEL tracing, configurable viaxhTraceConfig.withSpan()andwithSpanAsync()wrap operations with automatic timing and error capture.Promise.span()provides a chainable API for tracing promise-based operations.FetchServiceauto-creates CLIENT spans and injectstraceparentheaders.- Exceptions thrown during traced operations include a top-level
traceIdfor correlation. - Automated app-load spans covering pre-auth, hoist init, and app init phases.
- Added
SegmentedControldesktop input component β a toggle group for mutually exclusive options with strong visual differentiation of the active selection. Consider as replacement forButtonGroupInput. - Added
CheckboxButtondesktop input component β a button-based boolean toggle matching the existing mobile component. AddedcheckedIconanduncheckedIconprops to both desktop and mobile versions for custom icon support. - Added publish controls to the Admin Metrics tab, supporting the new opt-in metrics export
feature in
hoist-core >= 37.0. - Added
activeFilterIconconfig toGridFilterModelto customize the icon displayed in column headers when a filter is active. Accepts anyIconelement, enabling use of a different icon, prefix (e.g. solid), or intent (e.g. warning).
- Introduced a standard
static defaultspattern for app configuration overrides across several core models.GridModel.defaultsis the prime example β seeGridModelDefaultsfor the full set of visual, behavioral, and structural props now available. Apps should review available defaults and set them at startup to reduce per-instance boilerplate. Instance-level config always takes precedence. Previous ad-hoc static properties (e.g.GridModel.DEFAULT_AUTOSIZE_MODE) are deprecated β update to the newModelClassName.defaults.propNameform. - Added
TabContainerModel.setActiveTabId()for programmatic tab activation, suitable for use as abindtarget (e.g. withSegmentedControl). Previously required callingactivateTab(). - Switched
sizingModeAppOptionandthemeAppOptionapp option control presets to use newSegmentedControland set newrefreshRequired: falseflag to avoid data refresh when changed. - Made
DashCanvasModel.loadState()public, allowing applications to restore canvas state directly from aDashCanvasItemState[]array without wrapping asPersistableState. - Updated
FieldFilterto log console warning for any field not found in linkedStore.
- Refactored documentation indexing to better support both MCP (LLM) and the Toolbox Docs viewer.
- Improved MCP/CLI TypeScript tools:
hoist-get-membersnow walks both class and interface inheritance chains, shows constructor config types, indexes Promise prototype extensions, and filters_-prefixed internal members. - Fixed MCP/CLI TypeScript symbol indexing for destructured exports (e.g.
export const [Button, button] = hoistCmp.withFactory(...)). Individual binding names are now indexed as separate symbols, enabling exact-match lookups viahoist-ts symbol.
- Fixed
Store.getFieldValues()to includenullin its returned set when records contain null/undefined values. Previously these were silently excluded, preventing grid column filters from offering a [blank] option. - Fixed
FilterChooserQueryEngineto handle null values in suggestion generation without throwing. Added error logging so failures inqueryAsyncsurface in the console rather than silently killing the dropdown. The 'is' pseudo-operator is now listed in the e.g. operator hints, and 'is blank' / 'is not blank' suggestions are offered when a field contains null values.
- Fixed bug where
DashCanvasModel.statereturned stale data when persisted state was restored during construction. - Fixed bug preventing selection of favorites in the
GroupingChooser.
- Fixed TS compilation errors caused by missing
.d.tsdeclaration files in published build.
- Fixed a CSS issue causing desktop submenus to clip.
- Enhanced the MCP server's
hoist-search-symbolstool to also search public members (properties, methods, accessors) of 18 key framework classes. The TypeScript index is now built asynchronously after server startup so the first tool call doesn't pay the initialization cost.
Note that a server-side upgrade to hoist-core >= 36.3 is recommended to support new Admin Metrics
tab, but is not strictly required.
See docs/upgrade-notes/v82-upgrade-notes.md for
detailed, step-by-step upgrade instructions with before/after code examples.
- Converted
FetchServicecorrelation ID properties (autoGenCorrelationIds,genCorrelationId,correlationIdHeaderKey) from instance to static. These can now be configured in the app'sBootstrapmodule to ensure correlation IDs are active from the very first request, including early hoist core init calls. Apps that configure these properties should update references fromXH.fetchService.<prop>toFetchService.<prop>. - Added additional
divwithxh-dash-tab__contentclass aroundDashContainerViewcontent. Apps with custom CSS targetingxh-dash-tabmay need to adjust their selectors. - Removed the
xh-popup--framedCSS class. Apps applying this class to popovers should remove it β popover borders are now themed globally via the--xh-popup-border-colorCSS variable.
- Added
DashCanvasWidgetChoosercomponent β a draggable widget well for adding views to aDashCanvasvia drag-and-drop from an external container. AddedallowsDrop,onDropDone, andonDropDragOverconfig options toDashCanvasModelto support this, along withshowGridBackgroundandshowAddViewButtonWhenEmptyconfigs and a'wrap'compaction strategy. - Added
Pickerdesktop input component β a popover-based option picker for space-constrained areas like toolbars. Renders a trigger button that opens a dropdown checklist, with support for single and multi-select modes, built-in filtering, custom option and button renderers, and virtualized scrolling for large option lists. - Added new Admin Console Cluster > Metrics tab, providing a cluster-wide view of all registered
Micrometer meters, part of Hoist's ongoing observability updates.
- Feature requires
hoist-core >= 36.3.
- Feature requires
- Added
descriptionproperty toFieldandColumn.Column.descriptiondefaults fromField.descriptionand serves as the default for bothheaderTooltipandchooserDescriptionwhen those are not explicitly set, providing a single point of configuration for supplementary descriptive text that flows from the data layer through to the grid UI. - Added
bindconfig toGroupingChooserModelfor two-way syncing of the selected grouping to aGridModel(viasetGroupBy()) or CubeView(viaupdateQuery({dimensions})). Whenbindis provided, dimensions can be omitted and will be auto-populated from the target's fields whereisDimension: true. Explicitly provided dimensions are validated against the target's fields.- Promoted
isDimensionfromCubeFieldto the baseFieldclass (defaults tofalse), allowing Store fields to be marked as groupable dimensions.
- Promoted
- Added
testIdsupport to mobileButton,FormField,TabContainer, and all mobile input components (Checkbox,DateInput,NumberInput,SearchInput,Select,SwitchInput,TextArea,TextInput).
- Fixed
testIdgeneration inRadioInput(use optionvalueinstead oflabel) andRestGridaction buttons (scope by parenttestIdto prevent collisions across multiple grids). - Fixed
parseFieldValuefor'date'-typed fields to detectLocalDateinputs and convert via.daterather than passing throughnew Date(). - Fixed
Panelcontent styling todisplay: blockwhenscrollableistrue. - Fixed
DynamicTabSwitcherto consume theonContextMenuevent on its tabs. - Improved
DashCanvasandDashContainerpersistence such that individualViewModelstate can be updated without reloading the entire dashboard and owned views. - Fixed
GroupingChooserto support multiple instances sharing the sameGroupingChooserModel. Transient UI state (e.g. editor open/closed, pending value) is now held per-component, so opening one chooser no longer opens all others bound to the same model.
- Added instance methods to the
Filterclass hierarchy for removing child filters by type or field, plus a newappendFilter()utility for composing filters via AND. These replace the standalonewithFilterByField,withFilterByKey, andwithFilterByTypesutilities, which have been deprecated. Internal callers have been migrated to the new API. - Transitioned the hoist-react build itself to GitHub Actions (from our previous Teamcity build). No change to library consumers - Hoist continues to be published to npm.
- Catches and logs an occasional, non-fatal race condition error on
DashContainerstate changes.
- Added an embedded MCP (Model Context Protocol) server that gives AI coding tools structured access
to hoist-react documentation and TypeScript type information. Includes tools for keyword search
across docs, symbol lookup, and class/interface member inspection.
See
mcp/README.mdfor setup and usage details.
- Overrode Blueprint's hardcoded popover border and arrow colors to use Hoist's themed
--xh-popup-border-colorCSS variable. Popover borders and arrows now match the rest of the Hoist theme in both light and dark modes.
- @azure/msal-browser
4.26 β 4.29 - @auth0/auth0-spa-js
2.9 β 2.17 - react-grid-layout
2.1 β 2.2.2 - react-window
2.2(new β windowed rendering forPickervirtual option lists) - qs
6.14.0 β 6.15.0
See docs/upgrade-notes/v81-upgrade-notes.md for
detailed, step-by-step upgrade instructions with before/after code examples.
- Requires
hoist-core >= 36.1. - Renamed the CSS class on Panel's outer structural wrapper from
xh-panel__contenttoxh-panel__inner. Thexh-panel__contentclass is now used on the new inner frame wrapping content items (the target ofcontentBoxProps). Update any app CSS selectors targeting the oldxh-panel__contentclass accordingly. - Changed the signatures of some
HoistAuthModelmethods to returnIdentityInforather than aboolean. For most apps this will require a trivial change to the signature of the implementation ofHoistAuthModel.completeAuthAsync. - Renamed Blueprint
Cardexports toBpCardandbpCard.
- Added
Cardcomponent, a bordered container for grouping related content with an optional inline header and collapsible content. - Added
FormFieldSetcomponent for groupingFormFieldswith aggregated validation state. - Added
contentBoxPropsto desktop and mobilePanel, providing direct control over the inner frame wrapping content items. Use to apply padding, change flex direction, enable scrolling, or add custom classes without extra nesting. Matches the existingcontentBoxPropsAPI onCard. - Added
scrollableprop to desktopPanel, matching the existing mobilePanelAPI. SetsoverflowY: 'auto'on the content area. - Enhanced layout props
padding,margin(and their directional variants), andgapto accept a boolean shorthand:true- resolves to the standard app padding CSS variable (--xh-pad-px, default 10px), withfalsetreated as unset.
- Fixed bug where inline editable
GridwithgroupDisplayTypeother thangroupRowswould throw. - Fixed bug where attempting to access validation errors on subforms would throw.
- Updated
GridFilterModel.setFiltersignature to acceptFilterLikerather thanFilter. - Added
ResolvedLayoutPropstype alias.getLayoutProps()andsplitLayoutProps()now returnResolvedLayoutProps(with boolean values resolved) instead ofLayoutProps.
- Improved the efficiency of initialization by reducing the number of fetch requests required to load user identity.
- Added
Cube.lastUpdatedandView.cubeUpdatedproperties to support more efficient updating of connected cube views.
See docs/upgrade-notes/v80-upgrade-notes.md for
detailed, step-by-step upgrade instructions with before/after code examples.
- Modified several CSS classes related to
FormFieldto better follow BEM conventions.β οΈ The commonly targetedxh-form-field-labelclass is nowxh-form-field__label, although please review new CSS vars (below) and consider using those instead of class-based selectors.- Modifier classes now follow BEM conventions (e.g.
xh-form-field-invalidis nowxh-form-field--invalid).
- Completed the refactoring from
loadModeltoloadObserverstarted in v79:- Renamed
XH.appLoadModeltoXH.appLoadObserver. The prior getter remains as an alias but is deprecated and scheduled for removal in v82. - Renamed
AppContainerModel.loadModeltoloadObserver. This is primarily an internal model, so there is no deprecated alias. Any app usages should swap toXH.appLoadObserver. - Removed additional references to deprecated
loadModelwithin Hoist itself.
- Renamed
- Removed the following instance getters - use new static typeguards instead:
Store.isStoreView.isViewFilter.isFilter
- Replaced
LeftRightChooserFilter.anyMatchwithmatchMode. Changes are not expected to be required as apps typically do not create this component directly.
- Enhanced
Field.rulesto supportwarningandinfoseverity. Useful for non-blocking validation scenarios, such as providing guidance to users without preventing form submission. - Added new
AppMenuButton.renderWithUserProfileprop as a built-in alternative to the default hamburger menu. Set totrueto render the current user's initials instead or provide a function to render a custom element for the user. - Added
AggregationContextas an additional argument toCubeField.canAggregateFn. - Added
filterMatchModeoption toColChooserModel, allowing customizing match tostart,startWord, orany. - Added support for reconnecting a
Viewto its associatedCube.
- Fixed error encountered when attempting to
store.revert()on a store with summary records.
- Introduced new
FilterBindTargetandFilterValueSourceinterfaces to generalize the data sources that could be used withFilterChooserModelandGridFilterModel. BothStoreandViewimplement these interfaces, meaning no changes are required for apps, but it is now possible to use these models with alternate implementations. - Added new static typeguard methods on
Store,View, andFilter+ its subclasses. - Removed
RecordErrorMap+ reorganized validation types (not expected to impact most apps).
- Applied the app-wide
--xh-font-familytoinputelements. Previously these had continued to take a default font defined by the browser stylesheet.- Customize for inputs if needed via
--xh-input-font-family. - Note that the switch to Hoist's default Inter font w/tabular numbers might require some
inputs w/tight sizing to be made wider to avoid clipping (e.g.
DateInputssized to fit).
- Customize for inputs if needed via
- Updated + added validation-related
FormFieldCSS classes and variables to account for newinfoandwarningvalidation levels. Additionally validation messages and theinfotext element no longer clip at a single line - they will wrap as needed. - Added new CSS variables for
FormFieldto allow easier customization of commonly adjusted styles, with a focus on labels. Seevars.scssfor the full list. Consider replacing existing class-based CSS overrides with overrides to variables where possible. - Added new CSS variables
--xh-intent-danger-text-color(and others). Consider using these when styling text with Hoist intent colors to enhance legibility in dark mode. - Tweaked styling of
DashContainertab controls, adding a left border to the control surface and improving the visibility of the tab overflow dropdown.
- Added a direct dependency and forced resolution to pin to
jquery@3.x. This is a transitive dependency of thegolden-layoutlibrary and is specified by that library very loosely as*, causing a break if upgraded to jQuery's new 4.x release.β οΈ Apps will need to add their own resolution to ensure they stay on the last 3.x version.
See docs/upgrade-notes/v79-upgrade-notes.md for
detailed, step-by-step upgrade instructions with before/after code examples.
Note that a server-side upgrade to hoist-core >= 35 is recommended to support several changes in
this release, but is not strictly required.
- Upgraded Blueprint from version 5 to version 6. Most apps will not need to change, but
see https://github.com/palantir/blueprint/wiki/Blueprint-6.0 for more details.
β οΈ Note that any custom CSS overrides to BP classes will need to replace thebp5prefix withbp6and should be reviewed for accuracy/neccessity.
- Renamed
LoadSupport.loadModeltoLoadSupport.loadObserverfor clarity. This property is aTaskObserverinstance, not aHoistModel.- The getter methods
HoistModel.loadModelandHoistService.loadModelremain as aliases but are deprecated and scheduled for removal in v82. - Apps should update their code to use
loadObserverinstead ofloadModel.
- The getter methods
- Renamed
GridModel.applyColumnStateChanges()toupdateColumnState()for clarity and better symmetry withsetColumnState().- The prior method remains as an alias but is deprecated and scheduled for removal in v82.
- Moved
TabSwitcherPropstocmp/tab/Types.tsbut maintained export fromcmp/tab/index.ts. Some apps may need to update their imports. - Repurposed
TabContainerConfig.switcherto accept aTabSwitcherConfig. To passTabSwitcherPropsvia a parentTabContainer, useTabContainerProps.switcher. - Tightened the typing of
LocalDateadjustment methods with newLocalDateUnittype. Some less common or ambiguous units (e.g.dateord) are no longer supported. Also typed the adjustmentvalueargs tonumberwhere applicable. - Your app must update
compilerOptions.moduleResolutionto "bundler" intsconfig.json - If using the
DashCanvas.rglOptionsprop, you might have to update it to reflect changes inreact-grid-layoutv2+ (not common). - Modified
DashCanvasModel.containerPaddingto apply to thereact-grid-layoutdiv created by the library, instead of the Hoist-created containing div. This may affect printing layouts.
- Added new
DynamicTabSwitchercomponent, a more user-customizable version ofTabSwitcherthat allows for dynamic addition, removal, and drag-and-drop reordering of tabs with the ability to persist "favorited" tab state across sessions. Additionally, existing staticTabSwitchernow supports context-menu items. SeeTabContainerConfig.switcher. - Enhanced
LocalDatewithaddWeekdaysandsubtractWeekdaysmethods. - Upgraded
DashCanvaswith support for a gridded background to match widget sizing/snapping settings, plus two compacting strategies: 'vertical' and 'horizontal'. - Changed the icon used for the Grid autosize buttons and menu option (to πͺ).
- Added
clientAppCodeto Activity Tracking logs. Requireshoist-core >= 35.
- Fixed the column chooser to display columns in the same order as they appear in the grid.
- Defaulted Highcharts font to Hoist default
--xh-font-family. - Restored previous behavior of Highcharts treemap labels with regard to visibility and positioning.
- Tweaked
GridFindFieldto forward a providedrefto its underlyingTextInput. - Fixed bug where
SelectEditorwithqueryFnwould not commit on enter keydown. - Enabled deletion of larger numbers of log files via Admin Console. Requires
hoist-core >= 35.
- Removed the following previously deprecated configs as planned:
AppSpec.websocketsEnabled- enabled by default, disable viadisableWebSocketsGroupingChooserProps.popoverTitle- useeditorTitleRelativeTimestampProps.options- provide directly as top-level props
- Improved the efficiency and logging of
MsalClient. - Improved protections against server/app version mismatches (i.e. a stale client app version cached and restored by the browser).
- Introduced opt-in
Gridperformance optimizations on an experimental basis withGridExperimentalFlags.deltaSortandGridExperimentalFlags.disableScrollOptimization
- @blueprintjs/core:
5.10 β 6.3 - @blueprintjs/datetime:
5.3 β 6.0 - react-grid-layout
1.5 β 2.1
- Fixed logging during
MsalClientcreation.
- Fixed Highcharts timezone handling regression from version 77.
- Note that Highcharts has deprecated the
time.useUTCoption and its functioning seems suspect - settime.timezoneinstead. See https://api.highcharts.com/highcharts/time.useUTC.
- Note that Highcharts has deprecated the
- Enabled cross-tab persistence of client logging-level customizations.
- Added new property
MsalClientConfig.enableSsoSilentto govern use of MSAL SSO API. - Changed default for
MsalClientConfig.enableTelemetrytotrue. - Improved use of MSAL client API to maximize effectiveness of SSO, along with updates to docs and
logging.
- Note that Iframe attempts will now time out by default after 3s (vs. 10s). Customize if needed
via
MsalClientConfig.msalClientOptions.system.iFrameHashTimeout.
- Note that Iframe attempts will now time out by default after 3s (vs. 10s). Customize if needed
via
- @auth0/auth0-spa-js
2.7 β 2.9 - @azure/msal-browser
4.25 β 4.26
See docs/upgrade-notes/v78-upgrade-notes.md for
detailed, step-by-step upgrade instructions with before/after code examples.
GridModel.setColumnStateno longer patches existing column state, but instead replaces it wholesale. Applications that were relying on the prior patching behavior will need to callGridModel.applyColumnStateChangesinstead.GridModel.cleanColumnStateis now private (not expected to impact applications).
- Added new
FieldFilteroperatorsnot beginsandnot ends. - Added new optional
BucketSpec.dependentFieldsconfig to the Cube API, allowing apps to ensure proper re-bucketing of rows during data-only updates where those updates could affect bucketing determinations made by the spec.
- Fixed
GridModelnot appending children to the parents correctly when recs have numeric IDs. - Fixed issue where newly added columns would appear in the Displayed Columns section of the column chooser after loading grid state that was persisted before the columns were added to the grid.
- Removed a minor Cube
Queryannoyance -dimensionsare now automatically added to thefieldslist and do not need to be manually repeated there.
- Improved documentation on
BucketSpecclass. - Enhanced
FetchServiceto recognize variants on theapplication/jsoncontent-type when processing failed responses and decoding exceptions - e.g.application/problem+json.
- Upgraded Highcharts to v12.
- Refer to Toolbox's
Bootstrap.jsfor required changes to imports and chart initialization. - Visit https://www.highcharts.com/blog/changelog/ for additional details on the upgrade.
- Refer to Toolbox's
- Added
StoreRecord.getModifiedValues()to return an object with edited field values only.
- Improved
StoreRecord.isModifiedto not returntrueafter a field has been edited but then returned to its original value in a subsequent edit. - Restored support for
TabModel.contentset tonull, to support dynamic tab content. - Fixed an issue where stray context menus could appear when clicking on column group headers and other grid empty space.
- Removed the
disableXssProtectionflag supported byAppSpecandFieldSpecand replaced with its opposite,enableXssProtection, now an opt-in feature.- While store-based XSS protection via DomPurify is still available to apps that can display untrusted or potentially malicious data, this is an uncommon use case for Hoist apps and was deemed to not provide enough benefit relative to potential performance pitfalls for most applications. In addition, the core change to React-based AG Grid rendering has reduced the attack surface for such exploits relative to when this system was first implemented.
- Apps that were previously opting-out via
disableXssProtectionshould simply remove that flag. Apps for which this protection remains important should enable at either the app level or for selected Fields and/or Stores.
- Fixed regressions in grid context menus for filtering and copy/paste introduced by AG Grid v34.
- Note: AG Grid v34+ no longer supports HTML markup in context menus. Applications setting the
textorsecondaryTextproperties ofRecordGridActionto markup should be sure to use React nodes for formatting instead.
- Note: AG Grid v34+ no longer supports HTML markup in context menus. Applications setting the
- Fixed
AgGridModel.getExpandState()not returning a full representation of expanded groups - an issue that primarily affected linked tree map visualizations.
- Added support for Grails 7 service name conventions in admin client (backward compatible).
- Implemented minor performance improvements within
Storefor large data sets. - Added new
ViewRowData.cubeRowTypeproperty to support identifying bucketed rows. - Improved
waitForto accept anullvalue for its timeout.
- Added a public
@bindable titleDetailsconfig toDashViewModelto support displaying additional information in the title bar of dashboard widgets. The new property is not persisted, allowing apps to programmatically show dynamic info in a widget header without perturbing its saved state. - Enhanced grid column filtering to support sorting the list of available values.
- Autofocus the user input when the impersonation bar is shown.
- @auth0/auth0-spa-js
2.4 β 2.7 - @azure/msal-browser
4.23 β 4.25 - dompurify
3.2 β 3.3 - mobx
6.13 β 6.15
- Hoist v76 upgrades AG Grid to v34 (from v31), covering three major AG Grid releases with their
own potentially breaking changes.
- Fortunately, internal Hoist updates to our managed API wrappers mean that most apps will see
very minimal changes, although there are required adjustments to app-level
package.jsonto install updated grid dependencies andBootstrap.tsto import and register your licensed grid modules at their new import paths. - Applications implementing
groupRowRenderershould note that thevalueproperty passed to this function is no longer stringified, but is instead the raw field value for the group. - See AG's upgrade guides for more details:
- Fortunately, internal Hoist updates to our managed API wrappers mean that most apps will see
very minimal changes, although there are required adjustments to app-level
- Modified the
TabModelconstructor to take its owning container as a second argument.- Apps very rarely create
TabModelsdirectly, so this unlikely to require changes.
- Apps very rarely create
- Moved the
Exceptionclass andHoistExceptiontype from@xh\hoist\coreto a new lower-level package@xh\hoist\exceptionto reduce the risk of circular dependencies within Hoist.- Apps rarely interact with these directly, so also unlikely to require changes.
- Added
extraConfirmText+extraConfirmLabelconfigs toMessageOptions. Use these new options to require the specified text to be re-typed by a user when confirming a potentially destructive or disruptive action. Note their usage within Hoist's Admin Console when deleting a role. - Updated grid column filters to apply on
Enter/ dismiss onEsc. Tweaked the filter popup toolbar for clarity. - Added new ability to specify nested tab containers in a single declarative config. Apps may now
provide a spec for a nested tab container directly to the
TabConfig.contentproperty. - Improved
ViewManagerfeatures:- Enabled globally sharing a new view directly from the 'Save/Save As' dialog.
- Simplified presentation and management of view visibility via new "Visibility" control.
- Removed support for the
isDefaultPinnedattribute on global views. All global views will be pinned (i.e. show up in user menus) by default. Users can still explicitly "unpin" any global views to remove them from their menus.
- Added a
validEmailsconstraint rule to validate one or more email addresses in an input field. - Added
DashCanvas.rglOptionsprop - passed through to the underlyingreact-grid-layout. - Promoted experimental grid feature
enableFullWidthScrollto a first-classGridModelconfig. Set to true to ensure that the grid will have a single horizontal scrollbar spanning the width of all columns, including any pinned columns.
- Handled an edge-case
ViewManagerbug whereenableDefaultchanged tofalseafter some user state had already been persisted w/users pointed at in-code default view. The manager now calls its configuredinitialViewSpecfunction as expected in this case. - Updated
XH.restoreDefaultsAsyncto clear basic view state, including the user's last selected view. Views themselves will be preserved. Requireshoist-core >= 32.0. - Fixed bug where
GridModel.persistableColumnStatewas not including default columnwidths. This led to columns not being set to their expected widths when switchingViewManagerviews. - Fixed bug where a
Gridwith managed autosizing was not triggering an autosize as expected when new column state was loaded (e.g. viaViewManager).
- Added a new
@sharePendingPromisedecorator for returning a shared Promise across concurrent async calls. Calls made to a decorated method while a prior call with the same args is still pending won't kick off a new call, but will instead receive the same Promise as the first call. - Added
XH.logLevelto define a minimum logging severity threshold for Hoist's client-side logging utilities. Defaulted to 'info' to prevent possible memory and performance impacts of verbose logging on 'debug'. Change at runtime via newXH.setLogLevel()when troubleshooting. SeeLogUtils.tsfor more info. - Added control to trigger browser GC from app footer. Useful for troubleshooting memory issues.
Requires running chromium-based browser via e.g.
start chrome --js-flags="--expose-gc.
- Corrected
ColChooserConfig.widthandheighttypes.
- @auth0/auth0-spa-js
2.3 β 2.4 - @azure/msal-browser
4.16 β 4.23 - typescript
5.8 β 5.9
- Added new
GridModel.expandLevelconfig to control the expansion state of tree/grouped grids.- Replaces the use of the
agOptions.groupDefaultExpandedon the component. - The most recently expanded level is persistable with other grid state.
- The default grid context menu now supports a new item to allow users to expand/collapse out to
a specific level/depth. Set
GridModel.levelLabelsto activate this feature. - A new
ExpandToLevelButtonmenu component is also available for both desktop and mobile. Provides easier discoverability on desktop and supports this feature on mobile, where we don't have context menus.
- Replaces the use of the
- Enhanced
FilterChooserto better handle filters with differentops on the same field.- Multiple "inclusive" ops (e.g.
=,like) will be OR'ed together. - Multiple "exclusive" ops (e.g.
!=,not like) will be AND'ed together. - Range ops (e.g.
<,>) use a heuristic to avoid creating a filter that could never match. - This behavior is consistent with current behavior and user intuition and should maximize the ability to create useful queries using this component.
- Multiple "inclusive" ops (e.g.
- Deprecated the
RelativeTimestamp.optionsprop - all the same options are now top-level props. - Added new
GroupingChooserModel.sortDimensionsconfig. Set tofalseto respect the order in whichdimensionsare provided to the model. - Added new
ClipboardButton.errorMessageprop to customize or suppress a toast alert if the copy operation fails. Set tofalseto fail silently (the behavior prior to this change). - Added new
Cube.modifyRecordsAsyncfor modifying individual field values in a local uncommitted state. Additionally enhancedStore.modifyRecordsto return aStoreChangeLogof updates. - Cube Views now emit data objects of type
ViewRowData, rather than an anonymousPlainObject. This new object supports several documented properties, including a usefulcubeLeavesproperty, which can be activated via theQuery.provideLeavesproperty.
- Fixed bugs where
Store.modifyRecords,Store.revertRecordsandStore.revertwere not properly handling changes toSummaryRecords. - Fixed minor
DashCanvasissues withallowAdd: false, ensuring it does not block additions made vialoadState()and hiding theAddcontext menu item in views as intended. - Updated
DashCanvasCSS to setposition: relative;, ensuring that the empty state overlay is positioned as intended and does not extend beyond the canvas. - Improved the core
useContextModelhook to make it reactive to a change of an (observable) resolved model. Previously this value was cached on first render. - Fixed framework components that bind to grids (e.g.
ColChooserButton,ColAutosizeButton,GridFindField), ensuring they automatically rebind to a new observableGridModelvia context.
- WebSockets are now enabled by default for client apps, as they have been on the server since Hoist
Core v20.2. Maintaining a WebSocket connection back to the Hoist server enables useful Admin
Console functionality and is recommended, but clients that must disable WebSockets can do so via
AppSpec.disableWebSockets. NoteAppSpec.webSocketsEnabledis deprecated and can be removed. - Hoist now sets a reference to an app's singleton
AuthModelon a staticinstanceproperty of the app-specified class. App developers can declare a typed staticinstanceproperty on their model class and use it to access the singleton with its proper type, vs.XH.authModel.- The
XH.authModelproperty is still set and available - this is a non-breaking change. - This approach was already (and continues to be) used for services and the
AppModelsingleton.
- The
- Removed deprecated
LoadSupport.isLoadSupport - Removed deprecated
FileChooserModel.removeAllFiles - Removed deprecated
FetchService.setDefaultHeaders - Removed deprecated
FetchService.setDefaultTimeout - Removed deprecated
IdentityService.logoutAsync - Change to the row objects returned by
View: the undocumented_metaandbucketsproperties have been removed. Use the documented properties on the newViewRowDataclass instead.
- Upgraded the version of Hoist's default Inter UI font to a new major version, now v4.1. Note
that this brings slight differences to the font's appearance, including tweaks to internal
spacing and letterforms for tabular numbers. The name of the font face has also changed, from
Inter VartoInterVariable. The default value of the--xh-font-familyCSS variable has been updated to match, making this change transparent for most applications.
- @auth0/auth0-spa-js
2.1 β 2.3 - @azure/msal-browser
4.12 β 4.16 - filesize
6.4 β 11.0 - inter-ui
3.19 β 4.1 - mobx-react-lite
4.0 β 4.1 - qs
6.13 β 6.14 - react-markdown
9.0 β 10.1 - regenerator-runtime
0.13 β 0.14 - semver
7.6 β 7.7 - short-unique-id
5.2 β 5.3 - ua-parser-js
1.0 β 2.0
- Fixed
GroupingChooserlayout issue, visible only when favorites are disabled.
- Further refinements to the
GroupingChooserdesktop UI.- Added new props
favoritesSideandfavoritesTitle. - Deprecated
popoverTitleprop - useeditorTitleinstead. - Moved "Save as Favorite" button to a new compact toolbar within the popover.
- Added new props
- Fixed a bug where
TrackServicewas not properly verifying that trackeddatawas below the configuredmaxDataLengthlimit.
- Updated the
GroupingChooserUI to use a single popover for both updating the value and selecting/managing favorite groupings (if enabled).- Adjusted
GroupingChooserModelAPI and some CSS class names and testIds ofGroupingChooserinternals, although those changes are very unlikely to require app-level adjustments. - Adjusted/removed (rarely used) desktop and mobile
GroupingChooserprops related to popover sizing and titling. - Updated the mobile UI to use a full-screen dialog, similar to
ColumnChooser.
- Adjusted
- Added props to
ViewManagerto customize icons used for different types of views, and modified default icons for Global and Shared views. - Added
ViewManager.extraMenuItemsprop to allow insertion of custom, app-specific items into the component's standard menu.
π₯ Breaking Changes (upgrade difficulty: π’ LOW - minor changes to ViewManagerModel, ChartModel)
See docs/upgrade-notes/v74-upgrade-notes.md for
detailed, step-by-step upgrade instructions with before/after code examples.
- Removed
ViewManagerModel.settleTime. Now set via individualPersistOptions.settleTimeinstead. - οΈRemoved
ChartModel.showContextMenu. Use a setting offalsefor the newChartModel.contextMenuproperty instead.
- Added
ViewManagerModel.preserveUnsavedChangesflag to opt-out of that behaviour. - Added
PersistOptions.settleTimeto configure time to wait for state to settle before persisting. - Support for grid column level
onCellClickedevents. - General improvements to
MenuItemapi- New
MenuContextobject now sent as 2nd arg toactionFnandprepareFn. - New
ChartModel.contextMenuproperty provides a fully customizable context menu for charts.
- New
- Improved
ViewManagerModel.settleTimeby delegating to individualPersistenceProviders. - Fixed bug where grid column state could become unintentionally dirty when columns were hidden.
- Improved
WebsocketServiceheartbeat detection to auto-reconnect when the socket reports as open and heartbeats can be sent, but no heartbeat acknowledgements are being received from the server. - Restored zoom out with mouse right-to-left drag on Charts.
- Fixed a minor issue with Admin Console Role Management.
See docs/upgrade-notes/v73-upgrade-notes.md for
detailed, step-by-step upgrade instructions with before/after code examples.
- Requires
hoist-core >= 31with new APIs to support the consolidated Admin Console "Clients" tab and new properties onTrackLog. - Apps with a custom
AppModelfor their admin app that extends@xh/hoist/admin/AppModelmust ensure they callsuper.initAsync()within their override of that lifecycle method, if applicable. This did not previously have any effect, but is required now for the superclass to initialize a newViewManagerModel. - Requires call to
makeObservable(this)in model constructors with@bindable. Note that there is a new dev-only runtime check onHoistBaseto warn if this call has not been made.
- Updated and improved Grid column based filtering to better match the behavior of Excel.
GridFilterModel.commitOnChagenowfalseby default- Added ability to append terms to active filter only when
commitOnChage:false
- Added new
PopoverFilterChoosercomponent - wrapsFilterChooserin aPopoverto allow it to expand vertically when used in aToolbaror other space-constrained, single-line layout. - Enhanced OAuth clients with a new
reloginEnabledconfig. Set to true to allow the client to do a potentially interactive popup login mid-session to re-establish auth if its refresh token has expired or been invalidated. Strongly recommended for all OAuth usages. - Significantly upgraded the Admin Console "User Activity" tab:
- Consolidated client error reports and user feedback into Activity Tracking.
- Added support for custom views via
ViewManager. - New ability to promote data in
datablock to grids for aggregation, reporting and charting. - Enhanced track messages with new
tabIdandloadIdproperties, to disambiguate activity for users across multiple browser tabs + loads of the app.
- Added a new Admin Console "Clients" tab - a consolidated view of all websocket-connected clients across all instances in the cluster, with integrated activity detail viewer.
- Updated
FormModelto supportpersistWithfor storing and recalling its values, including developer options to persist only a subset of fields. - Added new
XH.openWindow()util to ensure that new windows/tabs are opened without an unintendedopenerrelationship with the original window.
- Fixed drag-and-drop usability issues with the mobile
ColChooser. - Made
GridModel.defaultGroupSortFnnull-safe and improved type signature. - Disabled
dashCanvasAddViewButtonif there are nomenuItemsto show. - Hardened
@bindableand@persistto handle lifecycle-related bugs. Note that previously@bindablewould work even ifmakeObservable()was not called, but this is no longer the case. Please ensure you callmakeObservable(this)in your model's constructor when using@bindable! - Improved client
WebSocketServiceheartbeat to check that it has been receiving inbound messages from the server, not just successfully sending outbound heartbeats.
- Updated the background version checking performed by
EnvironmentServiceto use the app version and build information baked into the client build when comparing against the latest values from the server. Previously the versions loaded from the server on init were used as the baseline.- The two versions should be the same, but in cases where a browser "restores" a tab and re-inits an app without reloading the code itself, the upgrade check would miss the fact that the client remained on an older version.
β οΈ NOTE that a misconfigured build - where the client version is not set to the same value as the server - would result in a false positive for an upgrade. The two should always match.
- Calls to
Promise.track()that are rejected with an exception will be tracked with new severity level ofTrackSeverity.ERROR.
- Corrected
GridGroupSortFnparam types. - Corrected
StoreCountLabelPropsinterface. - Corrected
textAligntype across severalHoistInputprop interfaces.
- @azure/msal-browser
4.8 β 4.12
Note that all of the below are devDependencies, so they will not directly affect your application
build. That said, we strongly recommend taking these same changes into your app if you can.
- @xh/hoist-dev-utils
10.x β 11.x - eslint
8.x β 9.x- Apps making this update must also rename their
.eslintrcfile toeslint.config.js. See the configuration found in Toolbox'seslint.config.jsas your new baseline.
- Apps making this update must also rename their
- eslint-config-prettier
9.x β 10.x - typescript
5.1 β 5.8
- Allow the display of very long log lines in Admin log viewer.
- Added option from the Admin Console > Websockets tab to request a client health report from any connected clients.
- Enabled telemetry reporting from
WebSocketService. - Updated
MenuItem.actionFn()to receive the click event as an additional argument. - Support for reporting App Build, Tab Id, and Load Id in websocket admin page.
- Added new methods for formatting timestamps within JSON objects. See
withFormattedTimestampsandtimestampReplacerin the@xh/hoist/formatpackage. - Added new
ViewManagerConfig.viewMenuItemFnoption to support custom rendering of pinned views in the drop-down menu.
- Added dedicated
ClientHealthServicefor managing client health report. Additional enhancements to health report to include information about web sockets, idle time, and page state.
- Added support for posting a "Client Health Report" track message on a configurable interval. This
message will include basic client information, and can be extended to include any other desired
data via
XH.clientHealthService.addSource(). Enable by updating your app'sxhActivityTrackingConfigto includeclientHealthReport: {intervalMins: XXXX}. - Enabled opt-in support for telemetry in
MsalClient, leveraging hooks built-in to MSAL to collect timing and success/failure count for all events emitted by the library. - Added the reported client app version as a column in the Admin Console WebSockets tab.
- Improved fetch request tracking to include time spent loading headers as specified by application.
- @azure/msal-browser
3.28 β 4.8
- Modified
TabContainerModelto make more methodsprotected, improving extensibility for advanced use-cases. - Enhanced
XH.reloadAppwith new argument to clear query parameters before loading. - Enhanced exception handling in
FetchServiceto capture messages returned as raw strings, or without explicit names. - Added dedicated columns to the Admin Console "Client Errors" tab for error names and messages.
BaseOAuthClienthas been enhanced to allowlazyloading of Access Tokens, and also made more robust such that Access Tokens that fail to load will never prevent the client from initialization.
- Prevented native browser context menu from showing on
DashCanvassurfaces and obscuring theDashCanvascustom context menu.
- Introduced a new "JSON Search" feature to the Hoist Admin Console, accessible from the Config,
User Preference, and JSON Blob tabs. Supports searching JSON values stored within these objects
to filter and match data using JSON Path expressions.
β οΈ Requireshoist-core >= 28.1with new APIs for this (optional) feature to function.
- Added new getters
StoreRecord.isDirty,Store.dirtyRecords, andStore.isDirtyto provide a more consistent API in the data package. The pre-existingisModifiedgetters are retained as aliases, with the same semantics.
- Tuned mobile swipe handling to prevent horizontal swipes on a scrolling grid view from triggering the Navigator's back gesture.
- Prevented the Admin Console Roles grid from losing its expand/collapse/scroll state on refresh.
- Fixed bug when merging
PersistOptionswith conflicting implicit provider types. - Fixed bug where explicit
persistGroupingoptions were not being respected byGridModel.
- Mobile
Navigatorno longer supportsanimationprop, andNavigatorModelno longer supportsswipeToGoBack. Both of these properties are now managed internally by theNavigatorcomponent.
- Mobile
Navigatorhas been rebuilt to support smooth swipe-based navigation. The API remains largely the same, notwithstanding the minor breaking changes detailed above.
- Fixed
ViewManagerModelunique name validation. - Fixed
GridModel.restoreDefaultsAsync()to restore any default filter, rather than simply clearing it. - Improved suboptimal column state synchronization between
GridModeland AG Grid.
- Added support for providing custom
PersistenceProviderimplementations toPersistOptions.
- Improved signature of
HoistBase.markPersist.
- Requires
hoist-core >= 27.0with new APIs to supportViewManagerand enhanced cluster state monitoring in the Admin Console. ErrorMessageis now cross-platform - update imports from@xh/hoist/desktop/cmp/erroror@xh/hoist/mobile/cmp/errorto@xh/hoist/cmp/error.Maskis now cross-platform - update imports from@xh/hoist/desktop/cmp/maskor@xh/hoist/mobile/cmp/maskto@xh/hoist/cmp/mask.LoadingIndicatoris now cross-platform - update imports from@xh/hoist/desktop/cmp/loadingindicatoror@xh/hoist/mobile/cmp/loadingindicatorto@xh/hoist/cmp/loadingindicator.TreeMapandSplitTreeMapare now cross-platform and can be used in mobile applications. Update imports from@xh/hoist/desktop/cmp/treemapto@xh/hoist/cmp/treemap.- Renamed
RefreshButton.modelprop totargetfor clarity and consistency.
- Major improvements to the
ViewManagercomponent, including:- A clearer, better organized management dialog.
- Support for persisting a view's pending value, to avoid users losing changes when e.g. an app goes into idle mode and requires a page refresh to restore.
- Improved handling of delete / update collisions.
- New
ViewManagerModel.settleTimeconfig, to allow persisted components such as dashboards to fully resolve their rendered state before capturing a baseline for dirty checks.
- Added
SessionStorageServiceand associated persistence provider to support saving tab-local data across reloads. Exact analog toLocalStorageService, but scoped to lifetime of current tab. - Added
AuthZeroClientConfig.audienceconfig to support improved flow for Auth0 OAuth clients that request access tokens. Specify your access token audience here to allow the client to fetch both ID and access tokens in a single request and to use refresh tokens to maintain access without relying on third-party cookies. - Updated sorting on grouped grids to place ungrouped items at the bottom.
- Improved
DashCanvasviews to support resizing from left/top edges in addition to right/bottom. - Added functional form of
FetchService.autoGenCorrelationIdsfor per-request behavior. - Added a new
ClusterβΊObjectstab in Admin Console to support comparing state across the cluster and alerting of any persistent state inconsistencies.
- Fixed sizing and position of mobile
TabContainerswitcher, particularly when the switcher is positioned withtoporientation. - Fixed styling of
ButtonGroupin vertical orientations. - Improved handling of calls to
DashContainerModel.loadStateAsync()when the component has yet to be rendered. Requested state updates are no longer dropped, and will be applied as soon as the component is ready to do so.
- Added explicit
devDependenciesandresolutionsblocks for@types/react[-dom]at v18.x. - Added workaround for problematic use of SASS-syntax-in-CSS shipped by
react-dates. This began throwing "This function isn't allowed in plain CSS" with latest version of sass/sass-loader.
- Improved accuracy of
IconPropsinterface, with use of theIconNameandIconPrefixtypes provided by FontAwesome. - Improved accuracy of
PersistOptions.typeenum. - Corrected the type of
ColumnSpec.editor.
- @azure/msal-browser
3.27 β 3.28 - dompurify
3.1 β 3.2 - react-grid-layout
1.4 β 1.5
- Upgraded the
PersistenceProviderAPI as noted inNew Features. Could require updates in apps with advanced direct usages of this API (uncommon). - Updated
GridModelpersistence to omit the widths of autosized columns from its persisted state. This helps to keep persisted state more stable, avoiding spurious diffs due to autosize updates. Note this can result in more visible column resizing for large grids without in-code default widths. Please let XH know if this is a noticeable annoyance for your app. - Removed the following persistence-related model classes, properties, and methods:
GridPersistenceModelandZoneGridPersistenceModelGridModel|ZoneGridModel.persistenceModelGridModel.autosizeStateColumn.manuallySizedGroupingChooserModel|FilterChooserModel.persistValueDashModel|GroupingChooserModel|FilterChooserModel|PanelModel|TabContainerModel.providerPersistenceProvider.clearRaw()
- Renamed
ZoneGridModelPersistOptions.persistMappings, adding the trailingsfor consistency. - Changed signature of
JsonBlobService.listAsync()to inlineloadSpecwith all other args in a single options object. - Changed signature of
waitFor()to take its optionalintervalandtimeoutarguments in a single options object.
- Introduced a new
ViewManagercomponent and backing model to support user-driven management of persisted component state - e.g. saved grid views.- Bundled with a desktop-only menu button based component, but designed to be extensible.
- Bindable to any persistable component with
persistWith: {viewManagerModel: myViewManager}. - Detects changes to any bound components and syncs them back to saved views, with support for an autosave option or user-driven saving with a clear "dirty" indicator.
- Saves persisted state back to the server using Hoist Core
JSONBlobs for storage. - Includes a simple sharing model - if enabled for all or some users, allows those users to publish saved views to everyone else in the application.
- Users can rename views, nest them into folders, and mark them as favorites for quick access.
- Generally enhanced Hoist's persistence-related APIs:
- Added new
Persistableinterface to formalize the contract for objects that can be persisted. PersistenceProvidernow targets aPersistableand is responsible for setting persisted state on its boundPersistablewhen the provider is constructed and persisting state from its boundPersistablewhen changes are detected.- In its constructor,
PersistenceProvideralso stores the initial state of its boundPersistableand clears its persisted state when structurally equal to the initial state.
- Added new
- Updated persistable components to support specifying distinct
PersistOptionsfor individual bits of persisted state. E.g. you can now configure aGroupingChooserModelused within a dashboard widget to persist its value to that particular widget'sDashViewModelwhile saving the user's favorites to a global preference.
- Tightened
FilterChooserFilterLikeunion type to remove the genericFiltertype, as filter chooser supports onlyFieldFilterandCompoundFilter. - Improved
HoistBase.markPersist()signature to ensure the provided property name is a known key of the model. - Expanded the
JsonBlobinterface to include additional properties present on all blobs. - Corrected
DashViewSpec.titleto be optional - it can be defaulted from theid. - Corrected the return type for
SelectProps.loadingMessageFnandnoOptionsMessageFnto returnReactNodevsstring. The component supports rendering richer content via these options.
- Updated minimum required version of FontAwesome to 6.6, as required by the
fileXml()icon added in the prior Hoist release. The previous spec for FA dependencies allowed apps to upgrade to 6.6, but did not enforce it, which could result in a build error due to an unresolved import.
- Deprecated
FileChooserModel.removeAllFiles(), replaced withclear()for brevity/consistency. - Improved timeout error message thrown by
FetchServiceto format the timeout interval in seconds where possible.
- @azure/msal-browser
3.23 β 3.27 - @fortawesome/fontawesome-pro
6.2 β 6.6 - qs
6.12 β 6.13 - store2
2.13 β 2.14
- Requires
hoist-core >= 24to support batch upload of activity tracking logs to server and new memory monitoring persistence. - Replaced
AppState.INITIALIZINGwith finer-grained states (not expected to impact most apps).
- Optimized activity tracking to batch its calls to the server, reducing network overhead.
- Enhanced data posted with the built-in "Loaded App" entry to include a new
timingsblock that breaks down the overall initial load time into more discrete phases. - Added an optional refresh button to
RestGrids toolbar. - Updated the nested search input within Grid column filters to match candidate values on
anyvsstartsWith. (Note that this does not change how grid filters are applied, only how users can search for values to select/deselect.) - Support for persisting of memory monitoring results
- Improved typing of
HoistBase.addReactionto flow types returned by thetrackclosure through to therunclosure that receives them.- Note that apps might need to adjust their reaction signatures slightly to accommodate the more
accurate typing, specifically if they are tracking an array of values, destructuring those
values in their
runclosure, and passing them on to typed APIs. Look out fortscwarnings.
- Note that apps might need to adjust their reaction signatures slightly to accommodate the more
accurate typing, specifically if they are tracking an array of values, destructuring those
values in their
- Reset the
--xh-popup-bgbackground color to match the primary--xh-bgcolor by default.
- Fixed broken
Panelresizing in Safari. (Other browsers were not affected.)
Markdownnow supports areactMarkdownOptionsprop to allow passing React Markdown props to the underlyingreactMarkdowninstance.
- Misc. Improvements to Cluster Tab in Admin Panel.
- Requires
hoist-core >= 22.0for consolidated polling of Alert Banner updates (see below).
- Added expand/collapse affordance in the left column header of ZoneGrids in tree mode.
- Updated Admin Console's Cluster tab to refresh more frequently.
- Consolidated the polling check for Alert Banner updates into existing
EnvironmentServicepolling, avoiding an extra request and improving alert banner responsiveness.
- Corrected types of enhanced
Promisemethods.
- @azure/msal-browser
3.17 β 3.23 - mobx
6.9 β 6.13, - mobx-react-lite
3.4 β 4.0,
- Requires
hoist-core >= 21.0.
- Added support for Correlation IDs across fetch requests and error / activity tracking:
- New
FetchServicemembers:autoGenCorrelationIds,genCorrelationIdandcorrelationIdHeaderKeyto support generation and inclusion of Correlation IDs on outbound request headers. - Correlation IDs are assigned via:
FetchOptions.correlationId- specify an ID to be used on a particular request ortrueto use a UUID generated by Hoist (seeFetchService.genCorrelationId()).TrackOptions.correlationId- specify an ID for a tracked activity, if not using the newFetchOptions.trackAPI (see below).
- If set on a fetch request, Correlation IDs are passed through to downstream error reporting and are available for review in the Admin Console.
- New
- Added
FetchOptions.trackas streamlined syntax to track a request via Hoist activity tracking. Prefer this option (vs. a chained.track()call) to relay the request'scorrelationIdandloadSpecautomatically. - Added
FetchOptions.asJsonto instructFetchServiceto decode an HTTP response as JSON. Note thatFetchServicemethods suffixed withJsonwill set this property automatically. - Added global interceptors on
FetchService. SeeFetchService.addInterceptor(). GridModelwill now acceptcontextMenu: falseto omit context menus.- Added bindable
AppContainerModel.intializingLoadMaskMessageto allow apps to customize the load mask message shown during app initialization. - Enhanced
selectcomponent with newemptyValueprop, allowing for a custom value to be returned when the control is empty (vsnull). Expected usage is[]whenenableMulti:true. - Added
GroupingChooserModel.setDimensions()API, to support updating available dimensions on an already constructedGroupingChooserModel.
- Fixed Admin Console bug where a role with a dot in its name could not be deleted.
- Fixed inline
SelectEditorto ensure new value is flushed before grid editing stops. WebSocketServicenow attempts to establish a new connection when app's server instance changes.
- Added CSS variables to support customization of
Badgecomponent styling.
- short-unique-id
added @ 5.2
HoistExceptionnow correctly passes an exception message to its underlyingErrorinstance.- Fixed
GridModel.cellBordersto apply top and bottom cell borders, as expected. - Fix to new
mergeDeepmethod.
- Enhanced
markdowncomponent to support the underlyingcomponentsprop fromreact-markdown. Use this prop to customize markdown rendering. - New
mergeDeepmethod provided in@xh/hoist/utils/jsas an alternative tolodash.merge, without lodash's surprising deep-merging of array-based properties. - Enhanced Roles Admin UI to support bulk category reassignment.
- Enhanced the number formatters'
zeroPadoption to take an integer in addition to true/false, for finer-grained control over padding length.
- Fixed
Record.descendantsandRecord.allDescendantsgetters that were incorrectly returning the parent record itself. Now only the descendants are returned, as expected.β οΈ Note that apps relying on the previous behavior will need to adjust to account for the parent record no longer being included. (Tree grids with custom parent/child checkbox selection are one example of a component that might be affected by this change.)
- Fixed
Gridregression where pinned columns were automatically un-pinned when the viewport became too small to accommodate them. - Fixed bug where
Gridcontext-menus would lose focus when rendered insideOverlaycomponents.
β οΈ Please ensure you update your app tohoist-dev-utils >= v9.0.1- this ensures you have a recent version oftype-festas a dev dependency, required to compile some recent Hoist typescript changes.- The
NumberFormatOptions.precisionarg has been more strictly typed toPrecision, a new type exported from@xh/hoist/format. (It was previouslynumber.) Apps might require minor adjustments - e.g. typing shared format configs asNumberFormatOptionsto satisfy the compiler.
- Enhanced beta
MsalClientandAuthZeroClientOAuth implementations to support passing app-specific configs directly into the constructors of their underlying client implementation.
- Improved redirect handling within beta
MsalClientto use Hoist-provided blank URL (an empty, static page) for all iFrame-based "silent" token requests, as per MS recommendations. Intended to avoid potential race conditions triggered by redirecting to the base app URL in these cases. - Fixed bug where
ContextMenuitems could be improperly positioned.β οΈ Note thatMenuItemsinside a desktopContextMenuare now rendered in a portal, outside the normal component hierarchy, to ensures that menu items are positioned properly relative to their parent. It should not affect most apps, but could impact menu style customizations that rely on specific CSS selectors targeting the previous DOM structure.
- Fixed bug where inline grid edit of
NumberInputwas lost after quick navigation.
- New
HoistAuthModelexposes the client-side authentication lifecycle via a newly consolidated, overridable API. This new API provides more easy customization of auth across all client-side apps by being easily overrideable and specified via theAppSpecpassed toXH.renderApp().- In most cases, upgrading should be a simple matter of moving code from
HoistAppModelmethodspreAuthInitAsync()andlogoutAsync()(removed by this change) to newHoistAuthModelmethodscompleteAuthAsync()andlogoutAsync().
- In most cases, upgrading should be a simple matter of moving code from
- Added option to
XH.reloadApp()to reload specific app path. - Added
headerTooltipprop toColumnGroup.
- Updated
.xh-viewportsizing styles and mobiledialogsizing to usedvw/dvhinstead of priorsvw/svh- resolves edge case mobile issue where redirects back from an OAuth flow could leave an unexpected gap across the bottom of the screen. Includes fallback for secure client browsers that don't support dynamic viewport units. - Updated mobile
TabContainerto flex properly within flexbox containers. - Fixed timing issue with missing validation for records added immediately to a new
Store. - Fixed CSS bug in which date picker dates wrapped when
dateEditorused in a grid in a dialog.
- Requires update to
hoist-dev-utils >= v9.0.0with updated handling of static/public assets. This should be a drop-in change for applications. - iOS < 16.4 is no longer supported, due to the use of complex RegExes in GFM parsing.
- Enhanced
markdowncomponent to support GitHub Flavored Markdown (GFM) syntax.
- Refactored CSS classnames applied to the primary application (β°) menu on desktop and mobile.
On both platforms the button itself now has an
xh-app-menu-buttonclass, the popover hasxh-app-menu-popover, and the menu itself hasxh-app-menu.
- Improved popup behavior of (beta)
MsalClient- uses recommendedblank.html. - Added new convenience method
XH.renderAdminApp()- consider replacing the call within your project'ssrc/apps/admin.tsfile with this new method and removing any duplicate config values if the defaults introduced here are suitable for your application's Hoist Admin console. - Prop types for components passed to
elementFactoryandcreateElementare now inferred from the component itself where possible.
- @xh/hoist-dev-utils
8.x β 9.x - react-markdown
8.0 β 9.0 - remark-breaks
3.0 β 4.0 - remark-gfm
4.0
- Added a workaround for a mobile-only bug where Safari auto-zooms on orientation change if the user had previously zoomed the page themselves.
- Improved logout behavior of (beta)
MsalClient.
- @azure/msal-browser
3.14 β 3.17
- Improved
reftyping in JSX.
- Restored previous suppression of Blueprint animations on popovers and tooltips. These had been unintentionally (re)enabled in v63 and are now turned off again.
- Adjusted (beta) APIs of OAuth-related
BaseOAuthClient,MsalClient, andAuthZeroClient.
- Adjusted (beta) API of
BaseOAuthClient. - Improved
FetchService.addDefaultHeaders()to support async functions.
- Adjusted (beta) API of
BaseOAuthClientand its approach to loading ID tokens.
Requires update to hoist-core >= 20.0.0 with multi-instance support.
- See the Hoist Core changelog for details on this major upgrade to Hoist's back-end capabilities.
- Client-side application changes should be minimal or non-existent, but the Hoist Admin Console has been updated extensively to support management of multiple instances within a cluster.
Requires update to @ag-grid >= 31.x, a new major AG Grid release with its own breaking changes.
See AG's What's New
and Upgrade Guide
for more details.
- AG Grid removed
ColumnApi, consolidating most of its methods toGridApi. Corresponding Hoist update removesGridModel.agColumnApi- review and migrate usages toGridModel.agApias appropriate. - Many methods on
agApiare replaced withagApi.updateGridOptions({property: value}). Review your app for any direct usages of the underlying AG API that might need to change. - All apps will need to update their
@ag-griddependencies withinpackage.jsonand make a minor update to theirBootstrapregistration as per this Toolbox example.GridandAgGridcomponents default toreactiveCustomComponents: true. If your app has custom tooltips or editors, you should confirm that they still work with this setting. (It will be the default in agGrid v32.)- For custom editors, you will have to convert them from "imperative" to "reactive". If this is
not possible, you can set
reactiveCustomComponents: falsein yourGridModelto continue using the old "imperative" mode, but note that this will preclude the use of upgraded Hoist editors in that same grid instance. (See the links below for AG docs on this change.) - For custom tooltips, note AG-Grid's deprecation of
getReactContainerClasses. - Consult the AG Grid docs for more information:
- Removed support for passing a plain object to the
modelprop of Hoist Components (previously deprecated back in v58). Use themodelConfigprop instead. - Removed the
multiFieldRendererutility function. This has been made internal and renamed tozoneGridRendererfor exclusive use by theZoneGridcomponent. - Updated CSS variables related to the
ZoneGridcomponent - vars formerly prefixed by--xh-grid-multifieldare now prefixed by--xh-zone-grid, several vars have been added, and some defaults have changed. - Removed obsolete
AppSpec.isSSOproperty in favor of two new propertiesAppSpec.enableLogoutandAppSpec.enableLoginForm. This should have no effect on the vast majority of apps which hadisSSOset totrue. For apps whereisSSOwas set tofalse, the new flags should be used to more clearly indicate the desired auth behavior.
- Improved mobile viewport handling to ensure that both standard pages and full screen dialogs respect "safe area" boundaries, avoiding overlap with system UI elements such as the iOS task switcher at the bottom of the screen. Also set background letterboxing color (to black) when in landscape mode for a more resolved-looking layout.
- Improved the inline grid
selectEditorto commit its value to the backing record as soon as an option is selected, rather than waiting for the user to click away from the cell. - Improved the display of Role details in the Admin Console. The detail panel for the selected role now includes a sub-tab listing all other roles inherited by the selected role, something that was previously accessible only via the linked graph visualization.
- Added new
checkboxRendererfor rendering booleans with a checkbox input look and feel. - Added new mobile
checkboxButton, an alternate input component for toggling boolean values. - Added beta version of a new Hoist
securitypackage, providing built-in support for OAuth flows. SeeBaseOAuthClient,MsalClient, andAuthZeroClientfor more information. Please note that package is being released as a beta and is subject to change before final release.
- Default mobile font size has been increased to 16px, both for better overall legibility and also
specifically for input elements to avoid triggering Safari's auto-zoom behavior on focus.
- Added new mobile-only CSS vars to allow for more granular control over font sizes:
--xh-mobile-input-font-size--xh-mobile-input-label-font-size--xh-mobile-input-height-px
- Increased height of mobile toolbars to better accommodate larger nested inputs.
- Grid font sizes have not changed, but other application layouts might need to be adjusted to ensure labels and other text elements fit as intended.
- Added new mobile-only CSS vars to allow for more granular control over font sizes:
- Mobile App Options dialog has been updated to use a full-screen
DialogPanelto provide a more native feel and better accommodate longer lists of app options.
- Fixed poor truncation / clipping behavior of the primary (right-side) metric in
ZoneGrid. Values that do not fit within the available width of the cell will now truncate their right edge and display an ellipsis to indicate they have been clipped. - Improved
RestGridModel.actionWarningbehavior to suppress any warning when the provided function returns a falsy value. - Fixed mobile
Toastintent styling.
- NumberEditor no longer activates on keypress of letter characters.
- Removed initial
pingcallFetchServiceinit. - Deprecated
FetchService.setDefaultHeadersand replaced with newaddDefaultHeadersmethod to support independent additions of default headers from multiple sources in an application.
- @ag-grid
30.x β 31.x - @auth0/auth0-spa-js
added @ 2.1 - @azure/msal-browser
added @ 3.14 - dompurify
3.0 β 3.1 - jwt-decode
added @ 4.0 - moment
2.29 β 2.30 - numbro
2.4 β 2.5 - qs
6.11 β 6.12 - semver
7.5 β 7.6
For versions prior to v64, see CHANGELOG-archive.md.