@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.
Files changed (50) hide show
  1. package/CHANGELOG.md +7 -1
  2. package/admin/AdminUtils.ts +0 -5
  3. package/admin/App.scss +6 -0
  4. package/admin/AppModel.ts +5 -17
  5. package/admin/{tabs/client/clients/ClientsColumns.ts → columns/Clients.ts} +20 -53
  6. package/admin/columns/Core.ts +34 -35
  7. package/admin/columns/Tracking.ts +74 -44
  8. package/admin/columns/index.ts +1 -0
  9. package/admin/tabs/activity/tracking/ActivityTracking.scss +0 -18
  10. package/admin/tabs/activity/tracking/ActivityTrackingModel.ts +205 -296
  11. package/admin/tabs/activity/tracking/ActivityTrackingPanel.ts +51 -81
  12. package/admin/tabs/activity/tracking/charts/ChartsModel.ts +218 -0
  13. package/admin/tabs/activity/tracking/charts/ChartsPanel.ts +76 -0
  14. package/admin/tabs/activity/tracking/detail/ActivityDetailModel.ts +60 -114
  15. package/admin/tabs/activity/tracking/detail/ActivityDetailView.ts +40 -63
  16. package/admin/tabs/client/clients/ClientsModel.ts +10 -11
  17. package/admin/tabs/cluster/instances/memory/MemoryMonitorModel.ts +2 -1
  18. package/build/types/admin/AdminUtils.d.ts +0 -2
  19. package/build/types/admin/AppModel.d.ts +1 -4
  20. package/build/types/admin/{tabs/client/clients/ClientsColumns.d.ts → columns/Clients.d.ts} +3 -7
  21. package/build/types/admin/columns/Core.d.ts +5 -5
  22. package/build/types/admin/columns/Tracking.d.ts +7 -4
  23. package/build/types/admin/columns/index.d.ts +1 -0
  24. package/build/types/admin/tabs/activity/tracking/ActivityTrackingModel.d.ts +26 -30
  25. package/build/types/admin/tabs/activity/tracking/charts/ChartsModel.d.ts +34 -0
  26. package/build/types/admin/tabs/activity/tracking/charts/ChartsPanel.d.ts +2 -0
  27. package/build/types/admin/tabs/activity/tracking/detail/ActivityDetailModel.d.ts +1 -13
  28. package/build/types/cmp/form/FormModel.d.ts +40 -17
  29. package/build/types/cmp/form/field/SubformsFieldModel.d.ts +18 -20
  30. package/build/types/core/HoistBase.d.ts +2 -2
  31. package/build/types/data/cube/CubeField.d.ts +5 -4
  32. package/build/types/desktop/cmp/appOption/AutoRefreshAppOption.d.ts +3 -3
  33. package/build/types/desktop/cmp/appOption/ThemeAppOption.d.ts +3 -3
  34. package/cmp/error/ErrorBoundaryModel.ts +1 -1
  35. package/cmp/form/FormModel.ts +112 -20
  36. package/cmp/form/field/SubformsFieldModel.ts +22 -28
  37. package/cmp/grid/impl/GridHScrollbar.ts +2 -1
  38. package/core/HoistBase.ts +12 -12
  39. package/data/cube/CubeField.ts +18 -17
  40. package/package.json +1 -1
  41. package/svc/TrackService.ts +2 -0
  42. package/tsconfig.tsbuildinfo +1 -1
  43. package/admin/tabs/activity/tracking/chart/AggChartModel.ts +0 -218
  44. package/admin/tabs/activity/tracking/chart/AggChartPanel.ts +0 -61
  45. package/admin/tabs/activity/tracking/datafields/DataFieldsEditor.ts +0 -147
  46. package/admin/tabs/activity/tracking/datafields/DataFieldsEditorModel.ts +0 -133
  47. package/build/types/admin/tabs/activity/tracking/chart/AggChartModel.d.ts +0 -33
  48. package/build/types/admin/tabs/activity/tracking/chart/AggChartPanel.d.ts +0 -2
  49. package/build/types/admin/tabs/activity/tracking/datafields/DataFieldsEditor.d.ts +0 -2
  50. 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 {StoreRecord} from '@xh/hoist/data';
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 @observable.ref gridModel: GridModel;
22
- @managed @observable.ref formModel: FormModel;
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
- this.markPersist('formattedDataFilterPath', this.activityTrackingModel.persistWith);
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: StoreRecord, ret = []) {
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
- /** Extract data from a (detail) grid record and flush it into our form for display. */
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: StoreRecord) {
97
- this.formModel.init(detailRec?.data ?? {});
98
- this.updateFormattedData();
99
- }
113
+ private showEntryDetail(detailRec) {
114
+ const recData = detailRec?.data ?? {},
115
+ trackData = recData.data;
100
116
 
101
- @action
102
- private updateFormattedData() {
103
- const {gridModel, formattedDataFilterPath} = this,
104
- trackData = gridModel.selectedRecord?.data.data;
117
+ this.formModel.init(recData);
105
118
 
106
- if (!trackData) {
107
- this.formattedData = '';
108
- return;
119
+ let formattedTrackData = trackData;
120
+ if (formattedTrackData) {
121
+ try {
122
+ formattedTrackData = fmtJson(trackData, {replacer: timestampReplacer()});
123
+ } catch (ignored) {}
109
124
  }
110
125
 
111
- let parsed = JSON.parse(trackData),
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 {correlationId, instance} from '@xh/hoist/admin/columns';
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, br, div, filler, h3, hframe, placeholder, span} from '@xh/hoist/cmp/layout';
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, textInput} from '@xh/hoist/desktop/cmp/input';
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
- tbar: tbar(),
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<ActivityDetailModel>(({model}) => {
37
- const {gridModel} = model;
38
- return toolbar({
39
- compact: true,
40
- items: [
41
- filler(),
42
- gridCountLabel({unit: 'entry'}),
43
- '-',
44
- // TODO - these don't react properly to swapping out grid model
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: v => instance.renderer(v, null)
112
+ readonlyRenderer: badgeRenderer
112
113
  }),
113
114
  formField({
114
115
  field: 'correlationId',
115
- readonlyRenderer: v => correlationId.renderer(v, null)
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
- additionalDataPanel()
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(Icon.detail(), 'Select an activity tracking record to view details.');
143
+ : placeholder('Select an activity tracking record to view details.');
139
144
  });
140
145
 
141
- const additionalDataPanel = hoistCmp.factory<ActivityDetailModel>(({model}) => {
142
- return panel({
143
- flex: 1,
144
- className: 'xh-border-left',
145
- items: [
146
- h3(Icon.json(), 'Additional Data'),
147
- jsonInput({
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
- WSCol.isOpen,
179
+ Col.isOpen,
181
180
  Col.user,
182
181
  {
183
182
  headerName: 'Session',
184
183
  headerAlign: 'center',
185
184
  children: [
186
- WSCol.createdTime,
187
- {...WSCol.key, hidden},
185
+ Col.createdTime,
186
+ {...Col.key, hidden},
188
187
  Col.instance,
189
- WSCol.loadId,
190
- WSCol.tabId
188
+ Col.loadId,
189
+ Col.tabId
191
190
  ]
192
191
  },
193
192
  {
194
193
  headerName: 'Client App',
195
194
  headerAlign: 'center',
196
- children: [WSCol.appVersion, WSCol.appBuild]
195
+ children: [Col.appVersion, Col.appBuild]
197
196
  },
198
197
  {
199
198
  headerName: 'Send/Receive',
200
199
  headerAlign: 'center',
201
200
  children: [
202
- WSCol.sentMessageCount,
203
- WSCol.lastSentTime,
204
- WSCol.receivedMessageCount,
205
- WSCol.lastReceivedTime
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, observable, runInAction} from '@xh/hoist/mobx';
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 createdTime: ColumnSpec;
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 lastReceivedTime: ColumnSpec;
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 name: ColumnSpec;
4
- export declare const type: ColumnSpec;
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 notes: ColumnSpec;
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 function badgeRenderer(v: any): "-" | import("react").ReactElement<import("@xh/hoist/cmp/badge").BadgeProps, any>;
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,3 +1,4 @@
1
+ export * from './Clients';
1
2
  export * from './Core';
2
3
  export * from './Rest';
3
4
  export * from './Tracking';
@@ -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 { ColumnSpec, GridModel } from '@xh/hoist/cmp/grid';
3
+ import { GridModel } from '@xh/hoist/cmp/grid';
5
4
  import { GroupingChooserModel } from '@xh/hoist/cmp/grouping';
6
- import { HoistModel, LoadSpec, PlainObject } from '@xh/hoist/core';
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
- /** FormModel for server-side querying controls. */
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
- setDataFields(dataFields: ActivityTrackingDataFieldSpec[]): void;
41
- toggleFilterChooser(): void;
42
- adjustDates(dir: 'add' | 'subtract'): void;
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
- getDisplayName(fieldName: string): string;
46
- private loadGridAsync;
47
- private separateLeafRows;
48
- private cubeLabelComparator;
49
- private getComparableValForDim;
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
  }