@xh/hoist 73.0.0-SNAPSHOT.1746195895077 → 73.0.0-SNAPSHOT.1746205425691
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
|
@@ -9,19 +9,19 @@ and new properties on `TrackLog`.
|
|
|
9
9
|
|
|
10
10
|
### 🎁 New Features
|
|
11
11
|
|
|
12
|
-
* Added a new "Clients"
|
|
12
|
+
* Added a new Admin Console "Clients" tab - a consolidated view of all websocket-connected clients
|
|
13
13
|
across all instances in the cluster.
|
|
14
|
-
*
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
14
|
+
* Significantly upgraded the Admin Console "User Activity" tab with:
|
|
15
|
+
* Persisted custom views via `ViewManager`.
|
|
16
|
+
* New ability to promote data in `data` block to grids for aggregation, reporting and charting.
|
|
17
|
+
* Enhanced track messages with new `tabId` and `loadId` properties, to disambiguate activity for
|
|
18
|
+
users with multiple browser tabs and multiple full refreshes/restarts of a client app within
|
|
19
|
+
the same tab.
|
|
20
|
+
* Improved charting, with a column chart used for both timeseries and category data and fixes to
|
|
21
|
+
the "skip weekends" option.
|
|
21
22
|
* Updated `FormModel` to support `persistWith` for storing and recalling its values, including
|
|
22
23
|
developer options to persist all or a provided subset of fields.
|
|
23
24
|
|
|
24
|
-
|
|
25
25
|
### 🐞 Bug Fixes
|
|
26
26
|
|
|
27
27
|
* Fixed drag-and-drop usability issues with the mobile `ColChooser`.
|
|
@@ -30,8 +30,8 @@ and new properties on `TrackLog`.
|
|
|
30
30
|
|
|
31
31
|
### ⚙️ Typescript API Adjustments
|
|
32
32
|
|
|
33
|
-
* Corrected `StoreCountLabelProps` interface.
|
|
34
33
|
* Corrected `GridGroupSortFn` param types.
|
|
34
|
+
* Corrected `StoreCountLabelProps` interface.
|
|
35
35
|
|
|
36
36
|
### ⚙️ Technical
|
|
37
37
|
|
|
@@ -43,8 +43,8 @@ and new properties on `TrackLog`.
|
|
|
43
43
|
the client remained on an older version.
|
|
44
44
|
* Note that a misconfigured build - where the client build version is not set to the same value
|
|
45
45
|
as the server - would result in a false positive for an upgrade. The two should always match.
|
|
46
|
-
*
|
|
47
|
-
|
|
46
|
+
* Calls to `Promise.track()` that are rejected with an exception will be tracked with new
|
|
47
|
+
severity level of `TrackSeverity.ERROR`
|
|
48
48
|
|
|
49
49
|
## v72.5.1 - 2025-04-15
|
|
50
50
|
|
|
@@ -27,10 +27,6 @@ export interface NavigatorConfig {
|
|
|
27
27
|
* See enum for description of supported modes.
|
|
28
28
|
*/
|
|
29
29
|
refreshMode?: RefreshMode;
|
|
30
|
-
/**
|
|
31
|
-
* Base route name for this navigator, with the route for each page being "[route]/[page.id]".
|
|
32
|
-
*/
|
|
33
|
-
route?: string;
|
|
34
30
|
}
|
|
35
31
|
/**
|
|
36
32
|
* Model for handling stack-based navigation between pages.
|
|
@@ -38,8 +34,6 @@ export interface NavigatorConfig {
|
|
|
38
34
|
*/
|
|
39
35
|
export declare class NavigatorModel extends HoistModel {
|
|
40
36
|
disableAppRefreshButton: boolean;
|
|
41
|
-
readonly route: string;
|
|
42
|
-
readonly routePrefix: string;
|
|
43
37
|
stack: PageModel[];
|
|
44
38
|
pages: PageConfig[];
|
|
45
39
|
track: boolean;
|
|
@@ -55,7 +49,7 @@ export declare class NavigatorModel extends HoistModel {
|
|
|
55
49
|
get activePageIdx(): number;
|
|
56
50
|
get allowSlideNext(): boolean;
|
|
57
51
|
get allowSlidePrev(): boolean;
|
|
58
|
-
constructor({ pages,
|
|
52
|
+
constructor({ pages, track, pullDownToRefresh, transitionMs, renderMode, refreshMode }: NavigatorConfig);
|
|
59
53
|
/**
|
|
60
54
|
* @param callback - function to execute (once) after the next page transition.
|
|
61
55
|
*/
|
|
@@ -144,10 +144,10 @@ export class TabContainerModel extends HoistModel implements Persistable<{active
|
|
|
144
144
|
this.refreshContextModel.xhImpl = xhImpl;
|
|
145
145
|
|
|
146
146
|
if (route) {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
147
|
+
if (XH.isMobileApp) {
|
|
148
|
+
this.logWarn('TabContainer routing is not supported for mobile applications.');
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
151
|
|
|
152
152
|
this.addReaction({
|
|
153
153
|
track: () => XH.routerState,
|
|
@@ -356,11 +356,8 @@ export class TabContainerModel extends HoistModel implements Persistable<{active
|
|
|
356
356
|
{router} = XH,
|
|
357
357
|
state = router.getState();
|
|
358
358
|
|
|
359
|
-
console.log('syncWithRouter', state, router.isActive(route));
|
|
360
|
-
|
|
361
359
|
if (state && router.isActive(route)) {
|
|
362
360
|
const tab = tabs.find(t => router.isActive(route + '.' + t.id, state.params));
|
|
363
|
-
console.log('activating', tab);
|
|
364
361
|
if (tab && !tab.isActive && !tab.disabled) {
|
|
365
362
|
this.setActiveTabIdInternal(tab.id);
|
|
366
363
|
}
|
|
@@ -44,11 +44,6 @@ export interface NavigatorConfig {
|
|
|
44
44
|
* See enum for description of supported modes.
|
|
45
45
|
*/
|
|
46
46
|
refreshMode?: RefreshMode;
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Base route name for this navigator, with the route for each page being "[route]/[page.id]".
|
|
50
|
-
*/
|
|
51
|
-
route?: string;
|
|
52
47
|
}
|
|
53
48
|
|
|
54
49
|
/**
|
|
@@ -58,9 +53,6 @@ export interface NavigatorConfig {
|
|
|
58
53
|
export class NavigatorModel extends HoistModel {
|
|
59
54
|
@bindable disableAppRefreshButton: boolean;
|
|
60
55
|
|
|
61
|
-
readonly route: string;
|
|
62
|
-
readonly routePrefix: string;
|
|
63
|
-
|
|
64
56
|
@bindable.ref
|
|
65
57
|
stack: PageModel[] = [];
|
|
66
58
|
|
|
@@ -97,7 +89,6 @@ export class NavigatorModel extends HoistModel {
|
|
|
97
89
|
|
|
98
90
|
constructor({
|
|
99
91
|
pages,
|
|
100
|
-
route,
|
|
101
92
|
track = false,
|
|
102
93
|
pullDownToRefresh = true,
|
|
103
94
|
transitionMs = 500,
|
|
@@ -110,10 +101,6 @@ export class NavigatorModel extends HoistModel {
|
|
|
110
101
|
ensureNotEmpty(pages, 'NavigatorModel needs at least one page.');
|
|
111
102
|
ensureUniqueBy(pages, 'id', 'Multiple NavigatorModel PageModels have the same id.');
|
|
112
103
|
|
|
113
|
-
this.route = route ?? '';
|
|
114
|
-
this.routePrefix = route ? route.substring(0, route.lastIndexOf('.') + 1) : '';
|
|
115
|
-
console.log(this.route, this.routePrefix);
|
|
116
|
-
|
|
117
104
|
this.pages = pages;
|
|
118
105
|
this.track = track;
|
|
119
106
|
this.pullDownToRefresh = pullDownToRefresh;
|
|
@@ -212,22 +199,19 @@ export class NavigatorModel extends HoistModel {
|
|
|
212
199
|
swiper.allowTouchMove = false;
|
|
213
200
|
});
|
|
214
201
|
|
|
215
|
-
console.log('swiper change');
|
|
216
202
|
this.onRouteChange(true);
|
|
217
203
|
}
|
|
218
204
|
|
|
219
205
|
/** @internal */
|
|
220
206
|
@action
|
|
221
207
|
onPageChange = () => {
|
|
222
|
-
console.log('onPageChange');
|
|
223
208
|
// 1) Clear any pages after the active page. These can be left over from a back swipe.
|
|
224
209
|
this.stack = this.stack.slice(0, this._swiper.activeIndex + 1);
|
|
225
210
|
|
|
226
211
|
// 2) Sync route to match the current page stack
|
|
227
|
-
const newRouteName = this.
|
|
212
|
+
const newRouteName = this.stack.map(it => it.id).join('.'),
|
|
228
213
|
newRouteParams = mergeDeep({}, ...this.stack.map(it => it.props));
|
|
229
214
|
|
|
230
|
-
console.log('newRouteName', newRouteName);
|
|
231
215
|
XH.navigate(newRouteName, newRouteParams);
|
|
232
216
|
|
|
233
217
|
// 3) Update state according to the active page and trigger optional callback
|
|
@@ -242,18 +226,16 @@ export class NavigatorModel extends HoistModel {
|
|
|
242
226
|
};
|
|
243
227
|
|
|
244
228
|
private onRouteChange(init: boolean = false) {
|
|
245
|
-
|
|
246
|
-
console.log('onRouteChange', XH.router.isActive(myRoute));
|
|
247
|
-
if (!XH.routerState || (myRoute && !XH.router.isActive(myRoute)) || !_swiper) return;
|
|
229
|
+
if (!this._swiper || !XH.routerState) return;
|
|
248
230
|
|
|
249
|
-
// Break the current route name into parts,
|
|
250
|
-
//
|
|
251
|
-
//
|
|
231
|
+
// Break the current route name into parts, and collect any params for each part.
|
|
232
|
+
// Use meta.params to determine which params are associated with each route part.
|
|
233
|
+
// Save these params to use as props for the page.
|
|
252
234
|
const {meta, name, params} = XH.routerState,
|
|
253
|
-
parts = name.
|
|
235
|
+
parts = name.split('.');
|
|
254
236
|
|
|
255
237
|
const routeParts = parts.map((id, idx) => {
|
|
256
|
-
const metaKey =
|
|
238
|
+
const metaKey = parts.slice(0, idx + 1).join('.'),
|
|
257
239
|
props = {};
|
|
258
240
|
|
|
259
241
|
// Extract props for this part
|
|
@@ -263,7 +245,6 @@ export class NavigatorModel extends HoistModel {
|
|
|
263
245
|
|
|
264
246
|
return {id, props};
|
|
265
247
|
});
|
|
266
|
-
console.log(myRoutePrefix, XH.routerState, parts, routeParts);
|
|
267
248
|
|
|
268
249
|
// Loop through the route parts, rebuilding the page stack to match.
|
|
269
250
|
const stack = [];
|
|
@@ -281,7 +262,7 @@ export class NavigatorModel extends HoistModel {
|
|
|
281
262
|
// we drop the rest of the route and redirect to the route so far
|
|
282
263
|
if (init && pageModelCfg.disableDirectLink) {
|
|
283
264
|
const completedRouteParts = routeParts.slice(0, i),
|
|
284
|
-
newRouteName =
|
|
265
|
+
newRouteName = completedRouteParts.map(it => it.id).join('.'),
|
|
285
266
|
newRouteParams = mergeDeep({}, ...completedRouteParts.map(it => it.props));
|
|
286
267
|
|
|
287
268
|
XH.navigate(newRouteName, newRouteParams, {replace: true});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xh/hoist",
|
|
3
|
-
"version": "73.0.0-SNAPSHOT.
|
|
3
|
+
"version": "73.0.0-SNAPSHOT.1746205425691",
|
|
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",
|