@xh/hoist 79.0.0-SNAPSHOT.1765206353828 → 79.0.0-SNAPSHOT.1765207418027

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -11,6 +11,14 @@
11
11
  ### 🐞 Bug Fixes
12
12
 
13
13
  * Defaulted Highcharts font to Hoist default (--xh-font-family)
14
+ * Tweaked `GridFindField` to forward a provided `ref` to its underlying `TextInput`.
15
+
16
+ ### ⚙️ Technical
17
+
18
+ * Removed the following previously deprecated configs as planned:
19
+ * `AppSpec.websocketsEnabled` - enabled by default, disable via `disableWebSockets`
20
+ * `GroupingChooserProps.popoverTitle` - use `editorTitle`
21
+ * `RelativeTimestampProps.options` - provide directly as top-level props
14
22
 
15
23
  ## 78.1.4 - 2025-12-05
16
24
 
@@ -7,12 +7,6 @@ interface RelativeTimestampProps extends HoistProps, BoxProps, RelativeTimestamp
7
7
  bind?: string;
8
8
  /** Date or milliseconds representing the starting time / time to compare. See also `bind`. */
9
9
  timestamp?: Date | number;
10
- /**
11
- * Formatting options.
12
- *
13
- * @deprecated - these options should be spread into this object directly.
14
- */
15
- options?: RelativeTimestampOptions;
16
10
  }
17
11
  export interface RelativeTimestampOptions {
18
12
  /** Allow dates greater than Date.now().*/
@@ -116,9 +116,7 @@ export declare class AppSpec<T extends HoistAppModel = HoistAppModel> {
116
116
  * initialized, including a breakdown of elapsed time throughout the init process.
117
117
  */
118
118
  trackAppLoad?: boolean;
119
- /** @deprecated - use {@link AppSpec.disableWebSockets} instead. */
120
- webSocketsEnabled?: boolean;
121
- constructor({ authModelClass, checkAccess, clientAppCode, clientAppName, componentClass, containerClass, disableWebSockets, enableXssProtection, enableLoginForm, enableLogout, idlePanel, isMobileApp, lockoutMessage, lockoutPanel, loginMessage, modelClass, showBrowserContextMenu, trackAppLoad, webSocketsEnabled }: {
119
+ constructor({ authModelClass, checkAccess, clientAppCode, clientAppName, componentClass, containerClass, disableWebSockets, enableXssProtection, enableLoginForm, enableLogout, idlePanel, isMobileApp, lockoutMessage, lockoutPanel, loginMessage, modelClass, showBrowserContextMenu, trackAppLoad }: {
122
120
  authModelClass?: typeof HoistAuthModel;
123
121
  checkAccess: any;
124
122
  clientAppCode?: string;
@@ -137,6 +135,5 @@ export declare class AppSpec<T extends HoistAppModel = HoistAppModel> {
137
135
  modelClass: any;
138
136
  showBrowserContextMenu?: boolean;
139
137
  trackAppLoad?: boolean;
140
- webSocketsEnabled: any;
141
138
  });
142
139
  }
@@ -20,8 +20,6 @@ export interface GroupingChooserProps extends ButtonProps<GroupingChooserModel>
20
20
  popoverMinHeight?: number;
21
21
  /** Position of popover relative to target button. */
22
22
  popoverPosition?: 'bottom' | 'top';
23
- /** @deprecated - use `editorTitle` instead */
24
- popoverTitle?: ReactNode;
25
23
  /**
26
24
  * Width in pixels of the popover menu itself.
27
25
  * If unspecified, will default based on favorites enabled status + side.
@@ -4,9 +4,6 @@
4
4
  *
5
5
  * Copyright © 2025 Extremely Heavy Industries Inc.
6
6
  */
7
- import {getLayoutProps} from '@xh/hoist/utils/react';
8
- import {inRange, isNil} from 'lodash';
9
- import moment from 'moment';
10
7
  import {box, span} from '@xh/hoist/cmp/layout';
11
8
  import {
12
9
  BoxProps,
@@ -21,7 +18,10 @@ import {fmtCompactDate, fmtDateTime} from '@xh/hoist/format';
21
18
  import {action, computed, makeObservable, observable} from '@xh/hoist/mobx';
22
19
  import {Timer} from '@xh/hoist/utils/async';
23
20
  import {DAYS, HOURS, LocalDate, SECONDS} from '@xh/hoist/utils/datetime';
24
- import {apiDeprecated, logWarn, withDefault} from '@xh/hoist/utils/js';
21
+ import {logWarn, withDefault} from '@xh/hoist/utils/js';
22
+ import {getLayoutProps} from '@xh/hoist/utils/react';
23
+ import {inRange, isNil} from 'lodash';
24
+ import moment from 'moment';
25
25
 
26
26
  interface RelativeTimestampProps extends HoistProps, BoxProps, RelativeTimestampOptions {
27
27
  /**
@@ -32,13 +32,6 @@ interface RelativeTimestampProps extends HoistProps, BoxProps, RelativeTimestamp
32
32
 
33
33
  /** Date or milliseconds representing the starting time / time to compare. See also `bind`. */
34
34
  timestamp?: Date | number;
35
-
36
- /**
37
- * Formatting options.
38
- *
39
- * @deprecated - these options should be spread into this object directly.
40
- */
41
- options?: RelativeTimestampOptions;
42
35
  }
43
36
 
44
37
  export interface RelativeTimestampOptions {
@@ -133,16 +126,7 @@ class RelativeTimestampLocalModel extends HoistModel {
133
126
 
134
127
  @computed.struct
135
128
  get options(): RelativeTimestampOptions {
136
- const {componentProps} = this;
137
-
138
- apiDeprecated('options', {
139
- test: componentProps.options,
140
- msg: 'Spread options directly in this object instead',
141
- v: `v78`,
142
- source: RelativeTimestamp
143
- });
144
-
145
- return componentProps.options ?? componentProps;
129
+ return this.componentProps as RelativeTimestampProps;
146
130
  }
147
131
 
148
132
  constructor() {
package/core/AppSpec.ts CHANGED
@@ -5,8 +5,8 @@
5
5
  * Copyright © 2025 Extremely Heavy Industries Inc.
6
6
  */
7
7
  import {ElementFactory, HoistAppModel, HoistAuthModel, HoistProps, XH} from '@xh/hoist/core';
8
- import {apiDeprecated, throwIf} from '@xh/hoist/utils/js';
9
- import {isFunction, isNil, isString, isUndefined} from 'lodash';
8
+ import {throwIf} from '@xh/hoist/utils/js';
9
+ import {isFunction, isNil, isString} from 'lodash';
10
10
  import {Component, ComponentClass, FunctionComponent} from 'react';
11
11
 
12
12
  /**
@@ -140,9 +140,6 @@ export class AppSpec<T extends HoistAppModel = HoistAppModel> {
140
140
  */
141
141
  trackAppLoad?: boolean;
142
142
 
143
- /** @deprecated - use {@link AppSpec.disableWebSockets} instead. */
144
- webSocketsEnabled?: boolean;
145
-
146
143
  constructor({
147
144
  authModelClass = HoistAuthModel,
148
145
  checkAccess,
@@ -161,8 +158,7 @@ export class AppSpec<T extends HoistAppModel = HoistAppModel> {
161
158
  loginMessage = null,
162
159
  modelClass,
163
160
  showBrowserContextMenu = false,
164
- trackAppLoad = true,
165
- webSocketsEnabled
161
+ trackAppLoad = true
166
162
  }) {
167
163
  throwIf(!componentClass, 'A Hoist App must define a componentClass');
168
164
 
@@ -180,17 +176,6 @@ export class AppSpec<T extends HoistAppModel = HoistAppModel> {
180
176
  'A Hoist App must specify a required role string or a function for checkAccess.'
181
177
  );
182
178
 
183
- if (!isUndefined(webSocketsEnabled)) {
184
- let msg: string;
185
- if (webSocketsEnabled === false) {
186
- disableWebSockets = true;
187
- msg = `Specify disableWebSockets: true to continue actively disabling WebSockets if required.`;
188
- } else {
189
- msg = `WebSockets are now enabled by default - this property can be safely removed from your appSpec.`;
190
- }
191
- apiDeprecated('webSocketsEnabled', {msg, v: 'v78'});
192
- }
193
-
194
179
  this.authModelClass = authModelClass;
195
180
  this.checkAccess = checkAccess;
196
181
  this.clientAppCode = clientAppCode;
@@ -209,6 +194,5 @@ export class AppSpec<T extends HoistAppModel = HoistAppModel> {
209
194
  this.modelClass = modelClass;
210
195
  this.showBrowserContextMenu = showBrowserContextMenu;
211
196
  this.trackAppLoad = trackAppLoad;
212
- this.webSocketsEnabled = !disableWebSockets;
213
197
  }
214
198
  }
@@ -4,6 +4,7 @@
4
4
  *
5
5
  * Copyright © 2025 Extremely Heavy Industries Inc.
6
6
  */
7
+ import composeRefs from '@seznam/compose-react-refs/composeRefs';
7
8
  import {GridModel} from '@xh/hoist/cmp/grid';
8
9
  import {hbox, span, vbox} from '@xh/hoist/cmp/layout';
9
10
  import {hoistCmp, LayoutProps, useLocalModel} from '@xh/hoist/core';
@@ -60,7 +61,7 @@ export interface GridFindFieldProps extends TextInputProps, LayoutProps {
60
61
  export const [GridFindField, gridFindField] = hoistCmp.withFactory<GridFindFieldProps>({
61
62
  displayName: 'GridFindField',
62
63
  className: 'xh-grid-find-field',
63
- render({className, model, ...props}) {
64
+ render({className, model, ...props}, ref) {
64
65
  let [layoutProps, restProps] = splitLayoutProps(props);
65
66
  const impl = useLocalModel(GridFindFieldImplModel);
66
67
 
@@ -72,7 +73,7 @@ export const [GridFindField, gridFindField] = hoistCmp.withFactory<GridFindField
72
73
  textInput({
73
74
  model: impl,
74
75
  bind: 'query',
75
- ref: impl.inputRef,
76
+ ref: composeRefs(impl.inputRef, ref),
76
77
  commitOnChange: true,
77
78
  leftIcon: Icon.search(),
78
79
  enableClear: true,
@@ -26,10 +26,10 @@ import {toolbar} from '@xh/hoist/desktop/cmp/toolbar';
26
26
  import {Icon} from '@xh/hoist/icon';
27
27
  import {menu, menuItem, popover} from '@xh/hoist/kit/blueprint';
28
28
  import {dragDropContext, draggable, droppable} from '@xh/hoist/kit/react-beautiful-dnd';
29
- import {apiDeprecated, elemWithin, getTestId} from '@xh/hoist/utils/js';
29
+ import {elemWithin, getTestId} from '@xh/hoist/utils/js';
30
30
  import {splitLayoutProps} from '@xh/hoist/utils/react';
31
31
  import classNames from 'classnames';
32
- import {isEmpty, isNil, isUndefined} from 'lodash';
32
+ import {isEmpty, isNil} from 'lodash';
33
33
  import './GroupingChooser.scss';
34
34
  import {ReactNode} from 'react';
35
35
 
@@ -55,9 +55,6 @@ export interface GroupingChooserProps extends ButtonProps<GroupingChooserModel>
55
55
  /** Position of popover relative to target button. */
56
56
  popoverPosition?: 'bottom' | 'top';
57
57
 
58
- /** @deprecated - use `editorTitle` instead */
59
- popoverTitle?: ReactNode;
60
-
61
58
  /**
62
59
  * Width in pixels of the popover menu itself.
63
60
  * If unspecified, will default based on favorites enabled status + side.
@@ -89,7 +86,6 @@ export const [GroupingChooser, groupingChooser] = hoistCmp.withFactory<GroupingC
89
86
  favoritesTitle = 'Favorites',
90
87
  popoverWidth,
91
88
  popoverMinHeight,
92
- popoverTitle,
93
89
  popoverPosition = 'bottom',
94
90
  styleButtonAsInput = true,
95
91
  testId,
@@ -104,15 +100,6 @@ export const [GroupingChooser, groupingChooser] = hoistCmp.withFactory<GroupingC
104
100
  favesClassNameMod = `faves-${persistFavorites ? favoritesSide : 'disabled'}`,
105
101
  favesTB = isTB(favoritesSide);
106
102
 
107
- if (!isUndefined(popoverTitle)) {
108
- apiDeprecated('GroupingChooser.popoverTitle', {
109
- msg: `Update to use 'editorTitle' instead`,
110
- v: `v78`,
111
- source: GroupingChooser
112
- });
113
- editorTitle = popoverTitle;
114
- }
115
-
116
103
  popoverWidth = popoverWidth || (persistFavorites && !favesTB ? 500 : 250);
117
104
 
118
105
  return box({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xh/hoist",
3
- "version": "79.0.0-SNAPSHOT.1765206353828",
3
+ "version": "79.0.0-SNAPSHOT.1765207418027",
4
4
  "description": "Hoist add-on for building and deploying React Applications.",
5
5
  "repository": "github:xh/hoist-react",
6
6
  "homepage": "https://xh.io",