@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.
- package/admin/columns/Clients.ts +7 -0
- package/admin/columns/Tracking.ts +67 -8
- package/admin/columns/User.ts +6 -0
- package/admin/tabs/activity/tracking/ActivityTrackingModel.ts +21 -15
- package/admin/tabs/activity/tracking/ActivityTrackingPanel.ts +1 -0
- package/admin/tabs/activity/tracking/chart/AggChartModel.ts +20 -12
- package/admin/tabs/activity/tracking/chart/AggChartPanel.ts +1 -0
- package/admin/tabs/activity/tracking/datafields/DataFieldsEditor.ts +1 -0
- package/admin/tabs/activity/tracking/detail/ActivityDetailModel.ts +1 -1
- package/admin/tabs/activity/tracking/detail/ActivityDetailView.ts +1 -0
- package/admin/tabs/client/errors/ClientErrorsModel.ts +9 -13
- package/build/types/admin/columns/Tracking.d.ts +4 -0
- package/build/types/admin/tabs/activity/tracking/chart/AggChartModel.d.ts +1 -0
- package/desktop/cmp/grouping/GroupingChooser.scss +4 -0
- package/desktop/cmp/grouping/GroupingChooser.ts +9 -9
- package/package.json +1 -1
- package/tsconfig.tsbuildinfo +1 -1
package/admin/columns/Clients.ts
CHANGED
|
@@ -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
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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',
|
package/admin/columns/User.ts
CHANGED
|
@@ -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,
|
|
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: {
|
|
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: {
|
|
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,
|
|
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
|
-
|
|
50
|
-
|
|
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
|
-
|
|
93
|
-
|
|
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
|
}
|
|
@@ -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.
|
|
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
|
-
|
|
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;
|
|
@@ -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
|
-
:
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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.
|
|
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",
|