@memberjunction/ng-dashboards 5.8.0 → 5.10.0

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 (84) hide show
  1. package/dist/AI/components/models/model-management.component.d.ts +2 -0
  2. package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
  3. package/dist/AI/components/models/model-management.component.js +44 -2
  4. package/dist/AI/components/models/model-management.component.js.map +1 -1
  5. package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
  6. package/dist/DashboardBrowser/dashboard-browser-resource.component.js +15 -12
  7. package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
  8. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
  9. package/dist/DataExplorer/components/view-selector/view-selector.component.js +16 -22
  10. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
  11. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  12. package/dist/DataExplorer/data-explorer-dashboard.component.js +31 -11
  13. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  14. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  15. package/dist/Home/home-dashboard.component.js +10 -7
  16. package/dist/Home/home-dashboard.component.js.map +1 -1
  17. package/dist/Integration/components/activity/activity.component.d.ts +96 -0
  18. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -0
  19. package/dist/Integration/components/activity/activity.component.js +961 -0
  20. package/dist/Integration/components/activity/activity.component.js.map +1 -0
  21. package/dist/Integration/components/connections/connections.component.d.ts +194 -0
  22. package/dist/Integration/components/connections/connections.component.d.ts.map +1 -0
  23. package/dist/Integration/components/connections/connections.component.js +2368 -0
  24. package/dist/Integration/components/connections/connections.component.js.map +1 -0
  25. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts +213 -15
  26. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
  27. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +2093 -187
  28. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  29. package/dist/Integration/components/overview/overview.component.d.ts +60 -0
  30. package/dist/Integration/components/overview/overview.component.d.ts.map +1 -0
  31. package/dist/Integration/components/overview/overview.component.js +628 -0
  32. package/dist/Integration/components/overview/overview.component.js.map +1 -0
  33. package/dist/Integration/components/pipelines/pipelines.component.d.ts +203 -0
  34. package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -0
  35. package/dist/Integration/components/pipelines/pipelines.component.js +2057 -0
  36. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -0
  37. package/dist/Integration/components/schedules/schedules.component.d.ts +110 -0
  38. package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -0
  39. package/dist/Integration/components/schedules/schedules.component.js +842 -0
  40. package/dist/Integration/components/schedules/schedules.component.js.map +1 -0
  41. package/dist/Integration/components/visual-editor/visual-editor.component.d.ts +141 -0
  42. package/dist/Integration/components/visual-editor/visual-editor.component.d.ts.map +1 -0
  43. package/dist/Integration/components/visual-editor/visual-editor.component.js +1538 -0
  44. package/dist/Integration/components/visual-editor/visual-editor.component.js.map +1 -0
  45. package/dist/Integration/components/widgets/run-history-panel.component.js +3 -2
  46. package/dist/Integration/components/widgets/run-history-panel.component.js.map +1 -1
  47. package/dist/Integration/index.d.ts +5 -3
  48. package/dist/Integration/index.d.ts.map +1 -1
  49. package/dist/Integration/index.js +11 -7
  50. package/dist/Integration/index.js.map +1 -1
  51. package/dist/Integration/integration.module.d.ts +20 -16
  52. package/dist/Integration/integration.module.d.ts.map +1 -1
  53. package/dist/Integration/integration.module.js +40 -21
  54. package/dist/Integration/integration.module.js.map +1 -1
  55. package/dist/Integration/services/integration-data.service.d.ts +123 -9
  56. package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
  57. package/dist/Integration/services/integration-data.service.js +385 -68
  58. package/dist/Integration/services/integration-data.service.js.map +1 -1
  59. package/dist/QueryBrowser/query-browser-resource.component.d.ts +27 -4
  60. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  61. package/dist/QueryBrowser/query-browser-resource.component.js +338 -144
  62. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  63. package/dist/__tests__/integration-data-service.test.js.map +1 -1
  64. package/dist/__tests__/mapping-validation.test.d.ts +2 -0
  65. package/dist/__tests__/mapping-validation.test.d.ts.map +1 -0
  66. package/dist/__tests__/mapping-validation.test.js +170 -0
  67. package/dist/__tests__/mapping-validation.test.js.map +1 -0
  68. package/package.json +40 -38
  69. package/dist/Integration/components/connection-studio/connection-studio.component.d.ts +0 -81
  70. package/dist/Integration/components/connection-studio/connection-studio.component.d.ts.map +0 -1
  71. package/dist/Integration/components/connection-studio/connection-studio.component.js +0 -960
  72. package/dist/Integration/components/connection-studio/connection-studio.component.js.map +0 -1
  73. package/dist/Integration/components/control-tower/control-tower.component.d.ts +0 -43
  74. package/dist/Integration/components/control-tower/control-tower.component.d.ts.map +0 -1
  75. package/dist/Integration/components/control-tower/control-tower.component.js +0 -446
  76. package/dist/Integration/components/control-tower/control-tower.component.js.map +0 -1
  77. package/dist/Integration/components/sync-activity/sync-activity.component.d.ts +0 -65
  78. package/dist/Integration/components/sync-activity/sync-activity.component.d.ts.map +0 -1
  79. package/dist/Integration/components/sync-activity/sync-activity.component.js +0 -671
  80. package/dist/Integration/components/sync-activity/sync-activity.component.js.map +0 -1
  81. package/dist/__tests__/connection-studio.test.d.ts +0 -2
  82. package/dist/__tests__/connection-studio.test.d.ts.map +0 -1
  83. package/dist/__tests__/connection-studio.test.js +0 -186
  84. package/dist/__tests__/connection-studio.test.js.map +0 -1
@@ -0,0 +1,961 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { ChangeDetectorRef, Component, inject } from '@angular/core';
8
+ import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
9
+ import { BaseResourceComponent } from '@memberjunction/ng-shared';
10
+ import { RunView } from '@memberjunction/core';
11
+ import { IntegrationDataService, } from '../../services/integration-data.service';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "@angular/forms";
14
+ import * as i2 from "@memberjunction/ng-shared-generic";
15
+ import * as i3 from "@angular/common";
16
+ const _forTrack0 = ($index, $item) => $item.ID;
17
+ const _forTrack1 = ($index, $item) => $item.Value;
18
+ const _forTrack2 = ($index, $item) => $item.EntityID;
19
+ function ActivityComponent_For_4_Template(rf, ctx) { if (rf & 1) {
20
+ const _r1 = i0.ɵɵgetCurrentView();
21
+ i0.ɵɵelementStart(0, "button", 15);
22
+ i0.ɵɵlistener("click", function ActivityComponent_For_4_Template_button_click_0_listener() { const status_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.SetStatusFilter(status_r2)); });
23
+ i0.ɵɵtext(1);
24
+ i0.ɵɵelementEnd();
25
+ } if (rf & 2) {
26
+ const status_r2 = ctx.$implicit;
27
+ const ctx_r2 = i0.ɵɵnextContext();
28
+ i0.ɵɵclassProp("active", ctx_r2.StatusFilter === status_r2);
29
+ i0.ɵɵadvance();
30
+ i0.ɵɵtextInterpolate1(" ", status_r2, " ");
31
+ } }
32
+ function ActivityComponent_For_10_Template(rf, ctx) { if (rf & 1) {
33
+ i0.ɵɵelementStart(0, "option", 7);
34
+ i0.ɵɵtext(1);
35
+ i0.ɵɵelementEnd();
36
+ } if (rf & 2) {
37
+ const opt_r4 = ctx.$implicit;
38
+ i0.ɵɵproperty("value", opt_r4.ID);
39
+ i0.ɵɵadvance();
40
+ i0.ɵɵtextInterpolate(opt_r4.Name);
41
+ } }
42
+ function ActivityComponent_For_13_Template(rf, ctx) { if (rf & 1) {
43
+ const _r5 = i0.ɵɵgetCurrentView();
44
+ i0.ɵɵelementStart(0, "button", 15);
45
+ i0.ɵɵlistener("click", function ActivityComponent_For_13_Template_button_click_0_listener() { const d_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.SetDateFilter(d_r6.Value)); });
46
+ i0.ɵɵtext(1);
47
+ i0.ɵɵelementEnd();
48
+ } if (rf & 2) {
49
+ const d_r6 = ctx.$implicit;
50
+ const ctx_r2 = i0.ɵɵnextContext();
51
+ i0.ɵɵclassProp("active", ctx_r2.DateFilter === d_r6.Value);
52
+ i0.ɵɵadvance();
53
+ i0.ɵɵtextInterpolate1(" ", d_r6.Label, " ");
54
+ } }
55
+ function ActivityComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
56
+ i0.ɵɵelementStart(0, "div", 11)(1, "div", 16);
57
+ i0.ɵɵelement(2, "span", 17);
58
+ i0.ɵɵelementStart(3, "span", 18);
59
+ i0.ɵɵtext(4);
60
+ i0.ɵɵelementEnd();
61
+ i0.ɵɵelementStart(5, "span", 19);
62
+ i0.ɵɵtext(6, "Total Runs");
63
+ i0.ɵɵelementEnd()();
64
+ i0.ɵɵelementStart(7, "div", 16);
65
+ i0.ɵɵelement(8, "span", 20);
66
+ i0.ɵɵelementStart(9, "span", 21);
67
+ i0.ɵɵtext(10);
68
+ i0.ɵɵelementEnd();
69
+ i0.ɵɵelementStart(11, "span", 19);
70
+ i0.ɵɵtext(12, "Successful");
71
+ i0.ɵɵelementEnd()();
72
+ i0.ɵɵelementStart(13, "div", 16);
73
+ i0.ɵɵelement(14, "span", 22);
74
+ i0.ɵɵelementStart(15, "span", 23);
75
+ i0.ɵɵtext(16);
76
+ i0.ɵɵelementEnd();
77
+ i0.ɵɵelementStart(17, "span", 19);
78
+ i0.ɵɵtext(18, "Failed");
79
+ i0.ɵɵelementEnd()();
80
+ i0.ɵɵelementStart(19, "div", 16);
81
+ i0.ɵɵelement(20, "span", 17);
82
+ i0.ɵɵelementStart(21, "span", 18);
83
+ i0.ɵɵtext(22);
84
+ i0.ɵɵpipe(23, "number");
85
+ i0.ɵɵelementEnd();
86
+ i0.ɵɵelementStart(24, "span", 19);
87
+ i0.ɵɵtext(25, "Records Processed");
88
+ i0.ɵɵelementEnd()()();
89
+ } if (rf & 2) {
90
+ const ctx_r2 = i0.ɵɵnextContext();
91
+ i0.ɵɵadvance(4);
92
+ i0.ɵɵtextInterpolate(ctx_r2.TotalRuns);
93
+ i0.ɵɵadvance(6);
94
+ i0.ɵɵtextInterpolate(ctx_r2.SuccessfulRuns);
95
+ i0.ɵɵadvance(6);
96
+ i0.ɵɵtextInterpolate(ctx_r2.FailedRuns);
97
+ i0.ɵɵadvance(6);
98
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(23, 4, ctx_r2.TotalRecordsProcessed));
99
+ } }
100
+ function ActivityComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
101
+ i0.ɵɵelementStart(0, "div", 12);
102
+ i0.ɵɵelement(1, "mj-loading", 24);
103
+ i0.ɵɵelementEnd();
104
+ } }
105
+ function ActivityComponent_Conditional_20_Template(rf, ctx) { if (rf & 1) {
106
+ i0.ɵɵelementStart(0, "div", 13);
107
+ i0.ɵɵelement(1, "i", 25);
108
+ i0.ɵɵelementStart(2, "p");
109
+ i0.ɵɵtext(3, "No runs found for the selected filters.");
110
+ i0.ɵɵelementEnd()();
111
+ } }
112
+ function ActivityComponent_Conditional_21_For_3_Conditional_17_Template(rf, ctx) { if (rf & 1) {
113
+ i0.ɵɵelement(0, "i", 39);
114
+ } }
115
+ function ActivityComponent_Conditional_21_For_3_Conditional_22_Conditional_1_Template(rf, ctx) { if (rf & 1) {
116
+ i0.ɵɵelementStart(0, "div", 45);
117
+ i0.ɵɵelement(1, "mj-loading", 49);
118
+ i0.ɵɵelementEnd();
119
+ } }
120
+ function ActivityComponent_Conditional_21_For_3_Conditional_22_Conditional_2_Template(rf, ctx) { if (rf & 1) {
121
+ i0.ɵɵelementStart(0, "div", 46);
122
+ i0.ɵɵelement(1, "i", 50);
123
+ i0.ɵɵtext(2, " No entity details for this run. ");
124
+ i0.ɵɵelementEnd();
125
+ } }
126
+ function ActivityComponent_Conditional_21_For_3_Conditional_22_Conditional_3_For_19_Template(rf, ctx) { if (rf & 1) {
127
+ i0.ɵɵelementStart(0, "tr")(1, "td");
128
+ i0.ɵɵtext(2);
129
+ i0.ɵɵelementEnd();
130
+ i0.ɵɵelementStart(3, "td", 51);
131
+ i0.ɵɵtext(4);
132
+ i0.ɵɵpipe(5, "number");
133
+ i0.ɵɵelementEnd();
134
+ i0.ɵɵelementStart(6, "td", 53);
135
+ i0.ɵɵtext(7);
136
+ i0.ɵɵpipe(8, "number");
137
+ i0.ɵɵelementEnd();
138
+ i0.ɵɵelementStart(9, "td", 54);
139
+ i0.ɵɵtext(10);
140
+ i0.ɵɵpipe(11, "number");
141
+ i0.ɵɵelementEnd();
142
+ i0.ɵɵelementStart(12, "td", 51);
143
+ i0.ɵɵtext(13);
144
+ i0.ɵɵpipe(14, "number");
145
+ i0.ɵɵelementEnd();
146
+ i0.ɵɵelementStart(15, "td", 55);
147
+ i0.ɵɵtext(16);
148
+ i0.ɵɵpipe(17, "number");
149
+ i0.ɵɵelementEnd();
150
+ i0.ɵɵelementStart(18, "td", 51);
151
+ i0.ɵɵtext(19);
152
+ i0.ɵɵpipe(20, "number");
153
+ i0.ɵɵelementEnd()();
154
+ } if (rf & 2) {
155
+ const detail_r10 = ctx.$implicit;
156
+ i0.ɵɵclassProp("error-row", detail_r10.RecordsErrored > 0);
157
+ i0.ɵɵadvance(2);
158
+ i0.ɵɵtextInterpolate(detail_r10.Entity);
159
+ i0.ɵɵadvance(2);
160
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 9, detail_r10.RecordsProcessed));
161
+ i0.ɵɵadvance(3);
162
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(8, 11, detail_r10.RecordsCreated));
163
+ i0.ɵɵadvance(3);
164
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(11, 13, detail_r10.RecordsUpdated));
165
+ i0.ɵɵadvance(3);
166
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(14, 15, detail_r10.RecordsDeleted));
167
+ i0.ɵɵadvance(3);
168
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(17, 17, detail_r10.RecordsErrored));
169
+ i0.ɵɵadvance(3);
170
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(20, 19, detail_r10.RecordsSkipped));
171
+ } }
172
+ function ActivityComponent_Conditional_21_For_3_Conditional_22_Conditional_3_Template(rf, ctx) { if (rf & 1) {
173
+ i0.ɵɵelementStart(0, "table", 47)(1, "thead")(2, "tr")(3, "th");
174
+ i0.ɵɵtext(4, "Entity");
175
+ i0.ɵɵelementEnd();
176
+ i0.ɵɵelementStart(5, "th", 51);
177
+ i0.ɵɵtext(6, "Processed");
178
+ i0.ɵɵelementEnd();
179
+ i0.ɵɵelementStart(7, "th", 51);
180
+ i0.ɵɵtext(8, "Created");
181
+ i0.ɵɵelementEnd();
182
+ i0.ɵɵelementStart(9, "th", 51);
183
+ i0.ɵɵtext(10, "Updated");
184
+ i0.ɵɵelementEnd();
185
+ i0.ɵɵelementStart(11, "th", 51);
186
+ i0.ɵɵtext(12, "Deleted");
187
+ i0.ɵɵelementEnd();
188
+ i0.ɵɵelementStart(13, "th", 51);
189
+ i0.ɵɵtext(14, "Errored");
190
+ i0.ɵɵelementEnd();
191
+ i0.ɵɵelementStart(15, "th", 51);
192
+ i0.ɵɵtext(16, "Skipped");
193
+ i0.ɵɵelementEnd()()();
194
+ i0.ɵɵelementStart(17, "tbody");
195
+ i0.ɵɵrepeaterCreate(18, ActivityComponent_Conditional_21_For_3_Conditional_22_Conditional_3_For_19_Template, 21, 21, "tr", 52, _forTrack2);
196
+ i0.ɵɵelementEnd()();
197
+ } if (rf & 2) {
198
+ const ctx_r2 = i0.ɵɵnextContext(4);
199
+ i0.ɵɵadvance(18);
200
+ i0.ɵɵrepeater(ctx_r2.GetExpandedDetails());
201
+ } }
202
+ function ActivityComponent_Conditional_21_For_3_Conditional_22_Conditional_4_Template(rf, ctx) { if (rf & 1) {
203
+ i0.ɵɵelementStart(0, "div", 48)(1, "div", 56);
204
+ i0.ɵɵelement(2, "i", 39);
205
+ i0.ɵɵtext(3, " Error Log ");
206
+ i0.ɵɵelementEnd();
207
+ i0.ɵɵelementStart(4, "pre", 57);
208
+ i0.ɵɵtext(5);
209
+ i0.ɵɵelementEnd()();
210
+ } if (rf & 2) {
211
+ const run_r8 = i0.ɵɵnextContext(2).$implicit;
212
+ i0.ɵɵadvance(5);
213
+ i0.ɵɵtextInterpolate(run_r8.ErrorLog);
214
+ } }
215
+ function ActivityComponent_Conditional_21_For_3_Conditional_22_Template(rf, ctx) { if (rf & 1) {
216
+ const _r9 = i0.ɵɵgetCurrentView();
217
+ i0.ɵɵelementStart(0, "div", 44);
218
+ i0.ɵɵlistener("click", function ActivityComponent_Conditional_21_For_3_Conditional_22_Template_div_click_0_listener($event) { i0.ɵɵrestoreView(_r9); return i0.ɵɵresetView($event.stopPropagation()); });
219
+ i0.ɵɵconditionalCreate(1, ActivityComponent_Conditional_21_For_3_Conditional_22_Conditional_1_Template, 2, 0, "div", 45)(2, ActivityComponent_Conditional_21_For_3_Conditional_22_Conditional_2_Template, 3, 0, "div", 46)(3, ActivityComponent_Conditional_21_For_3_Conditional_22_Conditional_3_Template, 20, 0, "table", 47);
220
+ i0.ɵɵconditionalCreate(4, ActivityComponent_Conditional_21_For_3_Conditional_22_Conditional_4_Template, 6, 1, "div", 48);
221
+ i0.ɵɵelementEnd();
222
+ } if (rf & 2) {
223
+ const run_r8 = i0.ɵɵnextContext().$implicit;
224
+ const ctx_r2 = i0.ɵɵnextContext(2);
225
+ i0.ɵɵadvance();
226
+ i0.ɵɵconditional(ctx_r2.IsLoadingExpandedDetails() ? 1 : ctx_r2.GetExpandedDetails().length === 0 ? 2 : 3);
227
+ i0.ɵɵadvance(3);
228
+ i0.ɵɵconditional(run_r8.ErrorLog ? 4 : -1);
229
+ } }
230
+ function ActivityComponent_Conditional_21_For_3_Template(rf, ctx) { if (rf & 1) {
231
+ const _r7 = i0.ɵɵgetCurrentView();
232
+ i0.ɵɵelementStart(0, "div", 29);
233
+ i0.ɵɵlistener("click", function ActivityComponent_Conditional_21_For_3_Template_div_click_0_listener() { const run_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.SelectRun(run_r8.ID)); });
234
+ i0.ɵɵelementStart(1, "div", 30);
235
+ i0.ɵɵelement(2, "span")(3, "i", 31);
236
+ i0.ɵɵelementStart(4, "div", 32)(5, "span", 33);
237
+ i0.ɵɵtext(6);
238
+ i0.ɵɵelementEnd();
239
+ i0.ɵɵelementStart(7, "span", 34);
240
+ i0.ɵɵtext(8);
241
+ i0.ɵɵelementEnd()();
242
+ i0.ɵɵelementStart(9, "div", 35);
243
+ i0.ɵɵtext(10);
244
+ i0.ɵɵelementEnd();
245
+ i0.ɵɵelementStart(11, "div", 36);
246
+ i0.ɵɵtext(12);
247
+ i0.ɵɵelementEnd();
248
+ i0.ɵɵelementStart(13, "div", 37);
249
+ i0.ɵɵtext(14);
250
+ i0.ɵɵpipe(15, "number");
251
+ i0.ɵɵelementEnd();
252
+ i0.ɵɵelementStart(16, "div", 38);
253
+ i0.ɵɵconditionalCreate(17, ActivityComponent_Conditional_21_For_3_Conditional_17_Template, 1, 0, "i", 39);
254
+ i0.ɵɵelementEnd();
255
+ i0.ɵɵelementStart(18, "div", 40);
256
+ i0.ɵɵtext(19);
257
+ i0.ɵɵelementEnd();
258
+ i0.ɵɵelementStart(20, "button", 41);
259
+ i0.ɵɵlistener("click", function ActivityComponent_Conditional_21_For_3_Template_button_click_20_listener($event) { const run_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); ctx_r2.ToggleExpand(run_r8.ID); return i0.ɵɵresetView($event.stopPropagation()); });
260
+ i0.ɵɵelement(21, "i", 42);
261
+ i0.ɵɵelementEnd()();
262
+ i0.ɵɵconditionalCreate(22, ActivityComponent_Conditional_21_For_3_Conditional_22_Template, 5, 2, "div", 43);
263
+ i0.ɵɵelementEnd();
264
+ } if (rf & 2) {
265
+ const run_r8 = ctx.$implicit;
266
+ const ctx_r2 = i0.ɵɵnextContext(2);
267
+ i0.ɵɵclassProp("selected", ctx_r2.IsSelectedRun(run_r8.ID));
268
+ i0.ɵɵadvance(2);
269
+ i0.ɵɵclassMap(ctx_r2.GetStatusDotClass(run_r8.Status));
270
+ i0.ɵɵadvance();
271
+ i0.ɵɵclassMap(ctx_r2.GetStatusIcon(run_r8.Status));
272
+ i0.ɵɵclassProp("icon-green", run_r8.Status === "Success")("icon-red", run_r8.Status === "Failed")("icon-amber", run_r8.Status === "In Progress")("icon-gray", run_r8.Status === "Pending");
273
+ i0.ɵɵadvance(3);
274
+ i0.ɵɵtextInterpolate(run_r8.Integration);
275
+ i0.ɵɵadvance(2);
276
+ i0.ɵɵtextInterpolate(run_r8.Company);
277
+ i0.ɵɵadvance();
278
+ i0.ɵɵproperty("title", ctx_r2.FormatAbsoluteDate(run_r8.StartedAt));
279
+ i0.ɵɵadvance();
280
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.GetRelativeTime(run_r8.StartedAt), " ");
281
+ i0.ɵɵadvance(2);
282
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.FormatDuration(run_r8.StartedAt, run_r8.EndedAt), " ");
283
+ i0.ɵɵadvance(2);
284
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(15, 27, run_r8.TotalRecords), " ");
285
+ i0.ɵɵadvance(2);
286
+ i0.ɵɵclassProp("has-errors", run_r8.ErrorLog);
287
+ i0.ɵɵadvance();
288
+ i0.ɵɵconditional(run_r8.ErrorLog ? 17 : -1);
289
+ i0.ɵɵadvance(2);
290
+ i0.ɵɵtextInterpolate1(" ", run_r8.RunByUser || "Scheduled", " ");
291
+ i0.ɵɵadvance(2);
292
+ i0.ɵɵclassProp("rotated", ctx_r2.IsExpanded(run_r8.ID));
293
+ i0.ɵɵadvance();
294
+ i0.ɵɵconditional(ctx_r2.IsExpanded(run_r8.ID) ? 22 : -1);
295
+ } }
296
+ function ActivityComponent_Conditional_21_Conditional_4_Conditional_12_Template(rf, ctx) { if (rf & 1) {
297
+ i0.ɵɵelementStart(0, "div", 63)(1, "div", 69);
298
+ i0.ɵɵelement(2, "div", 70);
299
+ i0.ɵɵelementEnd();
300
+ i0.ɵɵelementStart(3, "div", 71)(4, "span");
301
+ i0.ɵɵtext(5);
302
+ i0.ɵɵelementEnd();
303
+ i0.ɵɵelementStart(6, "span", 72);
304
+ i0.ɵɵtext(7);
305
+ i0.ɵɵelementEnd();
306
+ i0.ɵɵelementStart(8, "span");
307
+ i0.ɵɵtext(9);
308
+ i0.ɵɵelementEnd()()();
309
+ } if (rf & 2) {
310
+ const ctx_r2 = i0.ɵɵnextContext(3);
311
+ i0.ɵɵadvance(2);
312
+ i0.ɵɵstyleProp("width", ctx_r2.GetDurationBarWidth(ctx_r2.GetSelectedRun()), "%");
313
+ i0.ɵɵadvance(3);
314
+ i0.ɵɵtextInterpolate(ctx_r2.FormatDate(ctx_r2.GetSelectedRun().StartedAt));
315
+ i0.ɵɵadvance(2);
316
+ i0.ɵɵtextInterpolate(ctx_r2.GetDurationBarLabel(ctx_r2.GetSelectedRun()));
317
+ i0.ɵɵadvance(2);
318
+ i0.ɵɵtextInterpolate(ctx_r2.FormatDate(ctx_r2.GetSelectedRun().EndedAt));
319
+ } }
320
+ function ActivityComponent_Conditional_21_Conditional_4_Conditional_21_Conditional_0_Template(rf, ctx) { if (rf & 1) {
321
+ i0.ɵɵelementStart(0, "div", 73);
322
+ i0.ɵɵelement(1, "mj-loading", 77);
323
+ i0.ɵɵelementEnd();
324
+ } }
325
+ function ActivityComponent_Conditional_21_Conditional_4_Conditional_21_Conditional_1_Template(rf, ctx) { if (rf & 1) {
326
+ i0.ɵɵelementStart(0, "div", 74);
327
+ i0.ɵɵelement(1, "i", 50);
328
+ i0.ɵɵelementStart(2, "p");
329
+ i0.ɵɵtext(3, "No entity detail records for this run.");
330
+ i0.ɵɵelementEnd()();
331
+ } }
332
+ function ActivityComponent_Conditional_21_Conditional_4_Conditional_21_Conditional_2_For_19_Template(rf, ctx) { if (rf & 1) {
333
+ i0.ɵɵelementStart(0, "tr")(1, "td");
334
+ i0.ɵɵtext(2);
335
+ i0.ɵɵelementEnd();
336
+ i0.ɵɵelementStart(3, "td", 51);
337
+ i0.ɵɵtext(4);
338
+ i0.ɵɵpipe(5, "number");
339
+ i0.ɵɵelementEnd();
340
+ i0.ɵɵelementStart(6, "td", 53);
341
+ i0.ɵɵtext(7);
342
+ i0.ɵɵpipe(8, "number");
343
+ i0.ɵɵelementEnd();
344
+ i0.ɵɵelementStart(9, "td", 54);
345
+ i0.ɵɵtext(10);
346
+ i0.ɵɵpipe(11, "number");
347
+ i0.ɵɵelementEnd();
348
+ i0.ɵɵelementStart(12, "td", 51);
349
+ i0.ɵɵtext(13);
350
+ i0.ɵɵpipe(14, "number");
351
+ i0.ɵɵelementEnd();
352
+ i0.ɵɵelementStart(15, "td", 55);
353
+ i0.ɵɵtext(16);
354
+ i0.ɵɵpipe(17, "number");
355
+ i0.ɵɵelementEnd();
356
+ i0.ɵɵelementStart(18, "td", 51);
357
+ i0.ɵɵtext(19);
358
+ i0.ɵɵpipe(20, "number");
359
+ i0.ɵɵelementEnd()();
360
+ } if (rf & 2) {
361
+ const detail_r12 = ctx.$implicit;
362
+ i0.ɵɵclassProp("error-row", detail_r12.RecordsErrored > 0);
363
+ i0.ɵɵadvance(2);
364
+ i0.ɵɵtextInterpolate(detail_r12.Entity);
365
+ i0.ɵɵadvance(2);
366
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 9, detail_r12.RecordsProcessed));
367
+ i0.ɵɵadvance(3);
368
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(8, 11, detail_r12.RecordsCreated));
369
+ i0.ɵɵadvance(3);
370
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(11, 13, detail_r12.RecordsUpdated));
371
+ i0.ɵɵadvance(3);
372
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(14, 15, detail_r12.RecordsDeleted));
373
+ i0.ɵɵadvance(3);
374
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(17, 17, detail_r12.RecordsErrored));
375
+ i0.ɵɵadvance(3);
376
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(20, 19, detail_r12.RecordsSkipped));
377
+ } }
378
+ function ActivityComponent_Conditional_21_Conditional_4_Conditional_21_Conditional_2_Template(rf, ctx) { if (rf & 1) {
379
+ i0.ɵɵelementStart(0, "table", 75)(1, "thead")(2, "tr")(3, "th");
380
+ i0.ɵɵtext(4, "Entity");
381
+ i0.ɵɵelementEnd();
382
+ i0.ɵɵelementStart(5, "th", 51);
383
+ i0.ɵɵtext(6, "Processed");
384
+ i0.ɵɵelementEnd();
385
+ i0.ɵɵelementStart(7, "th", 51);
386
+ i0.ɵɵtext(8, "Created");
387
+ i0.ɵɵelementEnd();
388
+ i0.ɵɵelementStart(9, "th", 51);
389
+ i0.ɵɵtext(10, "Updated");
390
+ i0.ɵɵelementEnd();
391
+ i0.ɵɵelementStart(11, "th", 51);
392
+ i0.ɵɵtext(12, "Deleted");
393
+ i0.ɵɵelementEnd();
394
+ i0.ɵɵelementStart(13, "th", 51);
395
+ i0.ɵɵtext(14, "Errors");
396
+ i0.ɵɵelementEnd();
397
+ i0.ɵɵelementStart(15, "th", 51);
398
+ i0.ɵɵtext(16, "Skipped");
399
+ i0.ɵɵelementEnd()()();
400
+ i0.ɵɵelementStart(17, "tbody");
401
+ i0.ɵɵrepeaterCreate(18, ActivityComponent_Conditional_21_Conditional_4_Conditional_21_Conditional_2_For_19_Template, 21, 21, "tr", 52, _forTrack2);
402
+ i0.ɵɵelementEnd()();
403
+ } if (rf & 2) {
404
+ const ctx_r2 = i0.ɵɵnextContext(4);
405
+ i0.ɵɵadvance(18);
406
+ i0.ɵɵrepeater(ctx_r2.SelectedRunDetails);
407
+ } }
408
+ function ActivityComponent_Conditional_21_Conditional_4_Conditional_21_Conditional_3_Template(rf, ctx) { if (rf & 1) {
409
+ i0.ɵɵelementStart(0, "div", 76)(1, "div", 56);
410
+ i0.ɵɵelement(2, "i", 39);
411
+ i0.ɵɵtext(3, " Error Log ");
412
+ i0.ɵɵelementEnd();
413
+ i0.ɵɵelementStart(4, "pre", 57);
414
+ i0.ɵɵtext(5);
415
+ i0.ɵɵelementEnd()();
416
+ } if (rf & 2) {
417
+ const ctx_r2 = i0.ɵɵnextContext(4);
418
+ i0.ɵɵadvance(5);
419
+ i0.ɵɵtextInterpolate(ctx_r2.GetSelectedRun().ErrorLog);
420
+ } }
421
+ function ActivityComponent_Conditional_21_Conditional_4_Conditional_21_Template(rf, ctx) { if (rf & 1) {
422
+ i0.ɵɵconditionalCreate(0, ActivityComponent_Conditional_21_Conditional_4_Conditional_21_Conditional_0_Template, 2, 0, "div", 73)(1, ActivityComponent_Conditional_21_Conditional_4_Conditional_21_Conditional_1_Template, 4, 0, "div", 74)(2, ActivityComponent_Conditional_21_Conditional_4_Conditional_21_Conditional_2_Template, 20, 0, "table", 75);
423
+ i0.ɵɵconditionalCreate(3, ActivityComponent_Conditional_21_Conditional_4_Conditional_21_Conditional_3_Template, 6, 1, "div", 76);
424
+ } if (rf & 2) {
425
+ let tmp_4_0;
426
+ const ctx_r2 = i0.ɵɵnextContext(3);
427
+ i0.ɵɵconditional(ctx_r2.IsLoadingDetail ? 0 : ctx_r2.SelectedRunDetails.length === 0 ? 1 : 2);
428
+ i0.ɵɵadvance(3);
429
+ i0.ɵɵconditional(((tmp_4_0 = ctx_r2.GetSelectedRun()) == null ? null : tmp_4_0.ErrorLog) ? 3 : -1);
430
+ } }
431
+ function ActivityComponent_Conditional_21_Conditional_4_Conditional_22_Conditional_0_Template(rf, ctx) { if (rf & 1) {
432
+ i0.ɵɵelementStart(0, "div", 73);
433
+ i0.ɵɵelement(1, "mj-loading", 78);
434
+ i0.ɵɵelementEnd();
435
+ } }
436
+ function ActivityComponent_Conditional_21_Conditional_4_Conditional_22_Conditional_1_Template(rf, ctx) { if (rf & 1) {
437
+ i0.ɵɵelementStart(0, "div", 74);
438
+ i0.ɵɵelement(1, "i", 79);
439
+ i0.ɵɵelementStart(2, "p");
440
+ i0.ɵɵtext(3, "No watermarks recorded for this integration.");
441
+ i0.ɵɵelementEnd()();
442
+ } }
443
+ function ActivityComponent_Conditional_21_Conditional_4_Conditional_22_Conditional_2_For_13_Template(rf, ctx) { if (rf & 1) {
444
+ i0.ɵɵelementStart(0, "tr")(1, "td");
445
+ i0.ɵɵtext(2);
446
+ i0.ɵɵelementEnd();
447
+ i0.ɵɵelementStart(3, "td")(4, "span", 80);
448
+ i0.ɵɵtext(5);
449
+ i0.ɵɵelementEnd()();
450
+ i0.ɵɵelementStart(6, "td", 81);
451
+ i0.ɵɵtext(7);
452
+ i0.ɵɵelementEnd();
453
+ i0.ɵɵelementStart(8, "td");
454
+ i0.ɵɵtext(9);
455
+ i0.ɵɵelementEnd()();
456
+ } if (rf & 2) {
457
+ const wm_r13 = ctx.$implicit;
458
+ const ctx_r2 = i0.ɵɵnextContext(5);
459
+ i0.ɵɵadvance(2);
460
+ i0.ɵɵtextInterpolate(wm_r13.EntityMap);
461
+ i0.ɵɵadvance(3);
462
+ i0.ɵɵtextInterpolate(wm_r13.WatermarkType);
463
+ i0.ɵɵadvance(2);
464
+ i0.ɵɵtextInterpolate(ctx_r2.FormatWatermark(wm_r13.WatermarkValue));
465
+ i0.ɵɵadvance(2);
466
+ i0.ɵɵtextInterpolate(ctx_r2.FormatDate(wm_r13.LastAppliedAt));
467
+ } }
468
+ function ActivityComponent_Conditional_21_Conditional_4_Conditional_22_Conditional_2_Template(rf, ctx) { if (rf & 1) {
469
+ i0.ɵɵelementStart(0, "table", 75)(1, "thead")(2, "tr")(3, "th");
470
+ i0.ɵɵtext(4, "Entity Map");
471
+ i0.ɵɵelementEnd();
472
+ i0.ɵɵelementStart(5, "th");
473
+ i0.ɵɵtext(6, "Type");
474
+ i0.ɵɵelementEnd();
475
+ i0.ɵɵelementStart(7, "th");
476
+ i0.ɵɵtext(8, "Current Value");
477
+ i0.ɵɵelementEnd();
478
+ i0.ɵɵelementStart(9, "th");
479
+ i0.ɵɵtext(10, "Last Applied");
480
+ i0.ɵɵelementEnd()()();
481
+ i0.ɵɵelementStart(11, "tbody");
482
+ i0.ɵɵrepeaterCreate(12, ActivityComponent_Conditional_21_Conditional_4_Conditional_22_Conditional_2_For_13_Template, 10, 4, "tr", null, _forTrack0);
483
+ i0.ɵɵelementEnd()();
484
+ } if (rf & 2) {
485
+ const ctx_r2 = i0.ɵɵnextContext(4);
486
+ i0.ɵɵadvance(12);
487
+ i0.ɵɵrepeater(ctx_r2.WatermarkData);
488
+ } }
489
+ function ActivityComponent_Conditional_21_Conditional_4_Conditional_22_Template(rf, ctx) { if (rf & 1) {
490
+ i0.ɵɵconditionalCreate(0, ActivityComponent_Conditional_21_Conditional_4_Conditional_22_Conditional_0_Template, 2, 0, "div", 73)(1, ActivityComponent_Conditional_21_Conditional_4_Conditional_22_Conditional_1_Template, 4, 0, "div", 74)(2, ActivityComponent_Conditional_21_Conditional_4_Conditional_22_Conditional_2_Template, 14, 0, "table", 75);
491
+ } if (rf & 2) {
492
+ const ctx_r2 = i0.ɵɵnextContext(3);
493
+ i0.ɵɵconditional(ctx_r2.IsLoadingWatermarks ? 0 : ctx_r2.WatermarkData.length === 0 ? 1 : 2);
494
+ } }
495
+ function ActivityComponent_Conditional_21_Conditional_4_Template(rf, ctx) { if (rf & 1) {
496
+ const _r11 = i0.ɵɵgetCurrentView();
497
+ i0.ɵɵelementStart(0, "div", 28)(1, "div", 58)(2, "div", 59)(3, "h3");
498
+ i0.ɵɵtext(4);
499
+ i0.ɵɵelementEnd();
500
+ i0.ɵɵelementStart(5, "span");
501
+ i0.ɵɵelement(6, "i");
502
+ i0.ɵɵtext(7);
503
+ i0.ɵɵelementEnd();
504
+ i0.ɵɵelementStart(8, "span", 60);
505
+ i0.ɵɵtext(9);
506
+ i0.ɵɵelementEnd()();
507
+ i0.ɵɵelementStart(10, "button", 61);
508
+ i0.ɵɵlistener("click", function ActivityComponent_Conditional_21_Conditional_4_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r11); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.SelectRun(ctx_r2.SelectedRunID)); });
509
+ i0.ɵɵelement(11, "i", 62);
510
+ i0.ɵɵelementEnd()();
511
+ i0.ɵɵconditionalCreate(12, ActivityComponent_Conditional_21_Conditional_4_Conditional_12_Template, 10, 5, "div", 63);
512
+ i0.ɵɵelementStart(13, "div", 64)(14, "button", 65);
513
+ i0.ɵɵlistener("click", function ActivityComponent_Conditional_21_Conditional_4_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r11); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.SetDetailTab("entities")); });
514
+ i0.ɵɵelement(15, "i", 66);
515
+ i0.ɵɵtext(16, " Entity Breakdown ");
516
+ i0.ɵɵelementEnd();
517
+ i0.ɵɵelementStart(17, "button", 65);
518
+ i0.ɵɵlistener("click", function ActivityComponent_Conditional_21_Conditional_4_Template_button_click_17_listener() { i0.ɵɵrestoreView(_r11); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.SetDetailTab("watermarks")); });
519
+ i0.ɵɵelement(18, "i", 67);
520
+ i0.ɵɵtext(19, " Watermarks ");
521
+ i0.ɵɵelementEnd()();
522
+ i0.ɵɵelementStart(20, "div", 68);
523
+ i0.ɵɵconditionalCreate(21, ActivityComponent_Conditional_21_Conditional_4_Conditional_21_Template, 4, 2);
524
+ i0.ɵɵconditionalCreate(22, ActivityComponent_Conditional_21_Conditional_4_Conditional_22_Template, 3, 1);
525
+ i0.ɵɵelementEnd()();
526
+ } if (rf & 2) {
527
+ const ctx_r2 = i0.ɵɵnextContext(2);
528
+ i0.ɵɵadvance(4);
529
+ i0.ɵɵtextInterpolate(ctx_r2.GetSelectedRun().Integration);
530
+ i0.ɵɵadvance();
531
+ i0.ɵɵclassMap(ctx_r2.StatusChipClass(ctx_r2.GetSelectedRun().Status));
532
+ i0.ɵɵadvance();
533
+ i0.ɵɵclassMap(ctx_r2.GetStatusIcon(ctx_r2.GetSelectedRun().Status));
534
+ i0.ɵɵadvance();
535
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.GetSelectedRun().Status, " ");
536
+ i0.ɵɵadvance(2);
537
+ i0.ɵɵtextInterpolate(ctx_r2.FormatDate(ctx_r2.GetSelectedRun().StartedAt));
538
+ i0.ɵɵadvance(3);
539
+ i0.ɵɵconditional(ctx_r2.GetSelectedRun().StartedAt && ctx_r2.GetSelectedRun().EndedAt ? 12 : -1);
540
+ i0.ɵɵadvance(2);
541
+ i0.ɵɵclassProp("active", ctx_r2.ActiveDetailTab === "entities");
542
+ i0.ɵɵadvance(3);
543
+ i0.ɵɵclassProp("active", ctx_r2.ActiveDetailTab === "watermarks");
544
+ i0.ɵɵadvance(4);
545
+ i0.ɵɵconditional(ctx_r2.ActiveDetailTab === "entities" ? 21 : -1);
546
+ i0.ɵɵadvance();
547
+ i0.ɵɵconditional(ctx_r2.ActiveDetailTab === "watermarks" ? 22 : -1);
548
+ } }
549
+ function ActivityComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
550
+ i0.ɵɵelementStart(0, "div", 14)(1, "div", 26);
551
+ i0.ɵɵrepeaterCreate(2, ActivityComponent_Conditional_21_For_3_Template, 23, 29, "div", 27, _forTrack0);
552
+ i0.ɵɵelementEnd();
553
+ i0.ɵɵconditionalCreate(4, ActivityComponent_Conditional_21_Conditional_4_Template, 23, 14, "div", 28);
554
+ i0.ɵɵelementEnd();
555
+ } if (rf & 2) {
556
+ const ctx_r2 = i0.ɵɵnextContext();
557
+ i0.ɵɵadvance(2);
558
+ i0.ɵɵrepeater(ctx_r2.FilteredRuns);
559
+ i0.ɵɵadvance(2);
560
+ i0.ɵɵconditional(ctx_r2.SelectedRunID && ctx_r2.GetSelectedRun() ? 4 : -1);
561
+ } }
562
+ let ActivityComponent = class ActivityComponent extends BaseResourceComponent {
563
+ // Data
564
+ AllRuns = [];
565
+ FilteredRuns = [];
566
+ Integrations = [];
567
+ SelectedRunID = null;
568
+ SelectedRunDetails = [];
569
+ WatermarkData = [];
570
+ IsLoading = true;
571
+ IsLoadingDetail = false;
572
+ // Filters
573
+ StatusFilter = 'All';
574
+ IntegrationFilter = null;
575
+ DateFilter = '7d';
576
+ SearchQuery = '';
577
+ ExpandedRunID = null;
578
+ // Expanded row details cache
579
+ expandedDetails = [];
580
+ isLoadingExpanded = false;
581
+ // Detail panel tab
582
+ ActiveDetailTab = 'entities';
583
+ IsLoadingWatermarks = false;
584
+ StatusOptions = ['All', 'Success', 'Failed', 'In Progress', 'Pending'];
585
+ DateOptions = [
586
+ { Value: 'today', Label: 'Today' },
587
+ { Value: '7d', Label: '7 Days' },
588
+ { Value: '30d', Label: '30 Days' },
589
+ { Value: 'all', Label: 'All' }
590
+ ];
591
+ dataService = inject(IntegrationDataService);
592
+ cdr = inject(ChangeDetectorRef);
593
+ async ngOnInit() {
594
+ await this.LoadData();
595
+ }
596
+ // ── Data Loading ──────────────────────────────────────────
597
+ async LoadData() {
598
+ this.IsLoading = true;
599
+ this.cdr.detectChanges();
600
+ try {
601
+ const provider = this.RunViewToUse;
602
+ const [summaries, runs] = await Promise.all([
603
+ this.dataService.LoadIntegrationSummaries(provider),
604
+ this.loadAllRuns(provider)
605
+ ]);
606
+ this.Integrations = this.buildIntegrationOptions(summaries);
607
+ this.AllRuns = runs;
608
+ this.ApplyFilters();
609
+ }
610
+ catch (err) {
611
+ console.error('[IntegrationActivity] Failed to load data:', err);
612
+ }
613
+ finally {
614
+ this.IsLoading = false;
615
+ this.cdr.detectChanges();
616
+ }
617
+ }
618
+ async loadAllRuns(provider) {
619
+ const rv = new RunView(provider ?? null);
620
+ const result = await rv.RunView({
621
+ EntityName: 'MJ: Company Integration Runs',
622
+ ExtraFilter: '',
623
+ OrderBy: 'StartedAt DESC',
624
+ MaxRows: 200,
625
+ Fields: ['ID', 'CompanyIntegrationID', 'StartedAt', 'EndedAt', 'TotalRecords',
626
+ 'Status', 'ErrorLog', 'Integration', 'Company', 'RunByUser'],
627
+ ResultType: 'simple'
628
+ });
629
+ return result.Results;
630
+ }
631
+ buildIntegrationOptions(summaries) {
632
+ return summaries.map(s => ({
633
+ ID: s.Integration.ID,
634
+ Name: `${s.Integration.Integration} (${s.Integration.Company})`
635
+ }));
636
+ }
637
+ async LoadRunDetails(runID) {
638
+ try {
639
+ return await this.dataService.LoadRunDetails(runID, this.RunViewToUse);
640
+ }
641
+ catch (err) {
642
+ console.error('[IntegrationActivity] Failed to load run details:', err);
643
+ return [];
644
+ }
645
+ }
646
+ async LoadWatermarks(companyIntegrationID) {
647
+ this.IsLoadingWatermarks = true;
648
+ this.cdr.detectChanges();
649
+ try {
650
+ this.WatermarkData = await this.loadWatermarkData(companyIntegrationID);
651
+ }
652
+ catch (err) {
653
+ console.error('[IntegrationActivity] Failed to load watermarks:', err);
654
+ }
655
+ finally {
656
+ this.IsLoadingWatermarks = false;
657
+ this.cdr.detectChanges();
658
+ }
659
+ }
660
+ async loadWatermarkData(companyIntegrationID) {
661
+ const entityMaps = await this.dataService.LoadEntityMaps(companyIntegrationID, this.RunViewToUse);
662
+ if (entityMaps.length === 0)
663
+ return [];
664
+ const entityMapIDs = entityMaps.map(m => `'${m.ID}'`).join(',');
665
+ const rv = new RunView(this.RunViewToUse ?? null);
666
+ const result = await rv.RunView({
667
+ EntityName: 'MJ: Company Integration Sync Watermarks',
668
+ ExtraFilter: `EntityMapID IN (${entityMapIDs})`,
669
+ OrderBy: 'LastAppliedAt DESC',
670
+ Fields: ['ID', 'EntityMapID', 'WatermarkType', 'WatermarkValue', 'LastAppliedAt'],
671
+ ResultType: 'simple'
672
+ });
673
+ return this.mergeWatermarksWithEntityMaps(result.Results, entityMaps);
674
+ }
675
+ mergeWatermarksWithEntityMaps(watermarks, entityMaps) {
676
+ const mapLookup = new Map(entityMaps.map(m => [m.ID.toLowerCase(), m]));
677
+ return watermarks.map(w => ({
678
+ ...w,
679
+ EntityMap: mapLookup.get(w.EntityMapID?.toLowerCase())?.ExternalObjectName ?? w.EntityMapID
680
+ }));
681
+ }
682
+ // ── Filtering ─────────────────────────────────────────────
683
+ ApplyFilters() {
684
+ let filtered = this.AllRuns;
685
+ filtered = this.filterByStatus(filtered);
686
+ filtered = this.filterByIntegration(filtered);
687
+ filtered = this.filterByDate(filtered);
688
+ filtered = this.filterBySearch(filtered);
689
+ this.FilteredRuns = filtered;
690
+ }
691
+ filterByStatus(runs) {
692
+ if (this.StatusFilter === 'All')
693
+ return runs;
694
+ return runs.filter(r => r.Status === this.StatusFilter);
695
+ }
696
+ filterByIntegration(runs) {
697
+ if (!this.IntegrationFilter)
698
+ return runs;
699
+ return runs.filter(r => UUIDsEqual(r.CompanyIntegrationID, this.IntegrationFilter));
700
+ }
701
+ filterByDate(runs) {
702
+ const cutoff = this.getDateCutoff(this.DateFilter);
703
+ if (!cutoff)
704
+ return runs;
705
+ return runs.filter(r => r.StartedAt && new Date(r.StartedAt) >= cutoff);
706
+ }
707
+ filterBySearch(runs) {
708
+ if (!this.SearchQuery.trim())
709
+ return runs;
710
+ const query = this.SearchQuery.toLowerCase().trim();
711
+ return runs.filter(r => r.Integration?.toLowerCase().includes(query) ||
712
+ r.Company?.toLowerCase().includes(query));
713
+ }
714
+ getDateCutoff(range) {
715
+ if (range === 'all')
716
+ return null;
717
+ const now = new Date();
718
+ if (range === 'today') {
719
+ const today = new Date(now);
720
+ today.setHours(0, 0, 0, 0);
721
+ return today;
722
+ }
723
+ const days = range === '7d' ? 7 : 30;
724
+ const cutoff = new Date(now);
725
+ cutoff.setDate(cutoff.getDate() - days);
726
+ return cutoff;
727
+ }
728
+ SetStatusFilter(status) {
729
+ this.StatusFilter = status;
730
+ this.ApplyFilters();
731
+ }
732
+ SetDateFilter(range) {
733
+ this.DateFilter = range;
734
+ this.ApplyFilters();
735
+ }
736
+ SetIntegrationFilter(id) {
737
+ this.IntegrationFilter = id;
738
+ this.ApplyFilters();
739
+ }
740
+ OnSearchChange() {
741
+ this.ApplyFilters();
742
+ }
743
+ async Refresh() {
744
+ await this.LoadData();
745
+ }
746
+ // ── Run Selection & Expansion ─────────────────────────────
747
+ async SelectRun(runID) {
748
+ if (UUIDsEqual(this.SelectedRunID, runID)) {
749
+ this.SelectedRunID = null;
750
+ this.SelectedRunDetails = [];
751
+ this.WatermarkData = [];
752
+ return;
753
+ }
754
+ this.SelectedRunID = runID;
755
+ this.ActiveDetailTab = 'entities';
756
+ this.IsLoadingDetail = true;
757
+ this.cdr.detectChanges();
758
+ const run = this.findRunByID(runID);
759
+ try {
760
+ this.SelectedRunDetails = await this.LoadRunDetails(runID);
761
+ if (run) {
762
+ await this.LoadWatermarks(run.CompanyIntegrationID);
763
+ }
764
+ }
765
+ finally {
766
+ this.IsLoadingDetail = false;
767
+ this.cdr.detectChanges();
768
+ }
769
+ }
770
+ async ToggleExpand(runID) {
771
+ if (UUIDsEqual(this.ExpandedRunID, runID)) {
772
+ this.ExpandedRunID = null;
773
+ this.expandedDetails = [];
774
+ return;
775
+ }
776
+ this.ExpandedRunID = runID;
777
+ this.isLoadingExpanded = true;
778
+ this.cdr.detectChanges();
779
+ try {
780
+ this.expandedDetails = await this.LoadRunDetails(runID);
781
+ }
782
+ finally {
783
+ this.isLoadingExpanded = false;
784
+ this.cdr.detectChanges();
785
+ }
786
+ }
787
+ IsExpanded(runID) {
788
+ return UUIDsEqual(this.ExpandedRunID, runID);
789
+ }
790
+ IsSelectedRun(runID) {
791
+ return UUIDsEqual(this.SelectedRunID, runID);
792
+ }
793
+ GetExpandedDetails() {
794
+ return this.expandedDetails;
795
+ }
796
+ IsLoadingExpandedDetails() {
797
+ return this.isLoadingExpanded;
798
+ }
799
+ GetSelectedRun() {
800
+ return this.findRunByID(this.SelectedRunID);
801
+ }
802
+ SetDetailTab(tab) {
803
+ this.ActiveDetailTab = tab;
804
+ }
805
+ findRunByID(runID) {
806
+ if (!runID)
807
+ return null;
808
+ return this.AllRuns.find(r => UUIDsEqual(r.ID, runID)) ?? null;
809
+ }
810
+ // ── Formatting Helpers ────────────────────────────────────
811
+ FormatDuration(startedAt, endedAt) {
812
+ if (!startedAt || !endedAt)
813
+ return '--';
814
+ const ms = new Date(endedAt).getTime() - new Date(startedAt).getTime();
815
+ return this.dataService.FormatDuration(ms);
816
+ }
817
+ GetRelativeTime(dateStr) {
818
+ return this.dataService.ComputeRelativeTime(dateStr);
819
+ }
820
+ FormatAbsoluteDate(dateStr) {
821
+ if (!dateStr)
822
+ return '';
823
+ return new Date(dateStr).toLocaleString(undefined, {
824
+ year: 'numeric', month: 'short', day: 'numeric',
825
+ hour: '2-digit', minute: '2-digit', second: '2-digit'
826
+ });
827
+ }
828
+ FormatWatermark(value) {
829
+ if (!value)
830
+ return 'Not set';
831
+ if (value.length > 40)
832
+ return value.substring(0, 37) + '...';
833
+ return value;
834
+ }
835
+ FormatDate(dateStr) {
836
+ if (!dateStr)
837
+ return '--';
838
+ return new Date(dateStr).toLocaleString(undefined, {
839
+ month: 'short', day: 'numeric',
840
+ hour: '2-digit', minute: '2-digit'
841
+ });
842
+ }
843
+ GetStatusIcon(status) {
844
+ if (status === 'Success')
845
+ return 'fa-solid fa-circle-check';
846
+ if (status === 'Failed')
847
+ return 'fa-solid fa-circle-xmark';
848
+ if (status === 'In Progress')
849
+ return 'fa-solid fa-spinner fa-spin';
850
+ return 'fa-solid fa-clock';
851
+ }
852
+ GetStatusColor(status) {
853
+ if (status === 'Success')
854
+ return 'green';
855
+ if (status === 'Failed')
856
+ return 'red';
857
+ if (status === 'In Progress')
858
+ return 'amber';
859
+ return 'gray';
860
+ }
861
+ GetStatusDotClass(status) {
862
+ return `status-dot dot-${this.GetStatusColor(status)}`;
863
+ }
864
+ StatusChipClass(status) {
865
+ return `chip chip-${this.GetStatusColor(status)}`;
866
+ }
867
+ GetErrorCount(run) {
868
+ return run.ErrorLog ? 1 : 0;
869
+ }
870
+ // ── Summary Computed Properties ───────────────────────────
871
+ get TotalRuns() {
872
+ return this.FilteredRuns.length;
873
+ }
874
+ get SuccessfulRuns() {
875
+ return this.FilteredRuns.filter(r => r.Status === 'Success').length;
876
+ }
877
+ get FailedRuns() {
878
+ return this.FilteredRuns.filter(r => r.Status === 'Failed').length;
879
+ }
880
+ get TotalRecordsProcessed() {
881
+ return this.FilteredRuns.reduce((acc, r) => acc + r.TotalRecords, 0);
882
+ }
883
+ // ── Duration Bar (detail panel) ───────────────────────────
884
+ GetDurationBarWidth(run) {
885
+ if (!run.StartedAt || !run.EndedAt)
886
+ return 0;
887
+ return 100;
888
+ }
889
+ GetDurationBarLabel(run) {
890
+ return this.FormatDuration(run.StartedAt, run.EndedAt);
891
+ }
892
+ // ── Resource overrides ────────────────────────────────────
893
+ async GetResourceDisplayName(_data) {
894
+ return 'Activity';
895
+ }
896
+ async GetResourceIconClass(_data) {
897
+ return 'fa-solid fa-clock-rotate-left';
898
+ }
899
+ static ɵfac = /*@__PURE__*/ (() => { let ɵActivityComponent_BaseFactory; return function ActivityComponent_Factory(__ngFactoryType__) { return (ɵActivityComponent_BaseFactory || (ɵActivityComponent_BaseFactory = i0.ɵɵgetInheritedFactory(ActivityComponent)))(__ngFactoryType__ || ActivityComponent); }; })();
900
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ActivityComponent, selectors: [["app-integration-activity"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 22, vars: 6, consts: [[1, "activity-container"], [1, "filter-bar"], [1, "filter-group", "filter-pills"], [1, "pill-btn", 3, "active"], [1, "filter-group"], [1, "filter-select", 3, "ngModelChange", "ngModel"], ["value", ""], [3, "value"], ["type", "text", "placeholder", "Search integrations...", 1, "search-input", 3, "ngModelChange", "input", "ngModel"], ["title", "Refresh", 1, "refresh-btn", 3, "click"], [1, "fa-solid", "fa-arrows-rotate"], [1, "summary-strip"], [1, "loading-area"], [1, "empty-state"], [1, "split-view"], [1, "pill-btn", 3, "click"], [1, "summary-badge"], [1, "badge-dot", "dot-blue"], [1, "badge-count"], [1, "badge-label"], [1, "badge-dot", "dot-green"], [1, "badge-count", "count-green"], [1, "badge-dot", "dot-red"], [1, "badge-count", "count-red"], ["text", "Loading activity...", "size", "medium"], [1, "fa-solid", "fa-inbox"], [1, "run-list-panel"], [1, "run-row", 3, "selected"], [1, "detail-panel"], [1, "run-row", 3, "click"], [1, "run-row-main"], [1, "status-icon"], [1, "run-info"], [1, "run-integration"], [1, "run-company"], [1, "run-meta", 3, "title"], [1, "run-meta", "run-duration"], [1, "run-meta", "run-records"], [1, "run-meta", "run-errors"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "run-meta", "run-user"], ["title", "Show entity breakdown", 1, "expand-btn", 3, "click"], [1, "fa-solid", "fa-chevron-down"], [1, "expanded-section"], [1, "expanded-section", 3, "click"], [1, "expanded-loading"], [1, "expanded-empty"], [1, "entity-table"], [1, "error-log-block"], ["text", "Loading breakdown...", "size", "small"], [1, "fa-solid", "fa-circle-info"], [1, "num-col"], [3, "error-row"], [1, "num-col", "created-col"], [1, "num-col", "updated-col"], [1, "num-col", "error-col"], [1, "error-log-label"], [1, "error-log-content"], [1, "detail-header"], [1, "detail-header-info"], [1, "detail-time"], ["title", "Close", 1, "close-detail-btn", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "duration-bar-container"], [1, "detail-tabs"], [1, "tab-btn", 3, "click"], [1, "fa-solid", "fa-table"], [1, "fa-solid", "fa-droplet"], [1, "detail-content"], [1, "duration-bar-track"], [1, "duration-bar-fill"], [1, "duration-bar-labels"], [1, "duration-bar-value"], [1, "detail-loading"], [1, "detail-empty"], [1, "detail-table"], [1, "error-log-block", "detail-error-log"], ["text", "Loading details...", "size", "small"], ["text", "Loading watermarks...", "size", "small"], [1, "fa-solid", "fa-droplet-slash"], [1, "type-badge"], [1, "mono-cell", "watermark-value"]], template: function ActivityComponent_Template(rf, ctx) { if (rf & 1) {
901
+ i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2);
902
+ i0.ɵɵrepeaterCreate(3, ActivityComponent_For_4_Template, 2, 3, "button", 3, i0.ɵɵrepeaterTrackByIdentity);
903
+ i0.ɵɵelementEnd();
904
+ i0.ɵɵelementStart(5, "div", 4)(6, "select", 5);
905
+ i0.ɵɵlistener("ngModelChange", function ActivityComponent_Template_select_ngModelChange_6_listener($event) { return ctx.SetIntegrationFilter($event || null); });
906
+ i0.ɵɵelementStart(7, "option", 6);
907
+ i0.ɵɵtext(8, "All Integrations");
908
+ i0.ɵɵelementEnd();
909
+ i0.ɵɵrepeaterCreate(9, ActivityComponent_For_10_Template, 2, 2, "option", 7, _forTrack0);
910
+ i0.ɵɵelementEnd()();
911
+ i0.ɵɵelementStart(11, "div", 2);
912
+ i0.ɵɵrepeaterCreate(12, ActivityComponent_For_13_Template, 2, 3, "button", 3, _forTrack1);
913
+ i0.ɵɵelementEnd();
914
+ i0.ɵɵelementStart(14, "div", 4)(15, "input", 8);
915
+ i0.ɵɵtwoWayListener("ngModelChange", function ActivityComponent_Template_input_ngModelChange_15_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.SearchQuery, $event) || (ctx.SearchQuery = $event); return $event; });
916
+ i0.ɵɵlistener("input", function ActivityComponent_Template_input_input_15_listener() { return ctx.OnSearchChange(); });
917
+ i0.ɵɵelementEnd()();
918
+ i0.ɵɵelementStart(16, "button", 9);
919
+ i0.ɵɵlistener("click", function ActivityComponent_Template_button_click_16_listener() { return ctx.Refresh(); });
920
+ i0.ɵɵelement(17, "i", 10);
921
+ i0.ɵɵelementEnd()();
922
+ i0.ɵɵconditionalCreate(18, ActivityComponent_Conditional_18_Template, 26, 6, "div", 11);
923
+ i0.ɵɵconditionalCreate(19, ActivityComponent_Conditional_19_Template, 2, 0, "div", 12);
924
+ i0.ɵɵconditionalCreate(20, ActivityComponent_Conditional_20_Template, 4, 0, "div", 13);
925
+ i0.ɵɵconditionalCreate(21, ActivityComponent_Conditional_21_Template, 5, 1, "div", 14);
926
+ i0.ɵɵelementEnd();
927
+ } if (rf & 2) {
928
+ i0.ɵɵadvance(3);
929
+ i0.ɵɵrepeater(ctx.StatusOptions);
930
+ i0.ɵɵadvance(3);
931
+ i0.ɵɵproperty("ngModel", ctx.IntegrationFilter ?? "");
932
+ i0.ɵɵadvance(3);
933
+ i0.ɵɵrepeater(ctx.Integrations);
934
+ i0.ɵɵadvance(3);
935
+ i0.ɵɵrepeater(ctx.DateOptions);
936
+ i0.ɵɵadvance(3);
937
+ i0.ɵɵtwoWayProperty("ngModel", ctx.SearchQuery);
938
+ i0.ɵɵadvance(3);
939
+ i0.ɵɵconditional(!ctx.IsLoading && ctx.AllRuns.length > 0 ? 18 : -1);
940
+ i0.ɵɵadvance();
941
+ i0.ɵɵconditional(ctx.IsLoading ? 19 : -1);
942
+ i0.ɵɵadvance();
943
+ i0.ɵɵconditional(!ctx.IsLoading && ctx.FilteredRuns.length === 0 ? 20 : -1);
944
+ i0.ɵɵadvance();
945
+ i0.ɵɵconditional(!ctx.IsLoading && ctx.FilteredRuns.length > 0 ? 21 : -1);
946
+ } }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.LoadingComponent, i3.DecimalPipe], styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n}\n\n.activity-container[_ngcontent-%COMP%] {\n padding: 20px;\n height: 100%;\n display: flex;\n flex-direction: column;\n gap: 14px;\n overflow: auto;\n}\n\n\n\n\n.filter-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.filter-group[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.filter-pills[_ngcontent-%COMP%] {\n gap: 0;\n}\n\n.pill-btn[_ngcontent-%COMP%] {\n height: 32px;\n padding: 0 14px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-muted);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.15s, color 0.15s, border-color 0.15s;\n white-space: nowrap;\n}\n\n.pill-btn[_ngcontent-%COMP%]:first-child {\n border-radius: 9999px 0 0 9999px;\n}\n\n.pill-btn[_ngcontent-%COMP%]:last-child {\n border-radius: 0 9999px 9999px 0;\n}\n\n.pill-btn[_ngcontent-%COMP%]:not(:first-child) {\n margin-left: -1px;\n}\n\n.pill-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-info-bg);\n border-color: var(--mj-border-strong);\n z-index: 1;\n}\n\n.pill-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-bg-surface);\n border-color: var(--mj-brand-primary);\n z-index: 2;\n}\n\n.filter-select[_ngcontent-%COMP%] {\n padding: 6px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n min-width: 180px;\n height: 32px;\n}\n\n.filter-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n.search-input[_ngcontent-%COMP%] {\n padding: 6px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n min-width: 180px;\n height: 32px;\n}\n\n.search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.search-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n.refresh-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n transition: background 0.15s, color 0.15s;\n}\n\n.refresh-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-info-bg);\n color: var(--mj-brand-primary);\n}\n\n\n\n\n.summary-strip[_ngcontent-%COMP%] {\n display: inline-flex;\n gap: 16px;\n flex-wrap: wrap;\n}\n\n.summary-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.badge-dot[_ngcontent-%COMP%] {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.dot-blue[_ngcontent-%COMP%] { background: var(--mj-color-info-500); }\n.dot-green[_ngcontent-%COMP%] { background: var(--mj-color-success-600); }\n.dot-red[_ngcontent-%COMP%] { background: var(--mj-status-error); }\n.dot-amber[_ngcontent-%COMP%] { background: var(--mj-status-warning); }\n.dot-gray[_ngcontent-%COMP%] { background: var(--mj-text-disabled); }\n\n.badge-count[_ngcontent-%COMP%] {\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.count-green[_ngcontent-%COMP%] { color: var(--mj-color-success-600); }\n.count-red[_ngcontent-%COMP%] { color: var(--mj-color-error-600); }\n\n.badge-label[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-size: 12px;\n}\n\n\n\n\n.loading-area[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n padding: 48px;\n}\n\n.empty-state[_ngcontent-%COMP%] {\n text-align: center;\n padding: 48px;\n color: var(--mj-text-disabled);\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n margin-bottom: 12px;\n display: block;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n}\n\n\n\n\n.split-view[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n\n\n\n.run-list-panel[_ngcontent-%COMP%] {\n flex: 7;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n}\n\n.run-row[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-border-subtle);\n cursor: pointer;\n transition: background 0.1s;\n}\n\n.run-row[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-page);\n}\n\n.run-row.selected[_ngcontent-%COMP%] {\n background: var(--mj-status-info-bg);\n}\n\n.run-row-main[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n}\n\n\n\n.status-dot[_ngcontent-%COMP%] {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.status-icon[_ngcontent-%COMP%] {\n font-size: 14px;\n width: 16px;\n text-align: center;\n flex-shrink: 0;\n}\n\n.icon-green[_ngcontent-%COMP%] { color: var(--mj-color-success-600); }\n.icon-red[_ngcontent-%COMP%] { color: var(--mj-status-error); }\n.icon-amber[_ngcontent-%COMP%] { color: var(--mj-status-warning); }\n.icon-gray[_ngcontent-%COMP%] { color: var(--mj-text-disabled); }\n\n\n\n.run-info[_ngcontent-%COMP%] {\n flex: 2;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 1px;\n}\n\n.run-integration[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.run-company[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n}\n\n\n\n.run-meta[_ngcontent-%COMP%] {\n flex-shrink: 0;\n font-size: 12px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n min-width: 60px;\n text-align: right;\n}\n\n.run-duration[_ngcontent-%COMP%] {\n font-variant-numeric: tabular-nums;\n min-width: 56px;\n}\n\n.run-records[_ngcontent-%COMP%] {\n font-variant-numeric: tabular-nums;\n min-width: 48px;\n}\n\n.run-errors[_ngcontent-%COMP%] {\n min-width: 24px;\n text-align: center;\n}\n\n.run-errors.has-errors[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.run-user[_ngcontent-%COMP%] {\n min-width: 80px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.expand-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n cursor: pointer;\n width: 28px;\n height: 28px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-disabled);\n font-size: 11px;\n transition: background 0.15s, transform 0.2s;\n flex-shrink: 0;\n}\n\n.expand-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n\n.expand-btn[_ngcontent-%COMP%] i.rotated[_ngcontent-%COMP%] {\n transform: rotate(180deg);\n}\n\n\n\n\n.expanded-section[_ngcontent-%COMP%] {\n padding: 8px 14px 14px 48px;\n background: var(--mj-bg-page);\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.expanded-loading[_ngcontent-%COMP%], \n.expanded-empty[_ngcontent-%COMP%] {\n padding: 16px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 12px;\n}\n\n.expanded-empty[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 6px;\n}\n\n.entity-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 12px;\n}\n\n.entity-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left;\n padding: 6px 8px;\n color: var(--mj-text-disabled);\n font-weight: 600;\n font-size: 11px;\n border-bottom: 1px solid var(--mj-border-default);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.entity-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 5px 8px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.entity-table[_ngcontent-%COMP%] .num-col[_ngcontent-%COMP%], \n.detail-table[_ngcontent-%COMP%] .num-col[_ngcontent-%COMP%] {\n text-align: right;\n font-variant-numeric: tabular-nums;\n}\n\n.entity-table[_ngcontent-%COMP%] .created-col[_ngcontent-%COMP%], \n.detail-table[_ngcontent-%COMP%] .created-col[_ngcontent-%COMP%] {\n color: var(--mj-color-success-600);\n font-weight: 600;\n}\n\n.entity-table[_ngcontent-%COMP%] .updated-col[_ngcontent-%COMP%], \n.detail-table[_ngcontent-%COMP%] .updated-col[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.entity-table[_ngcontent-%COMP%] .error-col[_ngcontent-%COMP%], \n.detail-table[_ngcontent-%COMP%] .error-col[_ngcontent-%COMP%] {\n color: var(--mj-color-error-600);\n font-weight: 600;\n}\n\n.error-row[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n}\n\n\n\n\n.error-log-block[_ngcontent-%COMP%] {\n margin-top: 10px;\n}\n\n.error-log-label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-color-error-600);\n margin-bottom: 6px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.error-log-content[_ngcontent-%COMP%] {\n margin: 0;\n padding: 10px 12px;\n background: var(--mj-text-primary);\n color: #f1f5f9;\n font-family: 'SF Mono', 'Menlo', 'Consolas', monospace;\n font-size: 11px;\n border-radius: 8px;\n white-space: pre-wrap;\n word-break: break-word;\n max-height: 200px;\n overflow-y: auto;\n line-height: 1.5;\n}\n\n.detail-error-log[_ngcontent-%COMP%] {\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n\n\n\n.detail-panel[_ngcontent-%COMP%] {\n flex: 3;\n min-width: 340px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.detail-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 14px 16px;\n border-bottom: 1px solid var(--mj-border-subtle);\n gap: 12px;\n}\n\n.detail-header-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n}\n\n.detail-header-info[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 15px;\n font-weight: 700;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.detail-time[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n}\n\n.close-detail-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n cursor: pointer;\n color: var(--mj-text-disabled);\n font-size: 16px;\n width: 28px;\n height: 28px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.close-detail-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n\n\n\n.duration-bar-container[_ngcontent-%COMP%] {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.duration-bar-track[_ngcontent-%COMP%] {\n height: 6px;\n background: var(--mj-bg-surface-active);\n border-radius: 3px;\n overflow: hidden;\n}\n\n.duration-bar-fill[_ngcontent-%COMP%] {\n height: 100%;\n background: linear-gradient(90deg, var(--mj-brand-primary), var(--mj-color-accent-400));\n border-radius: 3px;\n transition: width 0.3s;\n}\n\n.duration-bar-labels[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-top: 4px;\n font-size: 10px;\n color: var(--mj-text-disabled);\n}\n\n.duration-bar-value[_ngcontent-%COMP%] {\n font-weight: 700;\n color: var(--mj-color-info-500);\n font-size: 12px;\n}\n\n\n\n.detail-tabs[_ngcontent-%COMP%] {\n display: flex;\n border-bottom: 1px solid var(--mj-border-subtle);\n padding: 0 16px;\n gap: 2px;\n}\n\n.tab-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n cursor: pointer;\n padding: 10px 12px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-disabled);\n display: flex;\n align-items: center;\n gap: 5px;\n transition: color 0.15s, border-color 0.15s;\n}\n\n.tab-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n}\n\n.tab-btn.active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n\n\n.detail-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n}\n\n.detail-loading[_ngcontent-%COMP%], \n.detail-empty[_ngcontent-%COMP%] {\n padding: 24px;\n text-align: center;\n color: var(--mj-text-disabled);\n}\n\n.detail-empty[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n margin-bottom: 8px;\n display: block;\n}\n\n.detail-empty[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n}\n\n.detail-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 12px;\n}\n\n.detail-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left;\n padding: 8px 10px;\n color: var(--mj-text-disabled);\n font-weight: 600;\n border-bottom: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-page);\n font-size: 11px;\n}\n\n.detail-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 7px 10px;\n border-bottom: 1px solid var(--mj-bg-page);\n}\n\n.mono-cell[_ngcontent-%COMP%] {\n font-variant-numeric: tabular-nums;\n color: var(--mj-text-muted);\n}\n\n.watermark-value[_ngcontent-%COMP%] {\n font-family: 'SF Mono', 'Menlo', 'Consolas', monospace;\n font-size: 11px;\n}\n\n\n\n.chip[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n padding: 3px 8px;\n border-radius: 10px;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n white-space: nowrap;\n}\n\n.chip-green[_ngcontent-%COMP%] { background: var(--mj-color-success-100); color: var(--mj-color-success-600); }\n.chip-red[_ngcontent-%COMP%] { background: var(--mj-color-error-100); color: var(--mj-color-error-600); }\n.chip-amber[_ngcontent-%COMP%] { background: var(--mj-color-warning-100); color: var(--mj-color-warning-600); }\n.chip-gray[_ngcontent-%COMP%] { background: var(--mj-bg-surface-hover); color: var(--mj-text-muted); }\n\n\n\n.type-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n background: var(--mj-status-info-bg);\n color: var(--mj-brand-primary);\n}\n\n\n\n\n@media (max-width: 900px) {\n .split-view[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .detail-panel[_ngcontent-%COMP%] {\n min-width: 0;\n max-height: 50vh;\n }\n\n .run-user[_ngcontent-%COMP%] {\n display: none;\n }\n}"] });
947
+ };
948
+ ActivityComponent = __decorate([
949
+ RegisterClass(BaseResourceComponent, 'IntegrationActivity')
950
+ ], ActivityComponent);
951
+ export { ActivityComponent };
952
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ActivityComponent, [{
953
+ type: Component,
954
+ args: [{ standalone: false, selector: 'app-integration-activity', template: "<div class=\"activity-container\">\n\n <!-- Filter Bar -->\n <div class=\"filter-bar\">\n <div class=\"filter-group filter-pills\">\n @for (status of StatusOptions; track status) {\n <button class=\"pill-btn\"\n [class.active]=\"StatusFilter === status\"\n (click)=\"SetStatusFilter(status)\">\n {{ status }}\n </button>\n }\n </div>\n\n <div class=\"filter-group\">\n <select class=\"filter-select\"\n [ngModel]=\"IntegrationFilter ?? ''\"\n (ngModelChange)=\"SetIntegrationFilter($event || null)\">\n <option value=\"\">All Integrations</option>\n @for (opt of Integrations; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n\n <div class=\"filter-group filter-pills\">\n @for (d of DateOptions; track d.Value) {\n <button class=\"pill-btn\"\n [class.active]=\"DateFilter === d.Value\"\n (click)=\"SetDateFilter(d.Value)\">\n {{ d.Label }}\n </button>\n }\n </div>\n\n <div class=\"filter-group\">\n <input type=\"text\"\n class=\"search-input\"\n placeholder=\"Search integrations...\"\n [(ngModel)]=\"SearchQuery\"\n (input)=\"OnSearchChange()\" />\n </div>\n\n <button class=\"refresh-btn\" (click)=\"Refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n </button>\n </div>\n\n <!-- Summary Strip -->\n @if (!IsLoading && AllRuns.length > 0) {\n <div class=\"summary-strip\">\n <div class=\"summary-badge\">\n <span class=\"badge-dot dot-blue\"></span>\n <span class=\"badge-count\">{{ TotalRuns }}</span>\n <span class=\"badge-label\">Total Runs</span>\n </div>\n <div class=\"summary-badge\">\n <span class=\"badge-dot dot-green\"></span>\n <span class=\"badge-count count-green\">{{ SuccessfulRuns }}</span>\n <span class=\"badge-label\">Successful</span>\n </div>\n <div class=\"summary-badge\">\n <span class=\"badge-dot dot-red\"></span>\n <span class=\"badge-count count-red\">{{ FailedRuns }}</span>\n <span class=\"badge-label\">Failed</span>\n </div>\n <div class=\"summary-badge\">\n <span class=\"badge-dot dot-blue\"></span>\n <span class=\"badge-count\">{{ TotalRecordsProcessed | number }}</span>\n <span class=\"badge-label\">Records Processed</span>\n </div>\n </div>\n }\n\n <!-- Loading state -->\n @if (IsLoading) {\n <div class=\"loading-area\">\n <mj-loading text=\"Loading activity...\" size=\"medium\"></mj-loading>\n </div>\n }\n\n <!-- Empty state -->\n @if (!IsLoading && FilteredRuns.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No runs found for the selected filters.</p>\n </div>\n }\n\n <!-- Split View: Run List + Detail Panel -->\n @if (!IsLoading && FilteredRuns.length > 0) {\n <div class=\"split-view\">\n\n <!-- Left panel: Run list -->\n <div class=\"run-list-panel\">\n @for (run of FilteredRuns; track run.ID) {\n <!-- Run row -->\n <div class=\"run-row\"\n [class.selected]=\"IsSelectedRun(run.ID)\"\n (click)=\"SelectRun(run.ID)\">\n <div class=\"run-row-main\">\n <!-- Status indicator -->\n <span [class]=\"GetStatusDotClass(run.Status)\"></span>\n <i [class]=\"GetStatusIcon(run.Status)\"\n [class.icon-green]=\"run.Status === 'Success'\"\n [class.icon-red]=\"run.Status === 'Failed'\"\n [class.icon-amber]=\"run.Status === 'In Progress'\"\n [class.icon-gray]=\"run.Status === 'Pending'\"\n class=\"status-icon\"></i>\n\n <!-- Integration info -->\n <div class=\"run-info\">\n <span class=\"run-integration\">{{ run.Integration }}</span>\n <span class=\"run-company\">{{ run.Company }}</span>\n </div>\n\n <!-- Started time -->\n <div class=\"run-meta\" [title]=\"FormatAbsoluteDate(run.StartedAt)\">\n {{ GetRelativeTime(run.StartedAt) }}\n </div>\n\n <!-- Duration -->\n <div class=\"run-meta run-duration\">\n {{ FormatDuration(run.StartedAt, run.EndedAt) }}\n </div>\n\n <!-- Records -->\n <div class=\"run-meta run-records\">\n {{ run.TotalRecords | number }}\n </div>\n\n <!-- Errors -->\n <div class=\"run-meta run-errors\" [class.has-errors]=\"run.ErrorLog\">\n @if (run.ErrorLog) {\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n }\n </div>\n\n <!-- Triggered by -->\n <div class=\"run-meta run-user\">\n {{ run.RunByUser || 'Scheduled' }}\n </div>\n\n <!-- Expand chevron -->\n <button class=\"expand-btn\"\n (click)=\"ToggleExpand(run.ID); $event.stopPropagation()\"\n title=\"Show entity breakdown\">\n <i class=\"fa-solid fa-chevron-down\"\n [class.rotated]=\"IsExpanded(run.ID)\"></i>\n </button>\n </div>\n\n <!-- Expanded section: entity breakdown -->\n @if (IsExpanded(run.ID)) {\n <div class=\"expanded-section\" (click)=\"$event.stopPropagation()\">\n @if (IsLoadingExpandedDetails()) {\n <div class=\"expanded-loading\">\n <mj-loading text=\"Loading breakdown...\" size=\"small\"></mj-loading>\n </div>\n } @else if (GetExpandedDetails().length === 0) {\n <div class=\"expanded-empty\">\n <i class=\"fa-solid fa-circle-info\"></i>\n No entity details for this run.\n </div>\n } @else {\n <table class=\"entity-table\">\n <thead>\n <tr>\n <th>Entity</th>\n <th class=\"num-col\">Processed</th>\n <th class=\"num-col\">Created</th>\n <th class=\"num-col\">Updated</th>\n <th class=\"num-col\">Deleted</th>\n <th class=\"num-col\">Errored</th>\n <th class=\"num-col\">Skipped</th>\n </tr>\n </thead>\n <tbody>\n @for (detail of GetExpandedDetails(); track detail.EntityID) {\n <tr [class.error-row]=\"detail.RecordsErrored > 0\">\n <td>{{ detail.Entity }}</td>\n <td class=\"num-col\">{{ detail.RecordsProcessed | number }}</td>\n <td class=\"num-col created-col\">{{ detail.RecordsCreated | number }}</td>\n <td class=\"num-col updated-col\">{{ detail.RecordsUpdated | number }}</td>\n <td class=\"num-col\">{{ detail.RecordsDeleted | number }}</td>\n <td class=\"num-col error-col\">{{ detail.RecordsErrored | number }}</td>\n <td class=\"num-col\">{{ detail.RecordsSkipped | number }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <!-- Error log in expanded view -->\n @if (run.ErrorLog) {\n <div class=\"error-log-block\">\n <div class=\"error-log-label\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i> Error Log\n </div>\n <pre class=\"error-log-content\">{{ run.ErrorLog }}</pre>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Right panel: Detail -->\n @if (SelectedRunID && GetSelectedRun()) {\n <div class=\"detail-panel\">\n <div class=\"detail-header\">\n <div class=\"detail-header-info\">\n <h3>{{ GetSelectedRun()!.Integration }}</h3>\n <span [class]=\"StatusChipClass(GetSelectedRun()!.Status)\">\n <i [class]=\"GetStatusIcon(GetSelectedRun()!.Status)\"></i>\n {{ GetSelectedRun()!.Status }}\n </span>\n <span class=\"detail-time\">{{ FormatDate(GetSelectedRun()!.StartedAt) }}</span>\n </div>\n <button class=\"close-detail-btn\" (click)=\"SelectRun(SelectedRunID!)\" title=\"Close\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <!-- Duration bar -->\n @if (GetSelectedRun()!.StartedAt && GetSelectedRun()!.EndedAt) {\n <div class=\"duration-bar-container\">\n <div class=\"duration-bar-track\">\n <div class=\"duration-bar-fill\"\n [style.width.%]=\"GetDurationBarWidth(GetSelectedRun()!)\"></div>\n </div>\n <div class=\"duration-bar-labels\">\n <span>{{ FormatDate(GetSelectedRun()!.StartedAt) }}</span>\n <span class=\"duration-bar-value\">{{ GetDurationBarLabel(GetSelectedRun()!) }}</span>\n <span>{{ FormatDate(GetSelectedRun()!.EndedAt) }}</span>\n </div>\n </div>\n }\n\n <!-- Tabs -->\n <div class=\"detail-tabs\">\n <button class=\"tab-btn\" [class.active]=\"ActiveDetailTab === 'entities'\"\n (click)=\"SetDetailTab('entities')\">\n <i class=\"fa-solid fa-table\"></i> Entity Breakdown\n </button>\n <button class=\"tab-btn\" [class.active]=\"ActiveDetailTab === 'watermarks'\"\n (click)=\"SetDetailTab('watermarks')\">\n <i class=\"fa-solid fa-droplet\"></i> Watermarks\n </button>\n </div>\n\n <div class=\"detail-content\">\n <!-- Entity breakdown tab -->\n @if (ActiveDetailTab === 'entities') {\n @if (IsLoadingDetail) {\n <div class=\"detail-loading\">\n <mj-loading text=\"Loading details...\" size=\"small\"></mj-loading>\n </div>\n } @else if (SelectedRunDetails.length === 0) {\n <div class=\"detail-empty\">\n <i class=\"fa-solid fa-circle-info\"></i>\n <p>No entity detail records for this run.</p>\n </div>\n } @else {\n <table class=\"detail-table\">\n <thead>\n <tr>\n <th>Entity</th>\n <th class=\"num-col\">Processed</th>\n <th class=\"num-col\">Created</th>\n <th class=\"num-col\">Updated</th>\n <th class=\"num-col\">Deleted</th>\n <th class=\"num-col\">Errors</th>\n <th class=\"num-col\">Skipped</th>\n </tr>\n </thead>\n <tbody>\n @for (detail of SelectedRunDetails; track detail.EntityID) {\n <tr [class.error-row]=\"detail.RecordsErrored > 0\">\n <td>{{ detail.Entity }}</td>\n <td class=\"num-col\">{{ detail.RecordsProcessed | number }}</td>\n <td class=\"num-col created-col\">{{ detail.RecordsCreated | number }}</td>\n <td class=\"num-col updated-col\">{{ detail.RecordsUpdated | number }}</td>\n <td class=\"num-col\">{{ detail.RecordsDeleted | number }}</td>\n <td class=\"num-col error-col\">{{ detail.RecordsErrored | number }}</td>\n <td class=\"num-col\">{{ detail.RecordsSkipped | number }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n\n <!-- Error log -->\n @if (GetSelectedRun()?.ErrorLog) {\n <div class=\"error-log-block detail-error-log\">\n <div class=\"error-log-label\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i> Error Log\n </div>\n <pre class=\"error-log-content\">{{ GetSelectedRun()!.ErrorLog }}</pre>\n </div>\n }\n }\n\n <!-- Watermarks tab -->\n @if (ActiveDetailTab === 'watermarks') {\n @if (IsLoadingWatermarks) {\n <div class=\"detail-loading\">\n <mj-loading text=\"Loading watermarks...\" size=\"small\"></mj-loading>\n </div>\n } @else if (WatermarkData.length === 0) {\n <div class=\"detail-empty\">\n <i class=\"fa-solid fa-droplet-slash\"></i>\n <p>No watermarks recorded for this integration.</p>\n </div>\n } @else {\n <table class=\"detail-table\">\n <thead>\n <tr>\n <th>Entity Map</th>\n <th>Type</th>\n <th>Current Value</th>\n <th>Last Applied</th>\n </tr>\n </thead>\n <tbody>\n @for (wm of WatermarkData; track wm.ID) {\n <tr>\n <td>{{ wm.EntityMap }}</td>\n <td><span class=\"type-badge\">{{ wm.WatermarkType }}</span></td>\n <td class=\"mono-cell watermark-value\">{{ FormatWatermark(wm.WatermarkValue) }}</td>\n <td>{{ FormatDate(wm.LastAppliedAt) }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n }\n </div>\n </div>\n }\n\n </div>\n }\n\n</div>\n", styles: [":host {\n display: block;\n height: 100%;\n}\n\n.activity-container {\n padding: 20px;\n height: 100%;\n display: flex;\n flex-direction: column;\n gap: 14px;\n overflow: auto;\n}\n\n/* \u2500\u2500 Filter Bar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.filter-bar {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.filter-group {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.filter-pills {\n gap: 0;\n}\n\n.pill-btn {\n height: 32px;\n padding: 0 14px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-muted);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.15s, color 0.15s, border-color 0.15s;\n white-space: nowrap;\n}\n\n.pill-btn:first-child {\n border-radius: 9999px 0 0 9999px;\n}\n\n.pill-btn:last-child {\n border-radius: 0 9999px 9999px 0;\n}\n\n.pill-btn:not(:first-child) {\n margin-left: -1px;\n}\n\n.pill-btn:hover {\n background: var(--mj-status-info-bg);\n border-color: var(--mj-border-strong);\n z-index: 1;\n}\n\n.pill-btn.active {\n background: var(--mj-brand-primary);\n color: var(--mj-bg-surface);\n border-color: var(--mj-brand-primary);\n z-index: 2;\n}\n\n.filter-select {\n padding: 6px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n min-width: 180px;\n height: 32px;\n}\n\n.filter-select:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n.search-input {\n padding: 6px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n min-width: 180px;\n height: 32px;\n}\n\n.search-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.search-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n.refresh-btn {\n width: 32px;\n height: 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n transition: background 0.15s, color 0.15s;\n}\n\n.refresh-btn:hover {\n background: var(--mj-status-info-bg);\n color: var(--mj-brand-primary);\n}\n\n/* \u2500\u2500 Summary Strip \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.summary-strip {\n display: inline-flex;\n gap: 16px;\n flex-wrap: wrap;\n}\n\n.summary-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.badge-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.dot-blue { background: var(--mj-color-info-500); }\n.dot-green { background: var(--mj-color-success-600); }\n.dot-red { background: var(--mj-status-error); }\n.dot-amber { background: var(--mj-status-warning); }\n.dot-gray { background: var(--mj-text-disabled); }\n\n.badge-count {\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.count-green { color: var(--mj-color-success-600); }\n.count-red { color: var(--mj-color-error-600); }\n\n.badge-label {\n color: var(--mj-text-disabled);\n font-size: 12px;\n}\n\n/* \u2500\u2500 Loading / Empty \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.loading-area {\n display: flex;\n justify-content: center;\n padding: 48px;\n}\n\n.empty-state {\n text-align: center;\n padding: 48px;\n color: var(--mj-text-disabled);\n}\n\n.empty-state i {\n font-size: 32px;\n margin-bottom: 12px;\n display: block;\n}\n\n.empty-state p {\n margin: 0;\n font-size: 14px;\n}\n\n/* \u2500\u2500 Split View \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.split-view {\n display: flex;\n gap: 16px;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n/* \u2500\u2500 Run List Panel (left 70%) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.run-list-panel {\n flex: 7;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n}\n\n.run-row {\n border-bottom: 1px solid var(--mj-border-subtle);\n cursor: pointer;\n transition: background 0.1s;\n}\n\n.run-row:hover {\n background: var(--mj-bg-page);\n}\n\n.run-row.selected {\n background: var(--mj-status-info-bg);\n}\n\n.run-row-main {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n}\n\n/* Status indicator */\n.status-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.status-icon {\n font-size: 14px;\n width: 16px;\n text-align: center;\n flex-shrink: 0;\n}\n\n.icon-green { color: var(--mj-color-success-600); }\n.icon-red { color: var(--mj-status-error); }\n.icon-amber { color: var(--mj-status-warning); }\n.icon-gray { color: var(--mj-text-disabled); }\n\n/* Run info */\n.run-info {\n flex: 2;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 1px;\n}\n\n.run-integration {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.run-company {\n font-size: 11px;\n color: var(--mj-text-disabled);\n}\n\n/* Meta columns */\n.run-meta {\n flex-shrink: 0;\n font-size: 12px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n min-width: 60px;\n text-align: right;\n}\n\n.run-duration {\n font-variant-numeric: tabular-nums;\n min-width: 56px;\n}\n\n.run-records {\n font-variant-numeric: tabular-nums;\n min-width: 48px;\n}\n\n.run-errors {\n min-width: 24px;\n text-align: center;\n}\n\n.run-errors.has-errors {\n color: var(--mj-status-error);\n}\n\n.run-user {\n min-width: 80px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.expand-btn {\n background: none;\n border: none;\n cursor: pointer;\n width: 28px;\n height: 28px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-disabled);\n font-size: 11px;\n transition: background 0.15s, transform 0.2s;\n flex-shrink: 0;\n}\n\n.expand-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n\n.expand-btn i.rotated {\n transform: rotate(180deg);\n}\n\n/* \u2500\u2500 Expanded Section \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.expanded-section {\n padding: 8px 14px 14px 48px;\n background: var(--mj-bg-page);\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.expanded-loading,\n.expanded-empty {\n padding: 16px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 12px;\n}\n\n.expanded-empty i {\n margin-right: 6px;\n}\n\n.entity-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 12px;\n}\n\n.entity-table th {\n text-align: left;\n padding: 6px 8px;\n color: var(--mj-text-disabled);\n font-weight: 600;\n font-size: 11px;\n border-bottom: 1px solid var(--mj-border-default);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.entity-table td {\n padding: 5px 8px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.entity-table .num-col,\n.detail-table .num-col {\n text-align: right;\n font-variant-numeric: tabular-nums;\n}\n\n.entity-table .created-col,\n.detail-table .created-col {\n color: var(--mj-color-success-600);\n font-weight: 600;\n}\n\n.entity-table .updated-col,\n.detail-table .updated-col {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.entity-table .error-col,\n.detail-table .error-col {\n color: var(--mj-color-error-600);\n font-weight: 600;\n}\n\n.error-row {\n background: var(--mj-status-error-bg);\n}\n\n/* \u2500\u2500 Error Log Block \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.error-log-block {\n margin-top: 10px;\n}\n\n.error-log-label {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-color-error-600);\n margin-bottom: 6px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.error-log-content {\n margin: 0;\n padding: 10px 12px;\n background: var(--mj-text-primary);\n color: #f1f5f9;\n font-family: 'SF Mono', 'Menlo', 'Consolas', monospace;\n font-size: 11px;\n border-radius: 8px;\n white-space: pre-wrap;\n word-break: break-word;\n max-height: 200px;\n overflow-y: auto;\n line-height: 1.5;\n}\n\n.detail-error-log {\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n/* \u2500\u2500 Detail Panel (right 30%) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.detail-panel {\n flex: 3;\n min-width: 340px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.detail-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 14px 16px;\n border-bottom: 1px solid var(--mj-border-subtle);\n gap: 12px;\n}\n\n.detail-header-info {\n display: flex;\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n}\n\n.detail-header-info h3 {\n margin: 0;\n font-size: 15px;\n font-weight: 700;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.detail-time {\n font-size: 12px;\n color: var(--mj-text-disabled);\n}\n\n.close-detail-btn {\n background: none;\n border: none;\n cursor: pointer;\n color: var(--mj-text-disabled);\n font-size: 16px;\n width: 28px;\n height: 28px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.close-detail-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n\n/* Duration bar */\n.duration-bar-container {\n padding: 12px 16px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.duration-bar-track {\n height: 6px;\n background: var(--mj-bg-surface-active);\n border-radius: 3px;\n overflow: hidden;\n}\n\n.duration-bar-fill {\n height: 100%;\n background: linear-gradient(90deg, var(--mj-brand-primary), var(--mj-color-accent-400));\n border-radius: 3px;\n transition: width 0.3s;\n}\n\n.duration-bar-labels {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-top: 4px;\n font-size: 10px;\n color: var(--mj-text-disabled);\n}\n\n.duration-bar-value {\n font-weight: 700;\n color: var(--mj-color-info-500);\n font-size: 12px;\n}\n\n/* Tabs */\n.detail-tabs {\n display: flex;\n border-bottom: 1px solid var(--mj-border-subtle);\n padding: 0 16px;\n gap: 2px;\n}\n\n.tab-btn {\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n cursor: pointer;\n padding: 10px 12px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-disabled);\n display: flex;\n align-items: center;\n gap: 5px;\n transition: color 0.15s, border-color 0.15s;\n}\n\n.tab-btn:hover {\n color: var(--mj-brand-primary);\n}\n\n.tab-btn.active {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n/* Detail content area */\n.detail-content {\n flex: 1;\n overflow-y: auto;\n}\n\n.detail-loading,\n.detail-empty {\n padding: 24px;\n text-align: center;\n color: var(--mj-text-disabled);\n}\n\n.detail-empty i {\n font-size: 24px;\n margin-bottom: 8px;\n display: block;\n}\n\n.detail-empty p {\n margin: 0;\n font-size: 13px;\n}\n\n.detail-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 12px;\n}\n\n.detail-table th {\n text-align: left;\n padding: 8px 10px;\n color: var(--mj-text-disabled);\n font-weight: 600;\n border-bottom: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-page);\n font-size: 11px;\n}\n\n.detail-table td {\n padding: 7px 10px;\n border-bottom: 1px solid var(--mj-bg-page);\n}\n\n.mono-cell {\n font-variant-numeric: tabular-nums;\n color: var(--mj-text-muted);\n}\n\n.watermark-value {\n font-family: 'SF Mono', 'Menlo', 'Consolas', monospace;\n font-size: 11px;\n}\n\n/* Status chips */\n.chip {\n font-size: 11px;\n font-weight: 600;\n padding: 3px 8px;\n border-radius: 10px;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n white-space: nowrap;\n}\n\n.chip-green { background: var(--mj-color-success-100); color: var(--mj-color-success-600); }\n.chip-red { background: var(--mj-color-error-100); color: var(--mj-color-error-600); }\n.chip-amber { background: var(--mj-color-warning-100); color: var(--mj-color-warning-600); }\n.chip-gray { background: var(--mj-bg-surface-hover); color: var(--mj-text-muted); }\n\n/* Watermark type badge */\n.type-badge {\n display: inline-flex;\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n background: var(--mj-status-info-bg);\n color: var(--mj-brand-primary);\n}\n\n/* \u2500\u2500 Responsive \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n@media (max-width: 900px) {\n .split-view {\n flex-direction: column;\n }\n\n .detail-panel {\n min-width: 0;\n max-height: 50vh;\n }\n\n .run-user {\n display: none;\n }\n}\n"] }]
955
+ }], null, null); })();
956
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ActivityComponent, { className: "ActivityComponent", filePath: "src/Integration/components/activity/activity.component.ts", lineNumber: 38 }); })();
957
+ export function LoadActivityComponent() {
958
+ // Tree-shaking prevention: importing this module causes
959
+ // @RegisterClass decorators to fire, registering components.
960
+ }
961
+ //# sourceMappingURL=activity.component.js.map