@xh/hoist 73.0.0-SNAPSHOT.1745973083869 → 73.0.0-SNAPSHOT.1746025071597
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 +7 -1
- package/admin/AdminUtils.ts +0 -5
- package/admin/App.scss +6 -0
- package/admin/AppModel.ts +5 -17
- package/admin/{tabs/client/clients/ClientsColumns.ts → columns/Clients.ts} +20 -53
- package/admin/columns/Core.ts +34 -35
- package/admin/columns/Tracking.ts +74 -44
- package/admin/columns/index.ts +1 -0
- package/admin/tabs/activity/tracking/ActivityTracking.scss +0 -18
- package/admin/tabs/activity/tracking/ActivityTrackingModel.ts +205 -296
- package/admin/tabs/activity/tracking/ActivityTrackingPanel.ts +51 -81
- package/admin/tabs/activity/tracking/charts/ChartsModel.ts +218 -0
- package/admin/tabs/activity/tracking/charts/ChartsPanel.ts +76 -0
- package/admin/tabs/activity/tracking/detail/ActivityDetailModel.ts +60 -114
- package/admin/tabs/activity/tracking/detail/ActivityDetailView.ts +40 -63
- package/admin/tabs/client/clients/ClientsModel.ts +10 -11
- package/admin/tabs/cluster/instances/memory/MemoryMonitorModel.ts +2 -1
- package/build/types/admin/AdminUtils.d.ts +0 -2
- package/build/types/admin/AppModel.d.ts +1 -4
- package/build/types/admin/{tabs/client/clients/ClientsColumns.d.ts → columns/Clients.d.ts} +3 -7
- package/build/types/admin/columns/Core.d.ts +5 -5
- package/build/types/admin/columns/Tracking.d.ts +7 -4
- package/build/types/admin/columns/index.d.ts +1 -0
- package/build/types/admin/tabs/activity/tracking/ActivityTrackingModel.d.ts +26 -30
- package/build/types/admin/tabs/activity/tracking/charts/ChartsModel.d.ts +34 -0
- package/build/types/admin/tabs/activity/tracking/charts/ChartsPanel.d.ts +2 -0
- package/build/types/admin/tabs/activity/tracking/detail/ActivityDetailModel.d.ts +1 -13
- package/build/types/cmp/form/FormModel.d.ts +40 -17
- package/build/types/cmp/form/field/SubformsFieldModel.d.ts +18 -20
- package/build/types/core/HoistBase.d.ts +2 -2
- package/build/types/data/cube/CubeField.d.ts +5 -4
- package/build/types/desktop/cmp/appOption/AutoRefreshAppOption.d.ts +3 -3
- package/build/types/desktop/cmp/appOption/ThemeAppOption.d.ts +3 -3
- package/cmp/error/ErrorBoundaryModel.ts +1 -1
- package/cmp/form/FormModel.ts +112 -20
- package/cmp/form/field/SubformsFieldModel.ts +22 -28
- package/cmp/grid/impl/GridHScrollbar.ts +2 -1
- package/core/HoistBase.ts +12 -12
- package/data/cube/CubeField.ts +18 -17
- package/package.json +1 -1
- package/svc/TrackService.ts +2 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/admin/tabs/activity/tracking/chart/AggChartModel.ts +0 -218
- package/admin/tabs/activity/tracking/chart/AggChartPanel.ts +0 -61
- package/admin/tabs/activity/tracking/datafields/DataFieldsEditor.ts +0 -147
- package/admin/tabs/activity/tracking/datafields/DataFieldsEditorModel.ts +0 -133
- package/build/types/admin/tabs/activity/tracking/chart/AggChartModel.d.ts +0 -33
- package/build/types/admin/tabs/activity/tracking/chart/AggChartPanel.d.ts +0 -2
- package/build/types/admin/tabs/activity/tracking/datafields/DataFieldsEditor.d.ts +0 -2
- package/build/types/admin/tabs/activity/tracking/datafields/DataFieldsEditorModel.d.ts +0 -46
|
@@ -9,27 +9,15 @@ import * as Col from '@xh/hoist/admin/columns';
|
|
|
9
9
|
import {FormModel} from '@xh/hoist/cmp/form';
|
|
10
10
|
import {GridModel} from '@xh/hoist/cmp/grid';
|
|
11
11
|
import {HoistModel, lookup, managed} from '@xh/hoist/core';
|
|
12
|
-
import {
|
|
13
|
-
import {timestampReplacer} from '@xh/hoist/format';
|
|
14
|
-
import {action, bindable, computed, makeObservable, observable} from '@xh/hoist/mobx';
|
|
15
|
-
import {get} from 'lodash';
|
|
12
|
+
import {action, computed, makeObservable, observable} from '@xh/hoist/mobx';
|
|
16
13
|
import {ActivityTrackingModel} from '../ActivityTrackingModel';
|
|
14
|
+
import {fmtJson, timestampReplacer} from '@xh/hoist/format';
|
|
17
15
|
|
|
18
16
|
export class ActivityDetailModel extends HoistModel {
|
|
19
17
|
@lookup(ActivityTrackingModel) activityTrackingModel: ActivityTrackingModel;
|
|
20
|
-
|
|
21
|
-
@managed
|
|
22
|
-
@
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Optional dot-delimited path(s) to filter the displayed `data` payload down to a particular
|
|
26
|
-
* node or nodes, for easier browsing of records with a large data payload. Multiple paths
|
|
27
|
-
* can be separated with `|`.
|
|
28
|
-
*/
|
|
29
|
-
@bindable formattedDataFilterPath: string;
|
|
30
|
-
|
|
31
|
-
/** Stringified, pretty-printed, optionally path-filtered `data` payload. */
|
|
32
|
-
@observable formattedData: string;
|
|
18
|
+
@managed gridModel: GridModel;
|
|
19
|
+
@managed formModel: FormModel;
|
|
20
|
+
@observable formattedData;
|
|
33
21
|
|
|
34
22
|
@computed
|
|
35
23
|
get hasSelection() {
|
|
@@ -42,14 +30,49 @@ export class ActivityDetailModel extends HoistModel {
|
|
|
42
30
|
}
|
|
43
31
|
|
|
44
32
|
override onLinked() {
|
|
45
|
-
|
|
33
|
+
const hidden = true;
|
|
34
|
+
this.gridModel = new GridModel({
|
|
35
|
+
sortBy: 'dateCreated|desc',
|
|
36
|
+
colChooserModel: true,
|
|
37
|
+
enableExport: true,
|
|
38
|
+
filterModel: false,
|
|
39
|
+
exportOptions: {
|
|
40
|
+
columns: 'ALL',
|
|
41
|
+
filename: exportFilename('activity-detail')
|
|
42
|
+
},
|
|
43
|
+
emptyText: 'Select a group on the left to see detailed tracking logs.',
|
|
44
|
+
columns: [
|
|
45
|
+
{...Col.impersonatingFlag},
|
|
46
|
+
{...Col.entryId, hidden},
|
|
47
|
+
{...Col.username},
|
|
48
|
+
{...Col.impersonating, hidden},
|
|
49
|
+
{...Col.category},
|
|
50
|
+
{...Col.msg},
|
|
51
|
+
{...Col.browser},
|
|
52
|
+
{...Col.device},
|
|
53
|
+
{...Col.userAgent, hidden},
|
|
54
|
+
{...Col.appVersion},
|
|
55
|
+
{...Col.loadId},
|
|
56
|
+
{...Col.tabId},
|
|
57
|
+
{...Col.appEnvironment, hidden},
|
|
58
|
+
{...Col.data, hidden},
|
|
59
|
+
{...Col.url},
|
|
60
|
+
{...Col.instance, hidden},
|
|
61
|
+
{...Col.correlationId},
|
|
62
|
+
{...Col.severity, hidden},
|
|
63
|
+
{...Col.elapsed},
|
|
64
|
+
{...Col.dateCreatedWithSec, displayName: 'Timestamp'}
|
|
65
|
+
]
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
this.formModel = new FormModel({
|
|
69
|
+
readonly: true,
|
|
70
|
+
fields: this.gridModel
|
|
71
|
+
.getLeafColumns()
|
|
72
|
+
.map(it => ({name: it.field, displayName: it.headerName as string}))
|
|
73
|
+
});
|
|
46
74
|
|
|
47
75
|
this.addReaction(
|
|
48
|
-
{
|
|
49
|
-
track: () => this.activityTrackingModel.dataFields,
|
|
50
|
-
run: () => this.createAndSetCoreModels(),
|
|
51
|
-
fireImmediately: true
|
|
52
|
-
},
|
|
53
76
|
{
|
|
54
77
|
track: () => this.activityTrackingModel.gridModel.selectedRecord,
|
|
55
78
|
run: aggRec => this.showActivityEntriesAsync(aggRec)
|
|
@@ -57,18 +80,11 @@ export class ActivityDetailModel extends HoistModel {
|
|
|
57
80
|
{
|
|
58
81
|
track: () => this.gridModel.selectedRecord,
|
|
59
82
|
run: detailRec => this.showEntryDetail(detailRec)
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
track: () => this.formattedDataFilterPath,
|
|
63
|
-
run: () => this.updateFormattedData()
|
|
64
83
|
}
|
|
65
84
|
);
|
|
66
85
|
}
|
|
67
86
|
|
|
68
|
-
|
|
69
|
-
// Implementation
|
|
70
|
-
//------------------
|
|
71
|
-
private async showActivityEntriesAsync(aggRec: StoreRecord) {
|
|
87
|
+
private async showActivityEntriesAsync(aggRec) {
|
|
72
88
|
const {gridModel} = this,
|
|
73
89
|
leaves = this.getAllLeafRows(aggRec);
|
|
74
90
|
|
|
@@ -77,7 +93,7 @@ export class ActivityDetailModel extends HoistModel {
|
|
|
77
93
|
}
|
|
78
94
|
|
|
79
95
|
// Extract all leaf, track-entry-level rows from an aggregate record (at any level).
|
|
80
|
-
private getAllLeafRows(aggRec
|
|
96
|
+
private getAllLeafRows(aggRec, ret = []) {
|
|
81
97
|
if (!aggRec) return [];
|
|
82
98
|
|
|
83
99
|
if (aggRec.children.length) {
|
|
@@ -91,92 +107,22 @@ export class ActivityDetailModel extends HoistModel {
|
|
|
91
107
|
return ret;
|
|
92
108
|
}
|
|
93
109
|
|
|
94
|
-
|
|
110
|
+
// Extract data from a (detail) grid record and flush it into our form for display.
|
|
111
|
+
// Also parse/format any additional data (as JSON) if provided.
|
|
95
112
|
@action
|
|
96
|
-
private showEntryDetail(detailRec
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}
|
|
113
|
+
private showEntryDetail(detailRec) {
|
|
114
|
+
const recData = detailRec?.data ?? {},
|
|
115
|
+
trackData = recData.data;
|
|
100
116
|
|
|
101
|
-
|
|
102
|
-
private updateFormattedData() {
|
|
103
|
-
const {gridModel, formattedDataFilterPath} = this,
|
|
104
|
-
trackData = gridModel.selectedRecord?.data.data;
|
|
117
|
+
this.formModel.init(recData);
|
|
105
118
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
119
|
+
let formattedTrackData = trackData;
|
|
120
|
+
if (formattedTrackData) {
|
|
121
|
+
try {
|
|
122
|
+
formattedTrackData = fmtJson(trackData, {replacer: timestampReplacer()});
|
|
123
|
+
} catch (ignored) {}
|
|
109
124
|
}
|
|
110
125
|
|
|
111
|
-
|
|
112
|
-
toFormat = parsed;
|
|
113
|
-
|
|
114
|
-
if (formattedDataFilterPath) {
|
|
115
|
-
const paths = formattedDataFilterPath.split('|');
|
|
116
|
-
if (paths.length > 1) {
|
|
117
|
-
toFormat = {};
|
|
118
|
-
paths.forEach(path => (toFormat[path.trim()] = get(parsed, path.trim())));
|
|
119
|
-
} else {
|
|
120
|
-
toFormat = get(parsed, formattedDataFilterPath.trim());
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
this.formattedData = JSON.stringify(toFormat, timestampReplacer(), 2);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
//------------------------
|
|
128
|
-
// Core data-handling models
|
|
129
|
-
//------------------------
|
|
130
|
-
@action
|
|
131
|
-
private createAndSetCoreModels() {
|
|
132
|
-
this.gridModel = this.createGridModel();
|
|
133
|
-
this.formModel = this.createSingleEntryFormModel();
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
private createGridModel(): GridModel {
|
|
137
|
-
const hidden = true;
|
|
138
|
-
return new GridModel({
|
|
139
|
-
persistWith: {...this.activityTrackingModel.persistWith, path: 'detailGrid'},
|
|
140
|
-
sortBy: 'dateCreated|desc',
|
|
141
|
-
colChooserModel: true,
|
|
142
|
-
enableExport: true,
|
|
143
|
-
filterModel: false,
|
|
144
|
-
exportOptions: {
|
|
145
|
-
columns: 'ALL',
|
|
146
|
-
filename: exportFilename('activity-detail')
|
|
147
|
-
},
|
|
148
|
-
emptyText: 'Select a group on the left to see detailed tracking logs.',
|
|
149
|
-
columns: [
|
|
150
|
-
{...Col.impersonatingFlag},
|
|
151
|
-
{...Col.entryId, hidden},
|
|
152
|
-
{...Col.username},
|
|
153
|
-
{...Col.impersonating, hidden},
|
|
154
|
-
{...Col.category},
|
|
155
|
-
{...Col.msg},
|
|
156
|
-
{...Col.browser},
|
|
157
|
-
{...Col.device},
|
|
158
|
-
{...Col.userAgent, hidden},
|
|
159
|
-
{...Col.appVersion},
|
|
160
|
-
{...Col.appEnvironment, hidden},
|
|
161
|
-
{...Col.data, hidden},
|
|
162
|
-
{...Col.url},
|
|
163
|
-
{...Col.correlationId},
|
|
164
|
-
{...Col.instance, hidden},
|
|
165
|
-
{...Col.severity, hidden},
|
|
166
|
-
{...Col.elapsed},
|
|
167
|
-
{...Col.dateCreatedWithSec, displayName: 'Timestamp'},
|
|
168
|
-
...this.activityTrackingModel.dataFieldCols
|
|
169
|
-
]
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// TODO - don't base on grid cols
|
|
174
|
-
private createSingleEntryFormModel(): FormModel {
|
|
175
|
-
return new FormModel({
|
|
176
|
-
readonly: true,
|
|
177
|
-
fields: this.gridModel
|
|
178
|
-
.getLeafColumns()
|
|
179
|
-
.map(it => ({name: it.field, displayName: it.headerName as string}))
|
|
180
|
-
});
|
|
126
|
+
this.formattedData = formattedTrackData;
|
|
181
127
|
}
|
|
182
128
|
}
|
|
@@ -4,20 +4,19 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Copyright © 2025 Extremely Heavy Industries Inc.
|
|
6
6
|
*/
|
|
7
|
-
import {
|
|
7
|
+
import {badgeRenderer} from '@xh/hoist/admin/columns';
|
|
8
8
|
import {form} from '@xh/hoist/cmp/form';
|
|
9
9
|
import {grid, gridCountLabel} from '@xh/hoist/cmp/grid';
|
|
10
|
-
import {a,
|
|
10
|
+
import {a, div, filler, h3, hframe, placeholder, span} from '@xh/hoist/cmp/layout';
|
|
11
11
|
import {creates, hoistCmp} from '@xh/hoist/core';
|
|
12
12
|
import {colChooserButton, exportButton} from '@xh/hoist/desktop/cmp/button';
|
|
13
13
|
import {formField} from '@xh/hoist/desktop/cmp/form';
|
|
14
14
|
import {gridFindField} from '@xh/hoist/desktop/cmp/grid';
|
|
15
|
-
import {jsonInput
|
|
15
|
+
import {jsonInput} from '@xh/hoist/desktop/cmp/input';
|
|
16
16
|
import {panel} from '@xh/hoist/desktop/cmp/panel';
|
|
17
17
|
import {toolbar} from '@xh/hoist/desktop/cmp/toolbar';
|
|
18
18
|
import {dateTimeSecRenderer, numberRenderer} from '@xh/hoist/format';
|
|
19
19
|
import {Icon} from '@xh/hoist/icon/Icon';
|
|
20
|
-
import {tooltip} from '@xh/hoist/kit/blueprint';
|
|
21
20
|
import {ActivityDetailModel} from './ActivityDetailModel';
|
|
22
21
|
|
|
23
22
|
export const activityDetailView = hoistCmp.factory({
|
|
@@ -25,28 +24,26 @@ export const activityDetailView = hoistCmp.factory({
|
|
|
25
24
|
|
|
26
25
|
render({model, ...props}) {
|
|
27
26
|
return panel({
|
|
27
|
+
title: 'Track Log Entries',
|
|
28
|
+
icon: Icon.list(),
|
|
28
29
|
className: 'xh-admin-activity-detail',
|
|
29
|
-
|
|
30
|
+
compactHeader: true,
|
|
30
31
|
items: [grid({flex: 1}), detailRecPanel()],
|
|
32
|
+
tbar: tbar(),
|
|
31
33
|
...props
|
|
32
34
|
});
|
|
33
35
|
}
|
|
34
36
|
});
|
|
35
37
|
|
|
36
|
-
const tbar = hoistCmp.factory
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
gridFindField({gridModel}),
|
|
46
|
-
colChooserButton({gridModel}),
|
|
47
|
-
exportButton()
|
|
48
|
-
]
|
|
49
|
-
});
|
|
38
|
+
const tbar = hoistCmp.factory(({model}) => {
|
|
39
|
+
return toolbar(
|
|
40
|
+
filler(),
|
|
41
|
+
gridCountLabel({unit: 'entry'}),
|
|
42
|
+
'-',
|
|
43
|
+
gridFindField(),
|
|
44
|
+
colChooserButton(),
|
|
45
|
+
exportButton()
|
|
46
|
+
);
|
|
50
47
|
});
|
|
51
48
|
|
|
52
49
|
// Discrete outer panel to retain sizing across master/detail selection changes.
|
|
@@ -57,11 +54,7 @@ const detailRecPanel = hoistCmp.factory<ActivityDetailModel>(({model}) => {
|
|
|
57
54
|
compactHeader: true,
|
|
58
55
|
modelConfig: {
|
|
59
56
|
side: 'bottom',
|
|
60
|
-
defaultSize: 400
|
|
61
|
-
persistWith: {
|
|
62
|
-
...model.activityTrackingModel.persistWith,
|
|
63
|
-
path: 'singleActivityDetailPanel'
|
|
64
|
-
}
|
|
57
|
+
defaultSize: 400
|
|
65
58
|
},
|
|
66
59
|
item: detailRecForm()
|
|
67
60
|
});
|
|
@@ -102,17 +95,25 @@ const detailRecForm = hoistCmp.factory<ActivityDetailModel>(({model}) => {
|
|
|
102
95
|
return `${appVersion} (${appEnvironment})`;
|
|
103
96
|
}
|
|
104
97
|
}),
|
|
98
|
+
formField({
|
|
99
|
+
field: 'loadId',
|
|
100
|
+
readonlyRenderer: badgeRenderer
|
|
101
|
+
}),
|
|
102
|
+
formField({
|
|
103
|
+
field: 'tabId',
|
|
104
|
+
readonlyRenderer: badgeRenderer
|
|
105
|
+
}),
|
|
105
106
|
formField({
|
|
106
107
|
field: 'url',
|
|
107
108
|
readonlyRenderer: hyperlinkVal
|
|
108
109
|
}),
|
|
109
110
|
formField({
|
|
110
111
|
field: 'instance',
|
|
111
|
-
readonlyRenderer:
|
|
112
|
+
readonlyRenderer: badgeRenderer
|
|
112
113
|
}),
|
|
113
114
|
formField({
|
|
114
115
|
field: 'correlationId',
|
|
115
|
-
readonlyRenderer:
|
|
116
|
+
readonlyRenderer: badgeRenderer
|
|
116
117
|
}),
|
|
117
118
|
formField({
|
|
118
119
|
field: 'elapsed',
|
|
@@ -132,47 +133,23 @@ const detailRecForm = hoistCmp.factory<ActivityDetailModel>(({model}) => {
|
|
|
132
133
|
formField({field: 'userAgent'})
|
|
133
134
|
]
|
|
134
135
|
}),
|
|
135
|
-
|
|
136
|
+
panel({
|
|
137
|
+
flex: 1,
|
|
138
|
+
className: 'xh-border-left',
|
|
139
|
+
items: [h3(Icon.json(), 'Additional Data'), additionalDataJsonInput()]
|
|
140
|
+
})
|
|
136
141
|
)
|
|
137
142
|
})
|
|
138
|
-
: placeholder(
|
|
143
|
+
: placeholder('Select an activity tracking record to view details.');
|
|
139
144
|
});
|
|
140
145
|
|
|
141
|
-
const
|
|
142
|
-
return
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
readonly: true,
|
|
149
|
-
width: '100%',
|
|
150
|
-
height: '100%',
|
|
151
|
-
showCopyButton: true,
|
|
152
|
-
value: model.formattedData
|
|
153
|
-
}),
|
|
154
|
-
toolbar({
|
|
155
|
-
compact: true,
|
|
156
|
-
items: [
|
|
157
|
-
textInput({
|
|
158
|
-
placeholder: 'Path filter(s)...',
|
|
159
|
-
leftIcon: Icon.filter(),
|
|
160
|
-
commitOnChange: true,
|
|
161
|
-
enableClear: true,
|
|
162
|
-
flex: 1,
|
|
163
|
-
bind: 'formattedDataFilterPath'
|
|
164
|
-
}),
|
|
165
|
-
tooltip({
|
|
166
|
-
item: Icon.questionCircle({className: 'xh-margin-right'}),
|
|
167
|
-
content: span(
|
|
168
|
-
'Specify one or more dot-delimited paths to filter the JSON data displayed above.',
|
|
169
|
-
br(),
|
|
170
|
-
'Separate multiple paths that you wish to include with a | character.'
|
|
171
|
-
)
|
|
172
|
-
})
|
|
173
|
-
]
|
|
174
|
-
})
|
|
175
|
-
]
|
|
146
|
+
const additionalDataJsonInput = hoistCmp.factory<ActivityDetailModel>(({model}) => {
|
|
147
|
+
return jsonInput({
|
|
148
|
+
readonly: true,
|
|
149
|
+
width: '100%',
|
|
150
|
+
height: '100%',
|
|
151
|
+
showCopyButton: true,
|
|
152
|
+
value: model.formattedData
|
|
176
153
|
});
|
|
177
154
|
});
|
|
178
155
|
|
|
@@ -18,7 +18,6 @@ import {Timer} from '@xh/hoist/utils/async';
|
|
|
18
18
|
import {SECONDS} from '@xh/hoist/utils/datetime';
|
|
19
19
|
import {pluralize} from '@xh/hoist/utils/js';
|
|
20
20
|
import {isEmpty} from 'lodash';
|
|
21
|
-
import * as WSCol from './ClientsColumns';
|
|
22
21
|
import {BaseAdminTabModel} from '@xh/hoist/admin/tabs/BaseAdminTabModel';
|
|
23
22
|
|
|
24
23
|
export class ClientsModel extends BaseAdminTabModel {
|
|
@@ -177,32 +176,32 @@ export class ClientsModel extends BaseAdminTabModel {
|
|
|
177
176
|
},
|
|
178
177
|
sortBy: ['user'],
|
|
179
178
|
columns: [
|
|
180
|
-
|
|
179
|
+
Col.isOpen,
|
|
181
180
|
Col.user,
|
|
182
181
|
{
|
|
183
182
|
headerName: 'Session',
|
|
184
183
|
headerAlign: 'center',
|
|
185
184
|
children: [
|
|
186
|
-
|
|
187
|
-
{...
|
|
185
|
+
Col.createdTime,
|
|
186
|
+
{...Col.key, hidden},
|
|
188
187
|
Col.instance,
|
|
189
|
-
|
|
190
|
-
|
|
188
|
+
Col.loadId,
|
|
189
|
+
Col.tabId
|
|
191
190
|
]
|
|
192
191
|
},
|
|
193
192
|
{
|
|
194
193
|
headerName: 'Client App',
|
|
195
194
|
headerAlign: 'center',
|
|
196
|
-
children: [
|
|
195
|
+
children: [Col.appVersion, Col.appBuild]
|
|
197
196
|
},
|
|
198
197
|
{
|
|
199
198
|
headerName: 'Send/Receive',
|
|
200
199
|
headerAlign: 'center',
|
|
201
200
|
children: [
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
201
|
+
Col.sentMessageCount,
|
|
202
|
+
Col.lastSentTime,
|
|
203
|
+
Col.receivedMessageCount,
|
|
204
|
+
Col.lastReceivedTime
|
|
206
205
|
]
|
|
207
206
|
}
|
|
208
207
|
]
|
|
@@ -13,8 +13,9 @@ import {LoadSpec, managed, XH} from '@xh/hoist/core';
|
|
|
13
13
|
import {lengthIs, required} from '@xh/hoist/data';
|
|
14
14
|
import {fmtTime, numberRenderer} from '@xh/hoist/format';
|
|
15
15
|
import {Icon} from '@xh/hoist/icon';
|
|
16
|
-
import {bindable, makeObservable
|
|
16
|
+
import {bindable, makeObservable} from '@xh/hoist/mobx';
|
|
17
17
|
import {forOwn, orderBy, sortBy} from 'lodash';
|
|
18
|
+
import {observable, runInAction} from 'mobx';
|
|
18
19
|
|
|
19
20
|
export interface PastInstance {
|
|
20
21
|
name: string;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { AppModel } from '@xh/hoist/admin/AppModel';
|
|
2
1
|
/**
|
|
3
2
|
* Generate a standardized filename for an Admin module grid export, without datestamp.
|
|
4
3
|
*/
|
|
@@ -8,4 +7,3 @@ export declare function exportFilename(moduleName: string): string;
|
|
|
8
7
|
* Returned as a closure to ensure current date is evaluated at export time.
|
|
9
8
|
*/
|
|
10
9
|
export declare function exportFilenameWithDate(moduleName: string): () => string;
|
|
11
|
-
export declare function getAppModel<T extends AppModel>(): T;
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import { TabConfig, TabContainerModel } from '@xh/hoist/cmp/tab';
|
|
2
|
-
import { ViewManagerModel } from '@xh/hoist/cmp/viewmanager';
|
|
3
2
|
import { HoistAppModel } from '@xh/hoist/core';
|
|
4
3
|
import { Route } from 'router5';
|
|
5
4
|
export declare class AppModel extends HoistAppModel {
|
|
5
|
+
static instance: AppModel;
|
|
6
6
|
tabModel: TabContainerModel;
|
|
7
|
-
viewManagerModels: Record<string, ViewManagerModel>;
|
|
8
7
|
static get readonly(): boolean;
|
|
9
8
|
constructor();
|
|
10
|
-
initAsync(): Promise<void>;
|
|
11
9
|
getRoutes(): Route[];
|
|
12
10
|
getAppMenuButtonExtraItems(): any[];
|
|
13
11
|
getTabRoutes(): Route[];
|
|
@@ -15,5 +13,4 @@ export declare class AppModel extends HoistAppModel {
|
|
|
15
13
|
/** Open the primary business-facing application, typically 'app'. */
|
|
16
14
|
openPrimaryApp(): void;
|
|
17
15
|
getPrimaryAppCode(): string;
|
|
18
|
-
initViewManagerModelsAsync(): Promise<void>;
|
|
19
16
|
}
|
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
import { ColumnSpec } from '@xh/hoist/cmp/grid/columns';
|
|
2
|
+
export declare const createdTime: ColumnSpec;
|
|
2
3
|
export declare const isOpen: ColumnSpec;
|
|
3
4
|
export declare const key: ColumnSpec;
|
|
4
|
-
export declare const
|
|
5
|
-
export declare const sentMessageCount: ColumnSpec;
|
|
5
|
+
export declare const lastReceivedTime: ColumnSpec;
|
|
6
6
|
export declare const lastSentTime: ColumnSpec;
|
|
7
7
|
export declare const receivedMessageCount: ColumnSpec;
|
|
8
|
-
export declare const
|
|
9
|
-
export declare const appVersion: ColumnSpec;
|
|
10
|
-
export declare const appBuild: ColumnSpec;
|
|
11
|
-
export declare const loadId: ColumnSpec;
|
|
12
|
-
export declare const tabId: ColumnSpec;
|
|
8
|
+
export declare const sentMessageCount: ColumnSpec;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import { ColumnSpec } from '@xh/hoist/cmp/grid';
|
|
3
|
-
export declare const
|
|
4
|
-
export declare
|
|
3
|
+
export declare const badgeCol: ColumnSpec;
|
|
4
|
+
export declare function badgeRenderer(v: any): "-" | import("react").ReactElement<import("@xh/hoist/cmp/badge").BadgeProps, any>;
|
|
5
5
|
export declare const description: ColumnSpec;
|
|
6
|
-
export declare const
|
|
6
|
+
export declare const name: ColumnSpec;
|
|
7
7
|
export declare const note: ColumnSpec;
|
|
8
|
+
export declare const notes: ColumnSpec;
|
|
8
9
|
export declare const timestampNoYear: ColumnSpec;
|
|
9
|
-
export declare
|
|
10
|
-
export declare const badgeCol: ColumnSpec;
|
|
10
|
+
export declare const type: ColumnSpec;
|
|
@@ -1,21 +1,24 @@
|
|
|
1
1
|
import { ColumnSpec } from '@xh/hoist/cmp/grid/columns';
|
|
2
|
+
export declare const appBuild: ColumnSpec;
|
|
2
3
|
export declare const appEnvironment: ColumnSpec;
|
|
3
4
|
export declare const appVersion: ColumnSpec;
|
|
4
5
|
export declare const browser: ColumnSpec;
|
|
5
|
-
export declare const severity: ColumnSpec;
|
|
6
6
|
export declare const category: ColumnSpec;
|
|
7
|
+
export declare const correlationId: ColumnSpec;
|
|
7
8
|
export declare const data: ColumnSpec;
|
|
8
9
|
export declare const day: ColumnSpec;
|
|
10
|
+
export declare const dayRange: ColumnSpec;
|
|
9
11
|
export declare const device: ColumnSpec;
|
|
10
12
|
export declare const elapsed: ColumnSpec;
|
|
11
13
|
export declare const entryCount: ColumnSpec;
|
|
12
14
|
export declare const entryId: ColumnSpec;
|
|
13
|
-
export declare const correlationId: ColumnSpec;
|
|
14
15
|
export declare const error: ColumnSpec;
|
|
16
|
+
export declare const instance: ColumnSpec;
|
|
17
|
+
export declare const loadId: ColumnSpec;
|
|
15
18
|
export declare const msg: ColumnSpec;
|
|
19
|
+
export declare const severity: ColumnSpec;
|
|
20
|
+
export declare const tabId: ColumnSpec;
|
|
16
21
|
export declare const url: ColumnSpec;
|
|
17
|
-
export declare const instance: ColumnSpec;
|
|
18
22
|
export declare const userAgent: ColumnSpec;
|
|
19
23
|
export declare const userAlertedFlag: ColumnSpec;
|
|
20
24
|
export declare const userMessageFlag: ColumnSpec;
|
|
21
|
-
export declare const dayRange: ColumnSpec;
|
|
@@ -1,30 +1,31 @@
|
|
|
1
|
-
import { ActivityTrackingDataFieldSpec, DataFieldsEditorModel } from '@xh/hoist/admin/tabs/activity/tracking/datafields/DataFieldsEditorModel';
|
|
2
1
|
import { FilterChooserModel } from '@xh/hoist/cmp/filter';
|
|
3
2
|
import { FormModel } from '@xh/hoist/cmp/form';
|
|
4
|
-
import {
|
|
3
|
+
import { GridModel } from '@xh/hoist/cmp/grid';
|
|
5
4
|
import { GroupingChooserModel } from '@xh/hoist/cmp/grouping';
|
|
6
|
-
import { HoistModel, LoadSpec
|
|
5
|
+
import { HoistModel, LoadSpec } from '@xh/hoist/core';
|
|
7
6
|
import { Cube } from '@xh/hoist/data';
|
|
8
7
|
import { LocalDate } from '@xh/hoist/utils/datetime';
|
|
8
|
+
export declare const PERSIST_ACTIVITY: {
|
|
9
|
+
localStorageKey: string;
|
|
10
|
+
};
|
|
9
11
|
export declare class ActivityTrackingModel extends HoistModel {
|
|
10
|
-
|
|
12
|
+
persistWith: {
|
|
13
|
+
localStorageKey: string;
|
|
14
|
+
};
|
|
11
15
|
formModel: FormModel;
|
|
12
|
-
/** Models for data-handling components - can be rebuilt due to change in dataFields. */
|
|
13
16
|
groupingChooserModel: GroupingChooserModel;
|
|
14
17
|
cube: Cube;
|
|
15
18
|
filterChooserModel: FilterChooserModel;
|
|
16
19
|
gridModel: GridModel;
|
|
17
|
-
dataFieldsEditorModel: DataFieldsEditorModel;
|
|
18
|
-
/**
|
|
19
|
-
* Optional spec for fields to be extracted from additional `data` returned by track entries
|
|
20
|
-
* and promoted to top-level columns in the grids. Supports dot-delimited paths as names.
|
|
21
|
-
*/
|
|
22
|
-
dataFields: ActivityTrackingDataFieldSpec[];
|
|
23
|
-
showFilterChooser: boolean;
|
|
24
20
|
get enabled(): boolean;
|
|
25
21
|
get dimensions(): string[];
|
|
22
|
+
/**
|
|
23
|
+
* Summary of currently active query / filters.
|
|
24
|
+
* TODO - include new local filters if feasible, or drop this altogether.
|
|
25
|
+
* Formerly summarized server-side filters, but was misleading w/new filtering.
|
|
26
|
+
*/
|
|
27
|
+
get queryDisplayString(): string;
|
|
26
28
|
get endDay(): LocalDate;
|
|
27
|
-
get hasFilter(): boolean;
|
|
28
29
|
get maxRowOptions(): {
|
|
29
30
|
value: number;
|
|
30
31
|
label: string;
|
|
@@ -32,29 +33,24 @@ export declare class ActivityTrackingModel extends HoistModel {
|
|
|
32
33
|
get maxRows(): number;
|
|
33
34
|
/** True if data loaded from the server has been topped by maxRows. */
|
|
34
35
|
get maxRowsReached(): boolean;
|
|
35
|
-
get dataFieldCols(): ColumnSpec[];
|
|
36
|
-
get viewManagerModel(): import("../../../../cmp/viewmanager").ViewManagerModel<PlainObject>;
|
|
37
36
|
private _monthFormat;
|
|
37
|
+
private _defaultDims;
|
|
38
38
|
constructor();
|
|
39
39
|
doLoadAsync(loadSpec: LoadSpec): Promise<void>;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
loadGridAsync(): Promise<void>;
|
|
41
|
+
separateLeafRows(node: any): void;
|
|
42
|
+
resetQuery(): void;
|
|
43
|
+
adjustDates(dir: any): void;
|
|
43
44
|
adjustStartDate(value: any, unit: any): void;
|
|
44
45
|
isInterval(value: any, unit: any): boolean;
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
46
|
+
cubeLabelComparator(valA: any, valB: any, sortDir: any, abs: any, { recordA, recordB, defaultComparator }: {
|
|
47
|
+
recordA: any;
|
|
48
|
+
recordB: any;
|
|
49
|
+
defaultComparator: any;
|
|
50
|
+
}): any;
|
|
51
|
+
getComparableValForDim(raw: any, dim: any): any;
|
|
50
52
|
private get defaultStartDay();
|
|
51
53
|
private get defaultEndDay();
|
|
54
|
+
private loadLookupsAsync;
|
|
52
55
|
private get query();
|
|
53
|
-
private createAndSetCoreModels;
|
|
54
|
-
private createCube;
|
|
55
|
-
private createFilterChooserModel;
|
|
56
|
-
private createGroupingChooserModel;
|
|
57
|
-
private createGridModel;
|
|
58
|
-
private processRawTrackLog;
|
|
59
|
-
private getDfRenderer;
|
|
60
56
|
}
|