@xh/hoist 79.0.0-SNAPSHOT.1764976082522 → 79.0.0-SNAPSHOT.1765206592110

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
@@ -2,10 +2,23 @@
2
2
 
3
3
  ## 79.0.0-SNAPSHOT - unreleased
4
4
 
5
+ ### 💥 Breaking Changes
6
+
7
+ * Renamed `GridModel.applyColumnStateChanges()` to `updateColumnState()` for clarity and better
8
+ symmetry with `setColumnState()`. The prior method remains as an alias but is now deprecated and
9
+ scheduled for removal in v82.
10
+
5
11
  ### 🐞 Bug Fixes
6
12
 
7
13
  * Defaulted Highcharts font to Hoist default (--xh-font-family)
8
14
 
15
+ ### ⚙️ Technical
16
+
17
+ * Removed the following previously deprecated configs as planned:
18
+ * `AppSpec.websocketsEnabled` - enabled by default, disable via `disableWebSockets`
19
+ * `GroupingChooserProps.popoverTitle` - use `editorTitle`
20
+ * `RelativeTimestampProps.options` - provide directly as top-level props
21
+
9
22
  ## 78.1.4 - 2025-12-05
10
23
 
11
24
  ### 🐞 Bug Fixes
@@ -1,9 +1,9 @@
1
- import { CellClickedEvent, CellContextMenuEvent, CellDoubleClickedEvent, CellEditingStartedEvent, CellEditingStoppedEvent, AgColumnState, RowClickedEvent, RowDoubleClickedEvent } from '@xh/hoist/kit/ag-grid';
2
1
  import { AgGridModel } from '@xh/hoist/cmp/ag-grid';
3
2
  import { Column, ColumnGroup, ColumnGroupSpec, ColumnSpec, GridAutosizeMode, GridFilterModelConfig, GridGroupSortFn, TreeStyle } from '@xh/hoist/cmp/grid';
4
3
  import { GridFilterModel } from '@xh/hoist/cmp/grid/filter/GridFilterModel';
5
4
  import { Awaitable, HoistModel, HSide, PlainObject, SizingMode, Some, TaskObserver, Thunkable, VSide } from '@xh/hoist/core';
6
5
  import { Store, StoreConfig, StoreRecord, StoreRecordId, StoreRecordOrId, StoreSelectionConfig, StoreSelectionModel, StoreTransaction } from '@xh/hoist/data';
6
+ import { AgColumnState, CellClickedEvent, CellContextMenuEvent, CellDoubleClickedEvent, CellEditingStartedEvent, CellEditingStoppedEvent, RowClickedEvent, RowDoubleClickedEvent } from '@xh/hoist/kit/ag-grid';
7
7
  import { ExportOptions } from '@xh/hoist/svc/GridExportService';
8
8
  import { ReactNode, RefObject } from 'react';
9
9
  import { GridAutosizeOptions } from './GridAutosizeOptions';
@@ -483,6 +483,8 @@ export declare class GridModel extends HoistModel {
483
483
  * @param colStateChanges - changes to apply to the columns. If all leaf
484
484
  * columns are represented in these changes then the sort order will be applied as well.
485
485
  */
486
+ updateColumnState(colStateChanges: Partial<ColumnState>[]): void;
487
+ /** @deprecated - use {@link updateColumnState} instead. */
486
488
  applyColumnStateChanges(colStateChanges: Partial<ColumnState>[]): void;
487
489
  getColumn(colId: string): Column;
488
490
  getColumnGroup(groupId: string): ColumnGroup;
@@ -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,17 +4,6 @@
4
4
  *
5
5
  * Copyright © 2025 Extremely Heavy Industries Inc.
6
6
  */
7
- import {
8
- CellClickedEvent,
9
- CellContextMenuEvent,
10
- CellDoubleClickedEvent,
11
- CellEditingStartedEvent,
12
- CellEditingStoppedEvent,
13
- ColumnEvent,
14
- AgColumnState,
15
- RowClickedEvent,
16
- RowDoubleClickedEvent
17
- } from '@xh/hoist/kit/ag-grid';
18
7
  import {AgGridModel} from '@xh/hoist/cmp/ag-grid';
19
8
  import {
20
9
  Column,
@@ -56,15 +45,27 @@ import {
56
45
  import {ColChooserModel as DesktopColChooserModel} from '@xh/hoist/dynamics/desktop';
57
46
  import {ColChooserModel as MobileColChooserModel} from '@xh/hoist/dynamics/mobile';
58
47
  import {Icon} from '@xh/hoist/icon';
48
+ import {
49
+ AgColumnState,
50
+ CellClickedEvent,
51
+ CellContextMenuEvent,
52
+ CellDoubleClickedEvent,
53
+ CellEditingStartedEvent,
54
+ CellEditingStoppedEvent,
55
+ ColumnEvent,
56
+ RowClickedEvent,
57
+ RowDoubleClickedEvent
58
+ } from '@xh/hoist/kit/ag-grid';
59
59
  import {action, bindable, makeObservable, observable, when} from '@xh/hoist/mobx';
60
60
  import {wait, waitFor} from '@xh/hoist/promise';
61
61
  import {ExportOptions} from '@xh/hoist/svc/GridExportService';
62
62
  import {SECONDS} from '@xh/hoist/utils/datetime';
63
63
  import {
64
- sharePendingPromise,
64
+ apiDeprecated,
65
65
  deepFreeze,
66
66
  executeIfFunction,
67
67
  logWithDebug,
68
+ sharePendingPromise,
68
69
  throwIf,
69
70
  warnIf,
70
71
  withDefault
@@ -1183,7 +1184,7 @@ export class GridModel extends HoistModel {
1183
1184
  );
1184
1185
 
1185
1186
  pull(colStateChanges, null);
1186
- this.applyColumnStateChanges(colStateChanges);
1187
+ this.updateColumnState(colStateChanges);
1187
1188
  }
1188
1189
 
1189
1190
  @action
@@ -1214,7 +1215,7 @@ export class GridModel extends HoistModel {
1214
1215
  const col = this.findColumn(this.columns, colId);
1215
1216
  if (!width || !col || col.flex) return;
1216
1217
  const colStateChanges = [{colId, width, manuallySized: true}];
1217
- this.applyColumnStateChanges(colStateChanges);
1218
+ this.updateColumnState(colStateChanges);
1218
1219
  }
1219
1220
 
1220
1221
  /**
@@ -1230,7 +1231,7 @@ export class GridModel extends HoistModel {
1230
1231
  * columns are represented in these changes then the sort order will be applied as well.
1231
1232
  */
1232
1233
  @action
1233
- applyColumnStateChanges(colStateChanges: Partial<ColumnState>[]) {
1234
+ updateColumnState(colStateChanges: Partial<ColumnState>[]): void {
1234
1235
  if (isEmpty(colStateChanges)) return;
1235
1236
 
1236
1237
  let columnState = cloneDeep(this.columnState);
@@ -1260,6 +1261,16 @@ export class GridModel extends HoistModel {
1260
1261
  }
1261
1262
  }
1262
1263
 
1264
+ /** @deprecated - use {@link updateColumnState} instead. */
1265
+ applyColumnStateChanges(colStateChanges: Partial<ColumnState>[]): void {
1266
+ apiDeprecated('GridModel.applyColumnStateChanges()', {
1267
+ msg: 'Use updateColumnState() instead.',
1268
+ v: '82',
1269
+ source: GridModel
1270
+ });
1271
+ this.updateColumnState(colStateChanges);
1272
+ }
1273
+
1263
1274
  getColumn(colId: string): Column {
1264
1275
  return this.findColumn(this.columns, colId);
1265
1276
  }
@@ -1295,7 +1306,7 @@ export class GridModel extends HoistModel {
1295
1306
  }
1296
1307
 
1297
1308
  setColumnVisible(colId: string, visible: boolean) {
1298
- this.applyColumnStateChanges([{colId, hidden: !visible}]);
1309
+ this.updateColumnState([{colId, hidden: !visible}]);
1299
1310
  }
1300
1311
 
1301
1312
  showColumn(colId: string) {
@@ -1307,7 +1318,7 @@ export class GridModel extends HoistModel {
1307
1318
  }
1308
1319
 
1309
1320
  setColumnGroupVisible(groupId: string, visible: boolean) {
1310
- this.applyColumnStateChanges(
1321
+ this.updateColumnState(
1311
1322
  this.getColumnGroup(groupId)
1312
1323
  .getLeafColumns()
1313
1324
  .map(({colId}) => ({colId, hidden: !visible}))
@@ -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
  }
@@ -95,7 +95,7 @@ export class ColChooserModel extends HoistModel {
95
95
  }
96
96
  });
97
97
 
98
- gridModel.applyColumnStateChanges(colChanges);
98
+ gridModel.updateColumnState(colChanges);
99
99
  if (autosizeOnCommit && colChanges.length) gridModel.autosizeAsync({showMask: true});
100
100
  }
101
101
 
@@ -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({
@@ -132,7 +132,7 @@ export class ColChooserModel extends HoistModel {
132
132
  return {colId, hidden, pinned};
133
133
  });
134
134
 
135
- gridModel.applyColumnStateChanges(colChanges);
135
+ gridModel.updateColumnState(colChanges);
136
136
  if (autosizeOnCommit) gridModel.autosizeAsync({showMask: true});
137
137
  }
138
138
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xh/hoist",
3
- "version": "79.0.0-SNAPSHOT.1764976082522",
3
+ "version": "79.0.0-SNAPSHOT.1765206592110",
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",
@@ -79,7 +79,7 @@ export class GridAutosizeService extends HoistService {
79
79
 
80
80
  runInAction(() => {
81
81
  // Apply calculated widths to grid.
82
- gridModel.applyColumnStateChanges(requiredWidths);
82
+ gridModel.updateColumnState(requiredWidths);
83
83
  this.logDebug(
84
84
  `Auto-sized ${requiredWidths.length} columns`,
85
85
  `${records.length} records`
@@ -94,7 +94,7 @@ export class GridAutosizeService extends HoistService {
94
94
  fillMode,
95
95
  asManuallySized
96
96
  );
97
- gridModel.applyColumnStateChanges(fillWidths);
97
+ gridModel.updateColumnState(fillWidths);
98
98
  this.logDebug(`Auto-sized ${fillWidths.length} columns using fillMode`);
99
99
  }
100
100
  });