@xh/hoist 73.0.0-SNAPSHOT.1746554302414 → 73.0.0-SNAPSHOT.1746560538636

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.
@@ -14,11 +14,13 @@ export const createdTime: ColumnSpec = {
14
14
  type: 'date',
15
15
  displayName: 'Created'
16
16
  },
17
+ chooserGroup: 'Connection',
17
18
  ...Col.compactDate
18
19
  };
19
20
 
20
21
  export const isOpen: ColumnSpec = {
21
22
  field: {name: 'isOpen', type: 'bool'},
23
+ chooserGroup: 'Connection',
22
24
  headerName: '',
23
25
  align: 'center',
24
26
  width: 40,
@@ -34,6 +36,7 @@ export const key: ColumnSpec = {
34
36
  type: 'string',
35
37
  displayName: 'Channel Key'
36
38
  },
39
+ chooserGroup: 'Connection',
37
40
  width: 160
38
41
  };
39
42
 
@@ -43,6 +46,7 @@ export const lastReceivedTime: ColumnSpec = {
43
46
  type: 'date',
44
47
  displayName: 'Last Received'
45
48
  },
49
+ chooserGroup: 'Send/Receive',
46
50
  ...Col.compactDate,
47
51
  width: 140
48
52
  };
@@ -53,6 +57,7 @@ export const lastSentTime: ColumnSpec = {
53
57
  type: 'date',
54
58
  displayName: 'Last Sent'
55
59
  },
60
+ chooserGroup: 'Send/Receive',
56
61
  ...Col.compactDate,
57
62
  width: 140
58
63
  };
@@ -63,6 +68,7 @@ export const receivedMessageCount: ColumnSpec = {
63
68
  type: 'int',
64
69
  displayName: 'Received'
65
70
  },
71
+ chooserGroup: 'Send/Receive',
66
72
  ...Col.number,
67
73
  width: 90
68
74
  };
@@ -73,6 +79,7 @@ export const sentMessageCount: ColumnSpec = {
73
79
  type: 'int',
74
80
  displayName: 'Sent'
75
81
  },
82
+ chooserGroup: 'Send/Receive',
76
83
  ...Col.number,
77
84
  width: 90
78
85
  };
@@ -18,9 +18,11 @@ const autosizeMaxWidth = 400;
18
18
  export const appBuild: ColumnSpec = {
19
19
  field: {
20
20
  name: 'appBuild',
21
- displayName: 'Build',
21
+ displayName: 'App Build',
22
22
  type: 'string'
23
23
  },
24
+ headerName: 'Build',
25
+ chooserGroup: 'Client App / Browser',
24
26
  width: 120
25
27
  };
26
28
 
@@ -30,15 +32,18 @@ export const appEnvironment: ColumnSpec = {
30
32
  type: 'string',
31
33
  displayName: 'Environment'
32
34
  },
35
+ chooserGroup: 'Core Data',
33
36
  width: 130
34
37
  };
35
38
 
36
39
  export const appVersion: ColumnSpec = {
37
40
  field: {
38
41
  name: 'appVersion',
39
- displayName: 'Version',
42
+ displayName: 'App Version',
40
43
  type: 'string'
41
44
  },
45
+ headerName: 'Version',
46
+ chooserGroup: 'Client App / Browser',
42
47
  width: 120
43
48
  };
44
49
 
@@ -49,6 +54,7 @@ export const browser: ColumnSpec = {
49
54
  isDimension: true,
50
55
  aggregator: 'UNIQUE'
51
56
  },
57
+ chooserGroup: 'Client App / Browser',
52
58
  width: 100
53
59
  };
54
60
 
@@ -59,6 +65,7 @@ export const category: ColumnSpec = {
59
65
  isDimension: true,
60
66
  aggregator: 'UNIQUE'
61
67
  },
68
+ chooserGroup: 'Core Data',
62
69
  width: 100
63
70
  };
64
71
 
@@ -68,6 +75,7 @@ export const correlationId: ColumnSpec = {
68
75
  type: 'string',
69
76
  displayName: 'Correlation ID'
70
77
  },
78
+ chooserGroup: 'Core Data',
71
79
  renderer: badgeRenderer,
72
80
  width: 180,
73
81
  autosizeBufferPx: 20
@@ -75,6 +83,7 @@ export const correlationId: ColumnSpec = {
75
83
 
76
84
  export const data: ColumnSpec = {
77
85
  field: {name: 'data', type: 'json'},
86
+ chooserGroup: 'Core Data',
78
87
  width: 250,
79
88
  autosizeMaxWidth
80
89
  };
@@ -86,6 +95,7 @@ export const day: ColumnSpec = {
86
95
  isDimension: true
87
96
  },
88
97
  ...Col.localDate,
98
+ chooserGroup: 'Core Data',
89
99
  displayName: 'App Day'
90
100
  };
91
101
 
@@ -96,6 +106,7 @@ export const dayRange: ColumnSpec = {
96
106
  aggregator: new RangeAggregator(),
97
107
  displayName: 'App Day Range'
98
108
  },
109
+ chooserGroup: 'Core Data',
99
110
  align: 'right',
100
111
  width: 200,
101
112
  renderer: dayRangeRenderer,
@@ -110,11 +121,13 @@ export const device: ColumnSpec = {
110
121
  isDimension: true,
111
122
  aggregator: 'UNIQUE'
112
123
  },
124
+ chooserGroup: 'Client App / Browser',
113
125
  width: 100
114
126
  };
115
127
 
116
128
  export const deviceIcon: ColumnSpec = {
117
129
  field: device.field,
130
+ chooserGroup: 'Client App / Browser',
118
131
  headerName: Icon.desktop(),
119
132
  headerTooltip: 'Device',
120
133
  tooltip: true,
@@ -139,19 +152,32 @@ export const deviceIcon: ColumnSpec = {
139
152
  }
140
153
  };
141
154
 
155
+ export const elapsedRenderer = numberRenderer({
156
+ label: 'ms',
157
+ nullDisplay: '-',
158
+ formatConfig: {thousandSeparated: false, mantissa: 0}
159
+ });
160
+
142
161
  export const elapsed: ColumnSpec = {
143
162
  field: {
144
163
  name: 'elapsed',
145
164
  type: 'int',
146
165
  aggregator: 'AVG'
147
166
  },
167
+ chooserGroup: 'Core Data',
148
168
  width: 130,
149
- align: 'right',
150
- renderer: numberRenderer({
151
- label: 'ms',
152
- nullDisplay: '-',
153
- formatConfig: {thousandSeparated: false, mantissa: 0}
154
- })
169
+ renderer: elapsedRenderer
170
+ };
171
+
172
+ export const elapsedMax: ColumnSpec = {
173
+ field: {
174
+ name: 'elapsedMax',
175
+ type: 'int',
176
+ aggregator: 'MAX'
177
+ },
178
+ chooserGroup: 'Core Data',
179
+ width: 130,
180
+ renderer: elapsedRenderer
155
181
  };
156
182
 
157
183
  export const entryCount: ColumnSpec = {
@@ -161,6 +187,7 @@ export const entryCount: ColumnSpec = {
161
187
  displayName: 'Entries',
162
188
  aggregator: 'LEAF_COUNT'
163
189
  },
190
+ chooserGroup: 'Core Data',
164
191
  width: 80,
165
192
  align: 'right'
166
193
  };
@@ -171,6 +198,7 @@ export const entryId: ColumnSpec = {
171
198
  type: 'int',
172
199
  displayName: 'Entry ID'
173
200
  },
201
+ chooserGroup: 'Core Data',
174
202
  width: 100,
175
203
  align: 'right'
176
204
  };
@@ -180,11 +208,32 @@ export const error: ColumnSpec = {
180
208
  name: 'error',
181
209
  type: 'string'
182
210
  },
211
+ chooserGroup: 'Errors',
183
212
  width: 250,
184
213
  autosizeMaxWidth,
185
214
  renderer: e => fmtSpan(e, {className: 'xh-font-family-mono xh-font-size-small'})
186
215
  };
187
216
 
217
+ export const errorMessage: ColumnSpec = {
218
+ field: {
219
+ name: 'errorMessage',
220
+ type: 'string'
221
+ },
222
+ chooserGroup: 'Errors',
223
+ width: 250,
224
+ autosizeMaxWidth
225
+ };
226
+
227
+ export const errorName: ColumnSpec = {
228
+ field: {
229
+ name: 'errorName',
230
+ type: 'string'
231
+ },
232
+ chooserGroup: 'Errors',
233
+ width: 150,
234
+ autosizeMaxWidth
235
+ };
236
+
188
237
  export const instance: ColumnSpec = {
189
238
  field: {
190
239
  name: 'instance',
@@ -192,6 +241,7 @@ export const instance: ColumnSpec = {
192
241
  isDimension: true,
193
242
  aggregator: 'UNIQUE'
194
243
  },
244
+ chooserGroup: 'Session IDs',
195
245
  renderer: badgeRenderer,
196
246
  width: 100
197
247
  };
@@ -201,6 +251,7 @@ export const loadId: ColumnSpec = {
201
251
  name: 'loadId',
202
252
  type: 'string'
203
253
  },
254
+ chooserGroup: 'Session IDs',
204
255
  ...badgeCol
205
256
  };
206
257
 
@@ -212,6 +263,7 @@ export const msg: ColumnSpec = {
212
263
  isDimension: true,
213
264
  aggregator: 'UNIQUE'
214
265
  },
266
+ chooserGroup: 'Core Data',
215
267
  width: 250,
216
268
  autosizeMaxWidth
217
269
  };
@@ -223,6 +275,7 @@ export const severity: ColumnSpec = {
223
275
  isDimension: true,
224
276
  aggregator: 'UNIQUE'
225
277
  },
278
+ chooserGroup: 'Core Data',
226
279
  width: 80
227
280
  };
228
281
 
@@ -259,6 +312,7 @@ export const tabId: ColumnSpec = {
259
312
  name: 'tabId',
260
313
  type: 'string'
261
314
  },
315
+ chooserGroup: 'Session IDs',
262
316
  ...badgeCol
263
317
  };
264
318
 
@@ -268,12 +322,14 @@ export const url: ColumnSpec = {
268
322
  type: 'string',
269
323
  displayName: 'URL'
270
324
  },
325
+ chooserGroup: 'Client App / Browser',
271
326
  width: 250,
272
327
  autosizeMaxWidth
273
328
  };
274
329
 
275
330
  export const urlPathOnly: ColumnSpec = {
276
331
  field: url.field,
332
+ chooserGroup: 'Client App / Browser',
277
333
  width: 250,
278
334
  autosizeMaxWidth,
279
335
  tooltip: true,
@@ -295,6 +351,7 @@ export const userAgent: ColumnSpec = {
295
351
  isDimension: true,
296
352
  aggregator: 'UNIQUE'
297
353
  },
354
+ chooserGroup: 'Client App / Browser',
298
355
  width: 130,
299
356
  autosizeMaxWidth
300
357
  };
@@ -304,6 +361,7 @@ export const userAlertedFlag: ColumnSpec = {
304
361
  headerName: Icon.window(),
305
362
  headerTooltip:
306
363
  'Indicates if the user was shown an interactive alert when this error was triggered.',
364
+ chooserGroup: 'Errors',
307
365
  resizable: false,
308
366
  align: 'center',
309
367
  width: 50,
@@ -316,6 +374,7 @@ export const userMessageFlag: ColumnSpec = {
316
374
  headerName: Icon.comment(),
317
375
  headerTooltip:
318
376
  'Indicates if the user provided a message along with the automated error report.',
377
+ chooserGroup: 'Errors',
319
378
  excludeFromExport: true,
320
379
  resizable: false,
321
380
  align: 'center',
@@ -11,6 +11,7 @@ import * as Col from '@xh/hoist/cmp/grid/columns';
11
11
 
12
12
  export const user: ColumnSpec = {
13
13
  field: {name: 'user', type: 'string'},
14
+ chooserGroup: 'User',
14
15
  width: 250
15
16
  };
16
17
 
@@ -22,16 +23,19 @@ export const username: ColumnSpec = {
22
23
  isDimension: true,
23
24
  aggregator: 'UNIQUE'
24
25
  },
26
+ chooserGroup: 'User',
25
27
  width: 160
26
28
  };
27
29
 
28
30
  export const email: ColumnSpec = {
29
31
  field: {name: 'email', type: 'string'},
32
+ chooserGroup: 'User',
30
33
  width: 200
31
34
  };
32
35
 
33
36
  export const displayName: ColumnSpec = {
34
37
  field: {name: 'displayName', type: 'string'},
38
+ chooserGroup: 'User',
35
39
  width: 200
36
40
  };
37
41
 
@@ -45,11 +49,13 @@ export const roles: ColumnSpec = {
45
49
 
46
50
  export const impersonating: ColumnSpec = {
47
51
  field: {name: 'impersonating', type: 'string'},
52
+ chooserGroup: 'User',
48
53
  width: 140
49
54
  };
50
55
 
51
56
  export const impersonatingFlag: ColumnSpec = {
52
57
  field: {name: 'impersonatingFlag', type: 'bool'},
58
+ chooserGroup: 'User',
53
59
  headerName: Icon.impersonate(),
54
60
  headerTooltip: 'Indicates if the user was impersonating another user during tracked activity.',
55
61
  excludeFromExport: true,
@@ -6,6 +6,7 @@
6
6
  */
7
7
  import {exportFilename, getAppModel} from '@xh/hoist/admin/AdminUtils';
8
8
  import * as Col from '@xh/hoist/admin/columns';
9
+ import {elapsedRenderer} from '@xh/hoist/admin/columns';
9
10
  import {
10
11
  ActivityTrackingDataFieldSpec,
11
12
  DataFieldsEditorModel
@@ -16,7 +17,7 @@ import {ColumnRenderer, ColumnSpec, GridModel, TreeStyle} from '@xh/hoist/cmp/gr
16
17
  import {GroupingChooserModel} from '@xh/hoist/cmp/grouping';
17
18
  import {HoistModel, LoadSpec, managed, PlainObject, XH} from '@xh/hoist/core';
18
19
  import {Cube, CubeFieldSpec, FieldSpec, StoreRecord} from '@xh/hoist/data';
19
- import {dateRenderer, dateTimeSecRenderer, fmtNumber, numberRenderer} from '@xh/hoist/format';
20
+ import {dateRenderer, dateTimeSecRenderer, numberRenderer} from '@xh/hoist/format';
20
21
  import {action, computed, makeObservable, observable} from '@xh/hoist/mobx';
21
22
  import {LocalDate} from '@xh/hoist/utils/datetime';
22
23
  import {compact, get, isEmpty, isEqual, round} from 'lodash';
@@ -46,6 +47,7 @@ export class ActivityTrackingModel extends HoistModel implements ActivityDetailP
46
47
  get dataFieldCols(): ColumnSpec[] {
47
48
  return this.dataFields.map(df => ({
48
49
  field: df,
50
+ chooserGroup: 'Data Fields',
49
51
  renderer: this.getDfRenderer(df),
50
52
  appData: {showInAggGrid: !!df.aggregator}
51
53
  }));
@@ -329,6 +331,7 @@ export class ActivityTrackingModel extends HoistModel implements ActivityDetailP
329
331
  Col.dayRange.field,
330
332
  Col.device.field,
331
333
  Col.elapsed.field,
334
+ Col.elapsedMax.field,
332
335
  Col.entryCount.field,
333
336
  Col.impersonating.field,
334
337
  Col.instance.field,
@@ -349,7 +352,11 @@ export class ActivityTrackingModel extends HoistModel implements ActivityDetailP
349
352
  private createFilterChooserModel(): FilterChooserModel {
350
353
  // TODO - data fields?
351
354
  const ret = new FilterChooserModel({
352
- persistWith: {...this.persistWith, persistFavorites: false},
355
+ persistWith: {
356
+ ...this.persistWith,
357
+ // Faves persisted to local storage (vs trapped within a single VM view)
358
+ persistFavorites: {localStorageKey: 'xhAdminActivityTabState'}
359
+ },
353
360
  fieldSpecs: [
354
361
  {field: 'appEnvironment', displayName: 'Environment'},
355
362
  {field: 'appVersion'},
@@ -358,16 +365,7 @@ export class ActivityTrackingModel extends HoistModel implements ActivityDetailP
358
365
  {field: 'correlationId'},
359
366
  {field: 'data'},
360
367
  {field: 'device'},
361
- {
362
- field: 'elapsed',
363
- valueRenderer: v => {
364
- return fmtNumber(v, {
365
- label: 'ms',
366
- formatConfig: {thousandSeparated: false, mantissa: 0}
367
- });
368
- },
369
- fieldType: 'number'
370
- },
368
+ {field: 'elapsed', fieldType: 'number', valueRenderer: elapsedRenderer},
371
369
  {field: 'instance'},
372
370
  {field: 'loadId'},
373
371
  {field: 'msg', displayName: 'Message'},
@@ -403,7 +401,11 @@ export class ActivityTrackingModel extends HoistModel implements ActivityDetailP
403
401
 
404
402
  private createGroupingChooserModel(): GroupingChooserModel {
405
403
  return new GroupingChooserModel({
406
- persistWith: {...this.persistWith, persistFavorites: false},
404
+ persistWith: {
405
+ ...this.persistWith,
406
+ // Faves persisted to local storage (vs trapped within a single VM view)
407
+ persistFavorites: {localStorageKey: 'xhAdminActivityTabState'}
408
+ },
407
409
  dimensions: this.cube.dimensions,
408
410
  initialValue: ['username', 'category']
409
411
  });
@@ -440,10 +442,11 @@ export class ActivityTrackingModel extends HoistModel implements ActivityDetailP
440
442
  {...Col.browser, hidden},
441
443
  {...Col.userAgent, hidden},
442
444
  {...Col.impersonating, hidden},
443
- {...Col.elapsed, headerName: 'Elapsed (avg)', hidden},
445
+ {...Col.elapsed, displayName: 'Elapsed (avg)', hidden},
446
+ {...Col.elapsedMax, displayName: 'Elapsed (max)', hidden},
444
447
  {...Col.dayRange, hidden},
445
448
  {...Col.entryCount},
446
- {field: 'count', hidden},
449
+ {field: 'count', chooserGroup: 'Core Data', hidden},
447
450
  {...Col.appEnvironment, hidden},
448
451
  {...Col.appVersion, hidden},
449
452
  {...Col.loadId, hidden},
@@ -464,6 +467,9 @@ export class ActivityTrackingModel extends HoistModel implements ActivityDetailP
464
467
  raw.month = raw.day.format(this._monthFormat);
465
468
  raw.dayRange = {min: raw.day, max: raw.day};
466
469
 
470
+ // Workaround lack of support for multiple aggregations on the same field.
471
+ raw.elapsedMax = raw.elapsed;
472
+
467
473
  const data = JSON.parse(raw.data);
468
474
  if (isEmpty(data)) return;
469
475
 
@@ -26,6 +26,7 @@ import {activityDetailView} from './detail/ActivityDetailView';
26
26
  import './ActivityTracking.scss';
27
27
 
28
28
  export const activityTrackingPanel = hoistCmp.factory({
29
+ displayName: 'ActivityTrackingPanel',
29
30
  model: creates(ActivityTrackingModel),
30
31
 
31
32
  render({model}) {
@@ -45,14 +45,9 @@ export class AggChartModel extends HoistModel {
45
45
  if (!activityTrackingModel) return [];
46
46
 
47
47
  const ret: SelectOption[] = [
48
- {
49
- label: 'Entries [count]',
50
- value: 'entryCount'
51
- },
52
- {
53
- label: 'Elapsed ms [avg]',
54
- value: 'elapsed'
55
- }
48
+ {label: 'Entries [count]', value: 'entryCount'},
49
+ {label: 'Elapsed [avg]', value: 'elapsed'},
50
+ {label: 'Elapsed [max]', value: 'elapsedMax'}
56
51
  ];
57
52
 
58
53
  if (secondaryDim) {
@@ -88,10 +83,16 @@ export class AggChartModel extends HoistModel {
88
83
  this.markPersist('metric', {...persistWith, path: 'chartMetric'});
89
84
  this.markPersist('incWeekends', {...persistWith, path: 'chartIncWeekends'});
90
85
 
91
- this.addReaction({
92
- track: () => [this.data, this.metric, this.incWeekends],
93
- run: () => this.loadChart()
94
- });
86
+ this.addReaction(
87
+ {
88
+ track: () => [this.data, this.metric, this.incWeekends],
89
+ run: () => this.loadChart()
90
+ },
91
+ {
92
+ track: () => this.selectableMetrics,
93
+ run: () => this.onSelectableMetricsChange()
94
+ }
95
+ );
95
96
  }
96
97
 
97
98
  //-----------------
@@ -215,4 +216,11 @@ export class AggChartModel extends HoistModel {
215
216
  private getDisplayName(fieldName: string) {
216
217
  return this.activityTrackingModel?.getDisplayName(fieldName) ?? fieldName;
217
218
  }
219
+
220
+ private onSelectableMetricsChange(): void {
221
+ const {metric} = this;
222
+ if (!this.selectableMetrics.some(it => it.value === metric)) {
223
+ this.metric = this.selectableMetrics[0]?.value;
224
+ }
225
+ }
218
226
  }
@@ -14,6 +14,7 @@ import {Icon} from '@xh/hoist/icon/Icon';
14
14
  import {AggChartModel} from './AggChartModel';
15
15
 
16
16
  export const aggChartPanel = hoistCmp.factory({
17
+ displayName: 'AggChartPanel',
17
18
  model: creates(AggChartModel),
18
19
 
19
20
  render({model, ...props}) {
@@ -12,6 +12,7 @@ import {popover} from '@xh/hoist/kit/blueprint';
12
12
  import {isEmpty} from 'lodash';
13
13
 
14
14
  export const dataFieldsEditor = hoistCmp.factory({
15
+ displayName: 'DataFieldsEditor',
15
16
  model: uses(DataFieldsEditorModel),
16
17
 
17
18
  render({model}) {
@@ -186,7 +186,7 @@ export class ActivityDetailModel extends HoistModel {
186
186
  {...Col.instance, hidden},
187
187
  {...Col.urlPathOnly},
188
188
  {...Col.data, hidden},
189
- {...Col.dateCreatedNoYear, displayName: 'Timestamp'},
189
+ {...Col.dateCreatedNoYear, displayName: 'Timestamp', chooserGroup: 'Core Data'},
190
190
  ...dataFieldCols
191
191
  ].map(it => {
192
192
  const fieldName = isString(it.field) ? it.field : it.field.name;
@@ -22,6 +22,7 @@ import {isNil} from 'lodash';
22
22
  import {ActivityDetailModel} from './ActivityDetailModel';
23
23
 
24
24
  export const activityDetailView = hoistCmp.factory({
25
+ displayName: 'ActivityDetailView',
25
26
  model: creates(ActivityDetailModel),
26
27
 
27
28
  render({model, ...props}) {
@@ -38,7 +38,9 @@ export class ClientErrorsModel extends HoistModel {
38
38
  this.startDay = this.defaultStartDay;
39
39
  this.endDay = this.defaultEndDay;
40
40
 
41
- const hidden = true;
41
+ const hidden = true,
42
+ pinned = true;
43
+
42
44
  this.gridModel = new GridModel({
43
45
  persistWith: this.persistWith,
44
46
  colChooserModel: true,
@@ -50,11 +52,11 @@ export class ClientErrorsModel extends HoistModel {
50
52
  emptyText: 'No errors reported...',
51
53
  sortBy: 'dateCreated|desc',
52
54
  columns: [
53
- {...Col.userMessageFlag},
54
- {...Col.userAlertedFlag},
55
- {...Col.impersonatingFlag},
56
55
  {...Col.entryId, hidden},
57
- {...Col.username},
56
+ {...Col.userMessageFlag, pinned},
57
+ {...Col.userAlertedFlag, pinned},
58
+ {...Col.impersonatingFlag, pinned},
59
+ {...Col.username, pinned},
58
60
  {...Col.impersonating, hidden},
59
61
  {...Col.browser},
60
62
  {...Col.device},
@@ -62,14 +64,8 @@ export class ClientErrorsModel extends HoistModel {
62
64
  {...Col.appVersion},
63
65
  {...Col.appEnvironment},
64
66
  {...Col.msg, displayName: 'User Message', hidden},
65
- {
66
- field: {name: 'errorName', type: 'string'},
67
- autosizeMaxWidth: 400
68
- },
69
- {
70
- field: {name: 'errorMessage', type: 'string'},
71
- autosizeMaxWidth: 400
72
- },
67
+ {...Col.errorName},
68
+ {...Col.errorMessage},
73
69
  {...Col.error, hidden},
74
70
  {...Col.url},
75
71
  {...Col.correlationId},
@@ -12,10 +12,14 @@ export declare const day: ColumnSpec;
12
12
  export declare const dayRange: ColumnSpec;
13
13
  export declare const device: ColumnSpec;
14
14
  export declare const deviceIcon: ColumnSpec;
15
+ export declare const elapsedRenderer: (v: number) => import("react").ReactNode;
15
16
  export declare const elapsed: ColumnSpec;
17
+ export declare const elapsedMax: ColumnSpec;
16
18
  export declare const entryCount: ColumnSpec;
17
19
  export declare const entryId: ColumnSpec;
18
20
  export declare const error: ColumnSpec;
21
+ export declare const errorMessage: ColumnSpec;
22
+ export declare const errorName: ColumnSpec;
19
23
  export declare const instance: ColumnSpec;
20
24
  export declare const loadId: ColumnSpec;
21
25
  export declare const msg: ColumnSpec;
@@ -30,4 +30,5 @@ export declare class AggChartModel extends HoistModel {
30
30
  private loadChart;
31
31
  private getSeriesData;
32
32
  private getDisplayName;
33
+ private onSelectableMetricsChange;
33
34
  }
@@ -137,6 +137,10 @@
137
137
  color: var(--xh-text-color);
138
138
  }
139
139
 
140
+ .xh-toolbar--compact & {
141
+ height: 15px;
142
+ }
143
+
140
144
  // Matched to FilterChooser equivalent.
141
145
  & > .svg-inline--fa {
142
146
  width: 12px;
@@ -47,8 +47,10 @@ export interface GroupingChooserProps extends ButtonProps<GroupingChooserModel>
47
47
  * @see GroupingChooserModel
48
48
  */
49
49
  export const [GroupingChooser, groupingChooser] = hoistCmp.withFactory<GroupingChooserProps>({
50
+ displayName: 'GroupingChooser',
50
51
  model: uses(GroupingChooserModel),
51
52
  className: 'xh-grouping-chooser',
53
+
52
54
  render(
53
55
  {
54
56
  model,
@@ -103,15 +105,13 @@ export const [GroupingChooser, groupingChooser] = hoistCmp.withFactory<GroupingC
103
105
  ),
104
106
  content: favoritesIsOpen
105
107
  ? favoritesMenu({testId: favoritesMenuTestId})
106
- : editorIsOpen
107
- ? editor({
108
- popoverWidth,
109
- popoverMinHeight,
110
- popoverTitle,
111
- emptyText,
112
- testId: editorTestId
113
- })
114
- : null,
108
+ : editor({
109
+ popoverWidth,
110
+ popoverMinHeight,
111
+ popoverTitle,
112
+ emptyText,
113
+ testId: editorTestId
114
+ }),
115
115
  onInteraction: (nextOpenState, e) => {
116
116
  if (
117
117
  isOpen &&
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xh/hoist",
3
- "version": "73.0.0-SNAPSHOT.1746554302414",
3
+ "version": "73.0.0-SNAPSHOT.1746560538636",
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",