@memberjunction/ng-dashboards 5.7.0 → 5.8.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.
- package/dist/Integration/components/connection-studio/connection-studio.component.d.ts +81 -0
- package/dist/Integration/components/connection-studio/connection-studio.component.d.ts.map +1 -0
- package/dist/Integration/components/connection-studio/connection-studio.component.js +960 -0
- package/dist/Integration/components/connection-studio/connection-studio.component.js.map +1 -0
- package/dist/Integration/components/control-tower/control-tower.component.d.ts +43 -0
- package/dist/Integration/components/control-tower/control-tower.component.d.ts.map +1 -0
- package/dist/Integration/components/control-tower/control-tower.component.js +446 -0
- package/dist/Integration/components/control-tower/control-tower.component.js.map +1 -0
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts +43 -0
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -0
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +467 -0
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -0
- package/dist/Integration/components/sync-activity/sync-activity.component.d.ts +65 -0
- package/dist/Integration/components/sync-activity/sync-activity.component.d.ts.map +1 -0
- package/dist/Integration/components/sync-activity/sync-activity.component.js +671 -0
- package/dist/Integration/components/sync-activity/sync-activity.component.js.map +1 -0
- package/dist/Integration/components/widgets/integration-card.component.d.ts +22 -0
- package/dist/Integration/components/widgets/integration-card.component.d.ts.map +1 -0
- package/dist/Integration/components/widgets/integration-card.component.js +262 -0
- package/dist/Integration/components/widgets/integration-card.component.js.map +1 -0
- package/dist/Integration/components/widgets/run-history-panel.component.d.ts +29 -0
- package/dist/Integration/components/widgets/run-history-panel.component.d.ts.map +1 -0
- package/dist/Integration/components/widgets/run-history-panel.component.js +398 -0
- package/dist/Integration/components/widgets/run-history-panel.component.js.map +1 -0
- package/dist/Integration/index.d.ts +9 -0
- package/dist/Integration/index.d.ts.map +1 -0
- package/dist/Integration/index.js +16 -0
- package/dist/Integration/index.js.map +1 -0
- package/dist/Integration/integration.module.d.ts +22 -0
- package/dist/Integration/integration.module.d.ts.map +1 -0
- package/dist/Integration/integration.module.js +88 -0
- package/dist/Integration/integration.module.js.map +1 -0
- package/dist/Integration/services/integration-data.service.d.ts +154 -0
- package/dist/Integration/services/integration-data.service.d.ts.map +1 -0
- package/dist/Integration/services/integration-data.service.js +292 -0
- package/dist/Integration/services/integration-data.service.js.map +1 -0
- package/dist/__tests__/connection-studio.test.d.ts +2 -0
- package/dist/__tests__/connection-studio.test.d.ts.map +1 -0
- package/dist/__tests__/connection-studio.test.js +186 -0
- package/dist/__tests__/connection-studio.test.js.map +1 -0
- package/dist/__tests__/integration-data-service.test.d.ts +2 -0
- package/dist/__tests__/integration-data-service.test.d.ts.map +1 -0
- package/dist/__tests__/integration-data-service.test.js +131 -0
- package/dist/__tests__/integration-data-service.test.js.map +1 -0
- package/dist/module.d.ts +2 -1
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +17 -6
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +2 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -1
- package/dist/public-api.js.map +1 -1
- package/package.json +40 -39
|
@@ -0,0 +1,671 @@
|
|
|
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
|
+
function SyncActivityComponent_For_11_Template(rf, ctx) { if (rf & 1) {
|
|
18
|
+
i0.ɵɵelementStart(0, "option", 8);
|
|
19
|
+
i0.ɵɵtext(1);
|
|
20
|
+
i0.ɵɵelementEnd();
|
|
21
|
+
} if (rf & 2) {
|
|
22
|
+
const integration_r1 = ctx.$implicit;
|
|
23
|
+
i0.ɵɵproperty("value", integration_r1.ID);
|
|
24
|
+
i0.ɵɵadvance();
|
|
25
|
+
i0.ɵɵtextInterpolate(integration_r1.Name);
|
|
26
|
+
} }
|
|
27
|
+
function SyncActivityComponent_For_14_Template(rf, ctx) { if (rf & 1) {
|
|
28
|
+
i0.ɵɵelementStart(0, "option", 8);
|
|
29
|
+
i0.ɵɵtext(1);
|
|
30
|
+
i0.ɵɵelementEnd();
|
|
31
|
+
} if (rf & 2) {
|
|
32
|
+
const status_r2 = ctx.$implicit;
|
|
33
|
+
i0.ɵɵproperty("value", status_r2);
|
|
34
|
+
i0.ɵɵadvance();
|
|
35
|
+
i0.ɵɵtextInterpolate(status_r2);
|
|
36
|
+
} }
|
|
37
|
+
function SyncActivityComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
38
|
+
i0.ɵɵelementStart(0, "div", 11)(1, "div", 15)(2, "span", 16);
|
|
39
|
+
i0.ɵɵtext(3);
|
|
40
|
+
i0.ɵɵelementEnd();
|
|
41
|
+
i0.ɵɵelementStart(4, "span", 17);
|
|
42
|
+
i0.ɵɵtext(5, "Total Runs");
|
|
43
|
+
i0.ɵɵelementEnd()();
|
|
44
|
+
i0.ɵɵelementStart(6, "div", 18)(7, "span", 16);
|
|
45
|
+
i0.ɵɵtext(8);
|
|
46
|
+
i0.ɵɵelementEnd();
|
|
47
|
+
i0.ɵɵelementStart(9, "span", 17);
|
|
48
|
+
i0.ɵɵtext(10, "Successful");
|
|
49
|
+
i0.ɵɵelementEnd()();
|
|
50
|
+
i0.ɵɵelementStart(11, "div", 19)(12, "span", 16);
|
|
51
|
+
i0.ɵɵtext(13);
|
|
52
|
+
i0.ɵɵelementEnd();
|
|
53
|
+
i0.ɵɵelementStart(14, "span", 17);
|
|
54
|
+
i0.ɵɵtext(15, "Failed");
|
|
55
|
+
i0.ɵɵelementEnd()();
|
|
56
|
+
i0.ɵɵelementStart(16, "div", 15)(17, "span", 16);
|
|
57
|
+
i0.ɵɵtext(18);
|
|
58
|
+
i0.ɵɵpipe(19, "number");
|
|
59
|
+
i0.ɵɵelementEnd();
|
|
60
|
+
i0.ɵɵelementStart(20, "span", 17);
|
|
61
|
+
i0.ɵɵtext(21, "Records (filtered)");
|
|
62
|
+
i0.ɵɵelementEnd()()();
|
|
63
|
+
} if (rf & 2) {
|
|
64
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
65
|
+
i0.ɵɵadvance(3);
|
|
66
|
+
i0.ɵɵtextInterpolate(ctx_r2.TotalRuns);
|
|
67
|
+
i0.ɵɵadvance(5);
|
|
68
|
+
i0.ɵɵtextInterpolate(ctx_r2.SuccessfulRuns);
|
|
69
|
+
i0.ɵɵadvance(5);
|
|
70
|
+
i0.ɵɵtextInterpolate(ctx_r2.FailedRuns);
|
|
71
|
+
i0.ɵɵadvance(5);
|
|
72
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(19, 4, ctx_r2.TotalRecordsInView));
|
|
73
|
+
} }
|
|
74
|
+
function SyncActivityComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
75
|
+
i0.ɵɵelementStart(0, "div", 12);
|
|
76
|
+
i0.ɵɵelement(1, "mj-loading", 20);
|
|
77
|
+
i0.ɵɵelementEnd();
|
|
78
|
+
} }
|
|
79
|
+
function SyncActivityComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
80
|
+
i0.ɵɵelementStart(0, "div", 13);
|
|
81
|
+
i0.ɵɵelement(1, "i", 21);
|
|
82
|
+
i0.ɵɵelementStart(2, "p");
|
|
83
|
+
i0.ɵɵtext(3, "No runs found for the selected filters.");
|
|
84
|
+
i0.ɵɵelementEnd()();
|
|
85
|
+
} }
|
|
86
|
+
function SyncActivityComponent_Conditional_20_For_19_Template(rf, ctx) { if (rf & 1) {
|
|
87
|
+
const _r4 = i0.ɵɵgetCurrentView();
|
|
88
|
+
i0.ɵɵelementStart(0, "tr", 26);
|
|
89
|
+
i0.ɵɵlistener("click", function SyncActivityComponent_Conditional_20_For_19_Template_tr_click_0_listener() { const run_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OnRunClick(run_r5)); });
|
|
90
|
+
i0.ɵɵelementStart(1, "td", 27)(2, "span", 28);
|
|
91
|
+
i0.ɵɵtext(3);
|
|
92
|
+
i0.ɵɵelementEnd();
|
|
93
|
+
i0.ɵɵelementStart(4, "span", 29);
|
|
94
|
+
i0.ɵɵtext(5);
|
|
95
|
+
i0.ɵɵelementEnd()();
|
|
96
|
+
i0.ɵɵelementStart(6, "td", 30);
|
|
97
|
+
i0.ɵɵtext(7);
|
|
98
|
+
i0.ɵɵelementEnd();
|
|
99
|
+
i0.ɵɵelementStart(8, "td")(9, "span");
|
|
100
|
+
i0.ɵɵelement(10, "i");
|
|
101
|
+
i0.ɵɵtext(11);
|
|
102
|
+
i0.ɵɵelementEnd()();
|
|
103
|
+
i0.ɵɵelementStart(12, "td", 31);
|
|
104
|
+
i0.ɵɵtext(13);
|
|
105
|
+
i0.ɵɵelementEnd();
|
|
106
|
+
i0.ɵɵelementStart(14, "td", 31);
|
|
107
|
+
i0.ɵɵtext(15);
|
|
108
|
+
i0.ɵɵpipe(16, "number");
|
|
109
|
+
i0.ɵɵelementEnd();
|
|
110
|
+
i0.ɵɵelementStart(17, "td");
|
|
111
|
+
i0.ɵɵtext(18);
|
|
112
|
+
i0.ɵɵelementEnd()();
|
|
113
|
+
} if (rf & 2) {
|
|
114
|
+
const run_r5 = ctx.$implicit;
|
|
115
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
116
|
+
i0.ɵɵclassProp("selected", ctx_r2.IsSelectedRun(run_r5.ID));
|
|
117
|
+
i0.ɵɵadvance(3);
|
|
118
|
+
i0.ɵɵtextInterpolate(run_r5.Integration);
|
|
119
|
+
i0.ɵɵadvance(2);
|
|
120
|
+
i0.ɵɵtextInterpolate(run_r5.Company);
|
|
121
|
+
i0.ɵɵadvance(2);
|
|
122
|
+
i0.ɵɵtextInterpolate(ctx_r2.FormatDate(run_r5.StartedAt));
|
|
123
|
+
i0.ɵɵadvance(2);
|
|
124
|
+
i0.ɵɵclassMap(ctx_r2.StatusChipClass(run_r5.Status));
|
|
125
|
+
i0.ɵɵadvance();
|
|
126
|
+
i0.ɵɵclassMap(ctx_r2.StatusIcon(run_r5.Status));
|
|
127
|
+
i0.ɵɵadvance();
|
|
128
|
+
i0.ɵɵtextInterpolate1(" ", run_r5.Status, " ");
|
|
129
|
+
i0.ɵɵadvance(2);
|
|
130
|
+
i0.ɵɵtextInterpolate(ctx_r2.FormatDuration(run_r5));
|
|
131
|
+
i0.ɵɵadvance(2);
|
|
132
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(16, 13, run_r5.TotalRecords));
|
|
133
|
+
i0.ɵɵadvance(3);
|
|
134
|
+
i0.ɵɵtextInterpolate(run_r5.RunByUser);
|
|
135
|
+
} }
|
|
136
|
+
function SyncActivityComponent_Conditional_20_Conditional_20_Conditional_13_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
137
|
+
i0.ɵɵelementStart(0, "div", 39);
|
|
138
|
+
i0.ɵɵelement(1, "mj-loading", 43);
|
|
139
|
+
i0.ɵɵelementEnd();
|
|
140
|
+
} }
|
|
141
|
+
function SyncActivityComponent_Conditional_20_Conditional_20_Conditional_13_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
142
|
+
i0.ɵɵelementStart(0, "div", 40);
|
|
143
|
+
i0.ɵɵelement(1, "i", 44);
|
|
144
|
+
i0.ɵɵelementStart(2, "p");
|
|
145
|
+
i0.ɵɵtext(3, "No entity detail records for this run.");
|
|
146
|
+
i0.ɵɵelementEnd()();
|
|
147
|
+
} }
|
|
148
|
+
function SyncActivityComponent_Conditional_20_Conditional_20_Conditional_13_Conditional_2_For_19_Template(rf, ctx) { if (rf & 1) {
|
|
149
|
+
i0.ɵɵelementStart(0, "tr")(1, "td");
|
|
150
|
+
i0.ɵɵtext(2);
|
|
151
|
+
i0.ɵɵelementEnd();
|
|
152
|
+
i0.ɵɵelementStart(3, "td", 45);
|
|
153
|
+
i0.ɵɵtext(4);
|
|
154
|
+
i0.ɵɵpipe(5, "number");
|
|
155
|
+
i0.ɵɵelementEnd();
|
|
156
|
+
i0.ɵɵelementStart(6, "td", 47);
|
|
157
|
+
i0.ɵɵtext(7);
|
|
158
|
+
i0.ɵɵpipe(8, "number");
|
|
159
|
+
i0.ɵɵelementEnd();
|
|
160
|
+
i0.ɵɵelementStart(9, "td", 48);
|
|
161
|
+
i0.ɵɵtext(10);
|
|
162
|
+
i0.ɵɵpipe(11, "number");
|
|
163
|
+
i0.ɵɵelementEnd();
|
|
164
|
+
i0.ɵɵelementStart(12, "td", 45);
|
|
165
|
+
i0.ɵɵtext(13);
|
|
166
|
+
i0.ɵɵpipe(14, "number");
|
|
167
|
+
i0.ɵɵelementEnd();
|
|
168
|
+
i0.ɵɵelementStart(15, "td", 49);
|
|
169
|
+
i0.ɵɵtext(16);
|
|
170
|
+
i0.ɵɵpipe(17, "number");
|
|
171
|
+
i0.ɵɵelementEnd();
|
|
172
|
+
i0.ɵɵelementStart(18, "td", 45);
|
|
173
|
+
i0.ɵɵtext(19);
|
|
174
|
+
i0.ɵɵpipe(20, "number");
|
|
175
|
+
i0.ɵɵelementEnd()();
|
|
176
|
+
} if (rf & 2) {
|
|
177
|
+
const detail_r7 = ctx.$implicit;
|
|
178
|
+
i0.ɵɵclassProp("error-row", detail_r7.RecordsErrored > 0);
|
|
179
|
+
i0.ɵɵadvance(2);
|
|
180
|
+
i0.ɵɵtextInterpolate(detail_r7.Entity);
|
|
181
|
+
i0.ɵɵadvance(2);
|
|
182
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 9, detail_r7.RecordsProcessed));
|
|
183
|
+
i0.ɵɵadvance(3);
|
|
184
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(8, 11, detail_r7.RecordsCreated));
|
|
185
|
+
i0.ɵɵadvance(3);
|
|
186
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(11, 13, detail_r7.RecordsUpdated));
|
|
187
|
+
i0.ɵɵadvance(3);
|
|
188
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(14, 15, detail_r7.RecordsDeleted));
|
|
189
|
+
i0.ɵɵadvance(3);
|
|
190
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(17, 17, detail_r7.RecordsErrored));
|
|
191
|
+
i0.ɵɵadvance(3);
|
|
192
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(20, 19, detail_r7.RecordsSkipped));
|
|
193
|
+
} }
|
|
194
|
+
function SyncActivityComponent_Conditional_20_Conditional_20_Conditional_13_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
195
|
+
i0.ɵɵelementStart(0, "table", 41)(1, "thead")(2, "tr")(3, "th");
|
|
196
|
+
i0.ɵɵtext(4, "Entity");
|
|
197
|
+
i0.ɵɵelementEnd();
|
|
198
|
+
i0.ɵɵelementStart(5, "th", 45);
|
|
199
|
+
i0.ɵɵtext(6, "Processed");
|
|
200
|
+
i0.ɵɵelementEnd();
|
|
201
|
+
i0.ɵɵelementStart(7, "th", 45);
|
|
202
|
+
i0.ɵɵtext(8, "Created");
|
|
203
|
+
i0.ɵɵelementEnd();
|
|
204
|
+
i0.ɵɵelementStart(9, "th", 45);
|
|
205
|
+
i0.ɵɵtext(10, "Updated");
|
|
206
|
+
i0.ɵɵelementEnd();
|
|
207
|
+
i0.ɵɵelementStart(11, "th", 45);
|
|
208
|
+
i0.ɵɵtext(12, "Deleted");
|
|
209
|
+
i0.ɵɵelementEnd();
|
|
210
|
+
i0.ɵɵelementStart(13, "th", 45);
|
|
211
|
+
i0.ɵɵtext(14, "Errors");
|
|
212
|
+
i0.ɵɵelementEnd();
|
|
213
|
+
i0.ɵɵelementStart(15, "th", 45);
|
|
214
|
+
i0.ɵɵtext(16, "Skipped");
|
|
215
|
+
i0.ɵɵelementEnd()()();
|
|
216
|
+
i0.ɵɵelementStart(17, "tbody");
|
|
217
|
+
i0.ɵɵrepeaterCreate(18, SyncActivityComponent_Conditional_20_Conditional_20_Conditional_13_Conditional_2_For_19_Template, 21, 21, "tr", 46, _forTrack0);
|
|
218
|
+
i0.ɵɵelementEnd()();
|
|
219
|
+
} if (rf & 2) {
|
|
220
|
+
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
221
|
+
i0.ɵɵadvance(18);
|
|
222
|
+
i0.ɵɵrepeater(ctx_r2.RunDetails);
|
|
223
|
+
} }
|
|
224
|
+
function SyncActivityComponent_Conditional_20_Conditional_20_Conditional_13_Conditional_3_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
225
|
+
i0.ɵɵelementStart(0, "pre", 53);
|
|
226
|
+
i0.ɵɵtext(1);
|
|
227
|
+
i0.ɵɵelementEnd();
|
|
228
|
+
} if (rf & 2) {
|
|
229
|
+
let tmp_5_0;
|
|
230
|
+
const ctx_r2 = i0.ɵɵnextContext(5);
|
|
231
|
+
i0.ɵɵadvance();
|
|
232
|
+
i0.ɵɵtextInterpolate((tmp_5_0 = ctx_r2.GetSelectedRun()) == null ? null : tmp_5_0.ErrorLog);
|
|
233
|
+
} }
|
|
234
|
+
function SyncActivityComponent_Conditional_20_Conditional_20_Conditional_13_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
235
|
+
const _r8 = i0.ɵɵgetCurrentView();
|
|
236
|
+
i0.ɵɵelementStart(0, "div", 42)(1, "button", 50);
|
|
237
|
+
i0.ɵɵlistener("click", function SyncActivityComponent_Conditional_20_Conditional_20_Conditional_13_Conditional_3_Template_button_click_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.ToggleErrorLog($event)); });
|
|
238
|
+
i0.ɵɵelement(2, "i", 51);
|
|
239
|
+
i0.ɵɵtext(3, " Error Log ");
|
|
240
|
+
i0.ɵɵelement(4, "i", 52);
|
|
241
|
+
i0.ɵɵelementEnd();
|
|
242
|
+
i0.ɵɵconditionalCreate(5, SyncActivityComponent_Conditional_20_Conditional_20_Conditional_13_Conditional_3_Conditional_5_Template, 2, 1, "pre", 53);
|
|
243
|
+
i0.ɵɵelementEnd();
|
|
244
|
+
} if (rf & 2) {
|
|
245
|
+
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
246
|
+
i0.ɵɵadvance(4);
|
|
247
|
+
i0.ɵɵclassProp("flipped", ctx_r2.ShowErrorLog);
|
|
248
|
+
i0.ɵɵadvance();
|
|
249
|
+
i0.ɵɵconditional(ctx_r2.ShowErrorLog ? 5 : -1);
|
|
250
|
+
} }
|
|
251
|
+
function SyncActivityComponent_Conditional_20_Conditional_20_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
252
|
+
i0.ɵɵconditionalCreate(0, SyncActivityComponent_Conditional_20_Conditional_20_Conditional_13_Conditional_0_Template, 2, 0, "div", 39)(1, SyncActivityComponent_Conditional_20_Conditional_20_Conditional_13_Conditional_1_Template, 4, 0, "div", 40)(2, SyncActivityComponent_Conditional_20_Conditional_20_Conditional_13_Conditional_2_Template, 20, 0, "table", 41);
|
|
253
|
+
i0.ɵɵconditionalCreate(3, SyncActivityComponent_Conditional_20_Conditional_20_Conditional_13_Conditional_3_Template, 6, 3, "div", 42);
|
|
254
|
+
} if (rf & 2) {
|
|
255
|
+
let tmp_4_0;
|
|
256
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
257
|
+
i0.ɵɵconditional(ctx_r2.IsLoadingDetails ? 0 : ctx_r2.RunDetails.length === 0 ? 1 : 2);
|
|
258
|
+
i0.ɵɵadvance(3);
|
|
259
|
+
i0.ɵɵconditional(((tmp_4_0 = ctx_r2.GetSelectedRun()) == null ? null : tmp_4_0.ErrorLog) ? 3 : -1);
|
|
260
|
+
} }
|
|
261
|
+
function SyncActivityComponent_Conditional_20_Conditional_20_Conditional_14_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
262
|
+
i0.ɵɵelementStart(0, "div", 39);
|
|
263
|
+
i0.ɵɵelement(1, "mj-loading", 54);
|
|
264
|
+
i0.ɵɵelementEnd();
|
|
265
|
+
} }
|
|
266
|
+
function SyncActivityComponent_Conditional_20_Conditional_20_Conditional_14_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
267
|
+
i0.ɵɵelementStart(0, "div", 40);
|
|
268
|
+
i0.ɵɵelement(1, "i", 55);
|
|
269
|
+
i0.ɵɵelementStart(2, "p");
|
|
270
|
+
i0.ɵɵtext(3, "No watermarks recorded for this integration.");
|
|
271
|
+
i0.ɵɵelementEnd()();
|
|
272
|
+
} }
|
|
273
|
+
function SyncActivityComponent_Conditional_20_Conditional_20_Conditional_14_Conditional_2_For_13_Template(rf, ctx) { if (rf & 1) {
|
|
274
|
+
i0.ɵɵelementStart(0, "tr")(1, "td");
|
|
275
|
+
i0.ɵɵtext(2);
|
|
276
|
+
i0.ɵɵelementEnd();
|
|
277
|
+
i0.ɵɵelementStart(3, "td")(4, "span", 56);
|
|
278
|
+
i0.ɵɵtext(5);
|
|
279
|
+
i0.ɵɵelementEnd()();
|
|
280
|
+
i0.ɵɵelementStart(6, "td", 57);
|
|
281
|
+
i0.ɵɵtext(7);
|
|
282
|
+
i0.ɵɵelementEnd();
|
|
283
|
+
i0.ɵɵelementStart(8, "td");
|
|
284
|
+
i0.ɵɵtext(9);
|
|
285
|
+
i0.ɵɵelementEnd()();
|
|
286
|
+
} if (rf & 2) {
|
|
287
|
+
const wm_r9 = ctx.$implicit;
|
|
288
|
+
const ctx_r2 = i0.ɵɵnextContext(5);
|
|
289
|
+
i0.ɵɵadvance(2);
|
|
290
|
+
i0.ɵɵtextInterpolate(wm_r9.EntityMap);
|
|
291
|
+
i0.ɵɵadvance(3);
|
|
292
|
+
i0.ɵɵtextInterpolate(wm_r9.WatermarkType);
|
|
293
|
+
i0.ɵɵadvance(2);
|
|
294
|
+
i0.ɵɵtextInterpolate(ctx_r2.FormatWatermark(wm_r9.WatermarkValue));
|
|
295
|
+
i0.ɵɵadvance(2);
|
|
296
|
+
i0.ɵɵtextInterpolate(ctx_r2.FormatDate(wm_r9.LastAppliedAt));
|
|
297
|
+
} }
|
|
298
|
+
function SyncActivityComponent_Conditional_20_Conditional_20_Conditional_14_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
299
|
+
i0.ɵɵelementStart(0, "table", 41)(1, "thead")(2, "tr")(3, "th");
|
|
300
|
+
i0.ɵɵtext(4, "Entity Map");
|
|
301
|
+
i0.ɵɵelementEnd();
|
|
302
|
+
i0.ɵɵelementStart(5, "th");
|
|
303
|
+
i0.ɵɵtext(6, "Type");
|
|
304
|
+
i0.ɵɵelementEnd();
|
|
305
|
+
i0.ɵɵelementStart(7, "th");
|
|
306
|
+
i0.ɵɵtext(8, "Current Value");
|
|
307
|
+
i0.ɵɵelementEnd();
|
|
308
|
+
i0.ɵɵelementStart(9, "th");
|
|
309
|
+
i0.ɵɵtext(10, "Last Applied");
|
|
310
|
+
i0.ɵɵelementEnd()()();
|
|
311
|
+
i0.ɵɵelementStart(11, "tbody");
|
|
312
|
+
i0.ɵɵrepeaterCreate(12, SyncActivityComponent_Conditional_20_Conditional_20_Conditional_14_Conditional_2_For_13_Template, 10, 4, "tr", null, _forTrack0);
|
|
313
|
+
i0.ɵɵelementEnd()();
|
|
314
|
+
} if (rf & 2) {
|
|
315
|
+
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
316
|
+
i0.ɵɵadvance(12);
|
|
317
|
+
i0.ɵɵrepeater(ctx_r2.Watermarks);
|
|
318
|
+
} }
|
|
319
|
+
function SyncActivityComponent_Conditional_20_Conditional_20_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
320
|
+
i0.ɵɵconditionalCreate(0, SyncActivityComponent_Conditional_20_Conditional_20_Conditional_14_Conditional_0_Template, 2, 0, "div", 39)(1, SyncActivityComponent_Conditional_20_Conditional_20_Conditional_14_Conditional_1_Template, 4, 0, "div", 40)(2, SyncActivityComponent_Conditional_20_Conditional_20_Conditional_14_Conditional_2_Template, 14, 0, "table", 41);
|
|
321
|
+
} if (rf & 2) {
|
|
322
|
+
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
323
|
+
i0.ɵɵconditional(ctx_r2.IsLoadingWatermarks ? 0 : ctx_r2.Watermarks.length === 0 ? 1 : 2);
|
|
324
|
+
} }
|
|
325
|
+
function SyncActivityComponent_Conditional_20_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
326
|
+
const _r6 = i0.ɵɵgetCurrentView();
|
|
327
|
+
i0.ɵɵelementStart(0, "div", 25)(1, "div", 32)(2, "h3");
|
|
328
|
+
i0.ɵɵtext(3, "Run Details");
|
|
329
|
+
i0.ɵɵelementEnd();
|
|
330
|
+
i0.ɵɵelementStart(4, "button", 33);
|
|
331
|
+
i0.ɵɵlistener("click", function SyncActivityComponent_Conditional_20_Conditional_20_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OnRunClick(ctx_r2.GetSelectedRun())); });
|
|
332
|
+
i0.ɵɵelement(5, "i", 34);
|
|
333
|
+
i0.ɵɵelementEnd()();
|
|
334
|
+
i0.ɵɵelementStart(6, "div", 35)(7, "button", 36);
|
|
335
|
+
i0.ɵɵlistener("click", function SyncActivityComponent_Conditional_20_Conditional_20_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.SetDetailsTab("entities")); });
|
|
336
|
+
i0.ɵɵelement(8, "i", 37);
|
|
337
|
+
i0.ɵɵtext(9, " Entity Breakdown ");
|
|
338
|
+
i0.ɵɵelementEnd();
|
|
339
|
+
i0.ɵɵelementStart(10, "button", 36);
|
|
340
|
+
i0.ɵɵlistener("click", function SyncActivityComponent_Conditional_20_Conditional_20_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.SetDetailsTab("watermarks")); });
|
|
341
|
+
i0.ɵɵelement(11, "i", 38);
|
|
342
|
+
i0.ɵɵtext(12, " Watermarks ");
|
|
343
|
+
i0.ɵɵelementEnd()();
|
|
344
|
+
i0.ɵɵconditionalCreate(13, SyncActivityComponent_Conditional_20_Conditional_20_Conditional_13_Template, 4, 2);
|
|
345
|
+
i0.ɵɵconditionalCreate(14, SyncActivityComponent_Conditional_20_Conditional_20_Conditional_14_Template, 3, 1);
|
|
346
|
+
i0.ɵɵelementEnd();
|
|
347
|
+
} if (rf & 2) {
|
|
348
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
349
|
+
i0.ɵɵadvance(7);
|
|
350
|
+
i0.ɵɵclassProp("active", ctx_r2.ActiveDetailsTab === "entities");
|
|
351
|
+
i0.ɵɵadvance(3);
|
|
352
|
+
i0.ɵɵclassProp("active", ctx_r2.ActiveDetailsTab === "watermarks");
|
|
353
|
+
i0.ɵɵadvance(3);
|
|
354
|
+
i0.ɵɵconditional(ctx_r2.ActiveDetailsTab === "entities" ? 13 : -1);
|
|
355
|
+
i0.ɵɵadvance();
|
|
356
|
+
i0.ɵɵconditional(ctx_r2.ActiveDetailsTab === "watermarks" ? 14 : -1);
|
|
357
|
+
} }
|
|
358
|
+
function SyncActivityComponent_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
359
|
+
i0.ɵɵelementStart(0, "div", 14)(1, "div", 22)(2, "table", 23)(3, "thead")(4, "tr")(5, "th");
|
|
360
|
+
i0.ɵɵtext(6, "Integration");
|
|
361
|
+
i0.ɵɵelementEnd();
|
|
362
|
+
i0.ɵɵelementStart(7, "th");
|
|
363
|
+
i0.ɵɵtext(8, "Started");
|
|
364
|
+
i0.ɵɵelementEnd();
|
|
365
|
+
i0.ɵɵelementStart(9, "th");
|
|
366
|
+
i0.ɵɵtext(10, "Status");
|
|
367
|
+
i0.ɵɵelementEnd();
|
|
368
|
+
i0.ɵɵelementStart(11, "th");
|
|
369
|
+
i0.ɵɵtext(12, "Duration");
|
|
370
|
+
i0.ɵɵelementEnd();
|
|
371
|
+
i0.ɵɵelementStart(13, "th");
|
|
372
|
+
i0.ɵɵtext(14, "Records");
|
|
373
|
+
i0.ɵɵelementEnd();
|
|
374
|
+
i0.ɵɵelementStart(15, "th");
|
|
375
|
+
i0.ɵɵtext(16, "Run By");
|
|
376
|
+
i0.ɵɵelementEnd()()();
|
|
377
|
+
i0.ɵɵelementStart(17, "tbody");
|
|
378
|
+
i0.ɵɵrepeaterCreate(18, SyncActivityComponent_Conditional_20_For_19_Template, 19, 15, "tr", 24, _forTrack0);
|
|
379
|
+
i0.ɵɵelementEnd()()();
|
|
380
|
+
i0.ɵɵconditionalCreate(20, SyncActivityComponent_Conditional_20_Conditional_20_Template, 15, 6, "div", 25);
|
|
381
|
+
i0.ɵɵelementEnd();
|
|
382
|
+
} if (rf & 2) {
|
|
383
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
384
|
+
i0.ɵɵadvance(18);
|
|
385
|
+
i0.ɵɵrepeater(ctx_r2.FilteredRuns);
|
|
386
|
+
i0.ɵɵadvance(2);
|
|
387
|
+
i0.ɵɵconditional(ctx_r2.SelectedRunID ? 20 : -1);
|
|
388
|
+
} }
|
|
389
|
+
let SyncActivityComponent = class SyncActivityComponent extends BaseResourceComponent {
|
|
390
|
+
Integrations = [];
|
|
391
|
+
Runs = [];
|
|
392
|
+
FilteredRuns = [];
|
|
393
|
+
RunDetails = [];
|
|
394
|
+
Watermarks = [];
|
|
395
|
+
SelectedIntegrationID = '';
|
|
396
|
+
SelectedStatusFilter = 'All';
|
|
397
|
+
SelectedRunID = null;
|
|
398
|
+
ActiveDetailsTab = 'entities';
|
|
399
|
+
IsLoadingIntegrations = false;
|
|
400
|
+
IsLoadingRuns = false;
|
|
401
|
+
IsLoadingDetails = false;
|
|
402
|
+
IsLoadingWatermarks = false;
|
|
403
|
+
ShowErrorLog = false;
|
|
404
|
+
StatusOptions = ['All', 'Success', 'Failed', 'In Progress', 'Pending'];
|
|
405
|
+
dataService = inject(IntegrationDataService);
|
|
406
|
+
cdr = inject(ChangeDetectorRef);
|
|
407
|
+
async ngOnInit() {
|
|
408
|
+
await this.loadIntegrations();
|
|
409
|
+
}
|
|
410
|
+
async loadIntegrations() {
|
|
411
|
+
this.IsLoadingIntegrations = true;
|
|
412
|
+
this.cdr.detectChanges();
|
|
413
|
+
try {
|
|
414
|
+
const summaries = await this.dataService.LoadIntegrationSummaries(this.RunViewToUse);
|
|
415
|
+
this.Integrations = summaries.map(s => s.Integration);
|
|
416
|
+
}
|
|
417
|
+
catch (err) {
|
|
418
|
+
console.error('[SyncActivity] Failed to load integrations:', err);
|
|
419
|
+
}
|
|
420
|
+
finally {
|
|
421
|
+
this.IsLoadingIntegrations = false;
|
|
422
|
+
this.cdr.detectChanges();
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
async OnIntegrationChange() {
|
|
426
|
+
this.SelectedRunID = null;
|
|
427
|
+
this.RunDetails = [];
|
|
428
|
+
this.Watermarks = [];
|
|
429
|
+
this.ShowErrorLog = false;
|
|
430
|
+
await this.LoadRuns();
|
|
431
|
+
}
|
|
432
|
+
async LoadRuns() {
|
|
433
|
+
this.IsLoadingRuns = true;
|
|
434
|
+
this.SelectedRunID = null;
|
|
435
|
+
this.RunDetails = [];
|
|
436
|
+
this.ShowErrorLog = false;
|
|
437
|
+
this.cdr.detectChanges();
|
|
438
|
+
try {
|
|
439
|
+
if (this.SelectedIntegrationID) {
|
|
440
|
+
this.Runs = await this.dataService.LoadRunHistory(this.SelectedIntegrationID, 100, this.RunViewToUse);
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
this.Runs = await this.loadAllRuns();
|
|
444
|
+
}
|
|
445
|
+
this.applyStatusFilter();
|
|
446
|
+
}
|
|
447
|
+
catch (err) {
|
|
448
|
+
console.error('[SyncActivity] Failed to load runs:', err);
|
|
449
|
+
}
|
|
450
|
+
finally {
|
|
451
|
+
this.IsLoadingRuns = false;
|
|
452
|
+
this.cdr.detectChanges();
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
async loadAllRuns() {
|
|
456
|
+
const rv = new RunView(this.RunViewToUse ?? null);
|
|
457
|
+
const result = await rv.RunView({
|
|
458
|
+
EntityName: 'MJ: Company Integration Runs',
|
|
459
|
+
ExtraFilter: '',
|
|
460
|
+
OrderBy: 'StartedAt DESC',
|
|
461
|
+
MaxRows: 200,
|
|
462
|
+
Fields: ['ID', 'CompanyIntegrationID', 'StartedAt', 'EndedAt', 'TotalRecords',
|
|
463
|
+
'Status', 'ErrorLog', 'Integration', 'Company', 'RunByUser'],
|
|
464
|
+
ResultType: 'simple'
|
|
465
|
+
});
|
|
466
|
+
return result.Results;
|
|
467
|
+
}
|
|
468
|
+
OnStatusFilterChange() {
|
|
469
|
+
this.applyStatusFilter();
|
|
470
|
+
}
|
|
471
|
+
applyStatusFilter() {
|
|
472
|
+
if (this.SelectedStatusFilter === 'All') {
|
|
473
|
+
this.FilteredRuns = this.Runs;
|
|
474
|
+
}
|
|
475
|
+
else {
|
|
476
|
+
this.FilteredRuns = this.Runs.filter(r => r.Status === this.SelectedStatusFilter);
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
async OnRunClick(run) {
|
|
480
|
+
if (UUIDsEqual(this.SelectedRunID, run.ID)) {
|
|
481
|
+
this.SelectedRunID = null;
|
|
482
|
+
this.RunDetails = [];
|
|
483
|
+
this.Watermarks = [];
|
|
484
|
+
this.ShowErrorLog = false;
|
|
485
|
+
return;
|
|
486
|
+
}
|
|
487
|
+
this.SelectedRunID = run.ID;
|
|
488
|
+
this.RunDetails = [];
|
|
489
|
+
this.Watermarks = [];
|
|
490
|
+
this.ShowErrorLog = false;
|
|
491
|
+
this.ActiveDetailsTab = 'entities';
|
|
492
|
+
await Promise.all([
|
|
493
|
+
this.loadRunDetails(run.ID),
|
|
494
|
+
this.loadWatermarks(run.CompanyIntegrationID),
|
|
495
|
+
]);
|
|
496
|
+
}
|
|
497
|
+
async loadRunDetails(runID) {
|
|
498
|
+
this.IsLoadingDetails = true;
|
|
499
|
+
this.cdr.detectChanges();
|
|
500
|
+
try {
|
|
501
|
+
this.RunDetails = await this.dataService.LoadRunDetails(runID, this.RunViewToUse);
|
|
502
|
+
}
|
|
503
|
+
catch (err) {
|
|
504
|
+
console.error('[SyncActivity] Failed to load run details:', err);
|
|
505
|
+
}
|
|
506
|
+
finally {
|
|
507
|
+
this.IsLoadingDetails = false;
|
|
508
|
+
this.cdr.detectChanges();
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
async loadWatermarks(companyIntegrationID) {
|
|
512
|
+
this.IsLoadingWatermarks = true;
|
|
513
|
+
this.cdr.detectChanges();
|
|
514
|
+
try {
|
|
515
|
+
this.Watermarks = await this.loadWatermarkData(companyIntegrationID);
|
|
516
|
+
}
|
|
517
|
+
catch (err) {
|
|
518
|
+
console.error('[SyncActivity] Failed to load watermarks:', err);
|
|
519
|
+
}
|
|
520
|
+
finally {
|
|
521
|
+
this.IsLoadingWatermarks = false;
|
|
522
|
+
this.cdr.detectChanges();
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
async loadWatermarkData(companyIntegrationID) {
|
|
526
|
+
const entityMaps = await this.dataService.LoadEntityMaps(companyIntegrationID, this.RunViewToUse);
|
|
527
|
+
if (entityMaps.length === 0)
|
|
528
|
+
return [];
|
|
529
|
+
const entityMapIDs = entityMaps.map(m => `'${m.ID}'`).join(',');
|
|
530
|
+
const rv = new RunView(this.RunViewToUse ?? null);
|
|
531
|
+
const result = await rv.RunView({
|
|
532
|
+
EntityName: 'MJ: Company Integration Sync Watermarks',
|
|
533
|
+
ExtraFilter: `EntityMapID IN (${entityMapIDs})`,
|
|
534
|
+
OrderBy: 'LastAppliedAt DESC',
|
|
535
|
+
Fields: ['ID', 'EntityMapID', 'WatermarkType', 'WatermarkValue', 'LastAppliedAt'],
|
|
536
|
+
ResultType: 'simple'
|
|
537
|
+
});
|
|
538
|
+
return this.mergeWatermarksWithEntityMaps(result.Results, entityMaps);
|
|
539
|
+
}
|
|
540
|
+
mergeWatermarksWithEntityMaps(watermarks, entityMaps) {
|
|
541
|
+
const mapLookup = new Map(entityMaps.map(m => [m.ID.toLowerCase(), m]));
|
|
542
|
+
return watermarks.map(w => ({
|
|
543
|
+
...w,
|
|
544
|
+
EntityMap: mapLookup.get(w.EntityMapID?.toLowerCase())?.ExternalObjectName ?? w.EntityMapID
|
|
545
|
+
}));
|
|
546
|
+
}
|
|
547
|
+
SetDetailsTab(tab) {
|
|
548
|
+
this.ActiveDetailsTab = tab;
|
|
549
|
+
}
|
|
550
|
+
ToggleErrorLog(event) {
|
|
551
|
+
event.stopPropagation();
|
|
552
|
+
this.ShowErrorLog = !this.ShowErrorLog;
|
|
553
|
+
}
|
|
554
|
+
IsSelectedRun(id) {
|
|
555
|
+
return UUIDsEqual(this.SelectedRunID, id);
|
|
556
|
+
}
|
|
557
|
+
GetSelectedRun() {
|
|
558
|
+
return this.FilteredRuns.find(r => UUIDsEqual(r.ID, this.SelectedRunID)) ?? null;
|
|
559
|
+
}
|
|
560
|
+
StatusChipClass(status) {
|
|
561
|
+
if (status === 'Success')
|
|
562
|
+
return 'chip chip-green';
|
|
563
|
+
if (status === 'Failed')
|
|
564
|
+
return 'chip chip-red';
|
|
565
|
+
if (status === 'In Progress')
|
|
566
|
+
return 'chip chip-amber';
|
|
567
|
+
return 'chip chip-gray';
|
|
568
|
+
}
|
|
569
|
+
StatusIcon(status) {
|
|
570
|
+
if (status === 'Success')
|
|
571
|
+
return 'fa-solid fa-circle-check';
|
|
572
|
+
if (status === 'Failed')
|
|
573
|
+
return 'fa-solid fa-circle-xmark';
|
|
574
|
+
if (status === 'In Progress')
|
|
575
|
+
return 'fa-solid fa-spinner fa-spin';
|
|
576
|
+
return 'fa-solid fa-clock';
|
|
577
|
+
}
|
|
578
|
+
FormatDate(dateStr) {
|
|
579
|
+
if (!dateStr)
|
|
580
|
+
return '--';
|
|
581
|
+
return new Date(dateStr).toLocaleString(undefined, {
|
|
582
|
+
month: 'short', day: 'numeric',
|
|
583
|
+
hour: '2-digit', minute: '2-digit'
|
|
584
|
+
});
|
|
585
|
+
}
|
|
586
|
+
FormatDuration(run) {
|
|
587
|
+
if (!run.StartedAt || !run.EndedAt)
|
|
588
|
+
return '--';
|
|
589
|
+
const ms = new Date(run.EndedAt).getTime() - new Date(run.StartedAt).getTime();
|
|
590
|
+
return this.dataService.FormatDuration(ms);
|
|
591
|
+
}
|
|
592
|
+
FormatWatermark(value) {
|
|
593
|
+
if (!value)
|
|
594
|
+
return 'Not set';
|
|
595
|
+
if (value.length > 40)
|
|
596
|
+
return value.substring(0, 37) + '...';
|
|
597
|
+
return value;
|
|
598
|
+
}
|
|
599
|
+
get TotalRuns() { return this.Runs.length; }
|
|
600
|
+
get SuccessfulRuns() { return this.Runs.filter(r => r.Status === 'Success').length; }
|
|
601
|
+
get FailedRuns() { return this.Runs.filter(r => r.Status === 'Failed').length; }
|
|
602
|
+
get TotalRecordsInView() {
|
|
603
|
+
return this.FilteredRuns.reduce((acc, r) => acc + r.TotalRecords, 0);
|
|
604
|
+
}
|
|
605
|
+
async GetResourceDisplayName(_data) {
|
|
606
|
+
return 'Sync Activity';
|
|
607
|
+
}
|
|
608
|
+
async GetResourceIconClass(_data) {
|
|
609
|
+
return 'fa-solid fa-clock-rotate-left';
|
|
610
|
+
}
|
|
611
|
+
static ɵfac = /*@__PURE__*/ (() => { let ɵSyncActivityComponent_BaseFactory; return function SyncActivityComponent_Factory(__ngFactoryType__) { return (ɵSyncActivityComponent_BaseFactory || (ɵSyncActivityComponent_BaseFactory = i0.ɵɵgetInheritedFactory(SyncActivityComponent)))(__ngFactoryType__ || SyncActivityComponent); }; })();
|
|
612
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SyncActivityComponent, selectors: [["app-sync-activity"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 21, vars: 6, consts: [[1, "sync-activity"], [1, "activity-header"], [1, "header-left"], [1, "section-title"], [1, "fa-solid", "fa-clock-rotate-left"], [1, "header-filters"], [1, "filter-select", 3, "ngModelChange", "change", "ngModel"], ["value", ""], [3, "value"], ["title", "Refresh", 1, "refresh-btn", 3, "click"], [1, "fa-solid", "fa-rotate"], [1, "activity-kpis"], [1, "loading-area"], [1, "empty-state"], [1, "activity-body"], [1, "kpi-item"], [1, "kpi-value"], [1, "kpi-label"], [1, "kpi-item", "kpi-success"], [1, "kpi-item", "kpi-failed"], ["text", "Loading run history...", "size", "medium"], [1, "fa-solid", "fa-inbox"], [1, "run-list-panel"], [1, "run-table"], [1, "run-row", 3, "selected"], [1, "detail-panel"], [1, "run-row", 3, "click"], [1, "integration-cell"], [1, "integration-name"], [1, "company-name"], [1, "date-cell"], [1, "mono-cell"], [1, "detail-header"], ["title", "Close details", 1, "close-detail-btn", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "detail-tabs"], [1, "tab-btn", 3, "click"], [1, "fa-solid", "fa-table"], [1, "fa-solid", "fa-droplet"], [1, "detail-loading"], [1, "detail-empty"], [1, "detail-table"], [1, "error-log-section"], ["text", "Loading entity 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-toggle-btn", 3, "click"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "fa-solid", "fa-chevron-down", "toggle-chevron"], [1, "error-log-content"], ["text", "Loading watermarks...", "size", "small"], [1, "fa-solid", "fa-droplet-slash"], [1, "type-badge"], [1, "watermark-value", "mono-cell"]], template: function SyncActivityComponent_Template(rf, ctx) { if (rf & 1) {
|
|
613
|
+
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "h2", 3);
|
|
614
|
+
i0.ɵɵelement(4, "i", 4);
|
|
615
|
+
i0.ɵɵtext(5, " Sync Activity ");
|
|
616
|
+
i0.ɵɵelementEnd()();
|
|
617
|
+
i0.ɵɵelementStart(6, "div", 5)(7, "select", 6);
|
|
618
|
+
i0.ɵɵtwoWayListener("ngModelChange", function SyncActivityComponent_Template_select_ngModelChange_7_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.SelectedIntegrationID, $event) || (ctx.SelectedIntegrationID = $event); return $event; });
|
|
619
|
+
i0.ɵɵlistener("change", function SyncActivityComponent_Template_select_change_7_listener() { return ctx.OnIntegrationChange(); });
|
|
620
|
+
i0.ɵɵelementStart(8, "option", 7);
|
|
621
|
+
i0.ɵɵtext(9, "All Integrations");
|
|
622
|
+
i0.ɵɵelementEnd();
|
|
623
|
+
i0.ɵɵrepeaterCreate(10, SyncActivityComponent_For_11_Template, 2, 2, "option", 8, _forTrack0);
|
|
624
|
+
i0.ɵɵelementEnd();
|
|
625
|
+
i0.ɵɵelementStart(12, "select", 6);
|
|
626
|
+
i0.ɵɵtwoWayListener("ngModelChange", function SyncActivityComponent_Template_select_ngModelChange_12_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.SelectedStatusFilter, $event) || (ctx.SelectedStatusFilter = $event); return $event; });
|
|
627
|
+
i0.ɵɵlistener("change", function SyncActivityComponent_Template_select_change_12_listener() { return ctx.OnStatusFilterChange(); });
|
|
628
|
+
i0.ɵɵrepeaterCreate(13, SyncActivityComponent_For_14_Template, 2, 2, "option", 8, i0.ɵɵrepeaterTrackByIdentity);
|
|
629
|
+
i0.ɵɵelementEnd();
|
|
630
|
+
i0.ɵɵelementStart(15, "button", 9);
|
|
631
|
+
i0.ɵɵlistener("click", function SyncActivityComponent_Template_button_click_15_listener() { return ctx.LoadRuns(); });
|
|
632
|
+
i0.ɵɵelement(16, "i", 10);
|
|
633
|
+
i0.ɵɵelementEnd()()();
|
|
634
|
+
i0.ɵɵconditionalCreate(17, SyncActivityComponent_Conditional_17_Template, 22, 6, "div", 11);
|
|
635
|
+
i0.ɵɵconditionalCreate(18, SyncActivityComponent_Conditional_18_Template, 2, 0, "div", 12);
|
|
636
|
+
i0.ɵɵconditionalCreate(19, SyncActivityComponent_Conditional_19_Template, 4, 0, "div", 13);
|
|
637
|
+
i0.ɵɵconditionalCreate(20, SyncActivityComponent_Conditional_20_Template, 21, 1, "div", 14);
|
|
638
|
+
i0.ɵɵelementEnd();
|
|
639
|
+
} if (rf & 2) {
|
|
640
|
+
i0.ɵɵadvance(7);
|
|
641
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx.SelectedIntegrationID);
|
|
642
|
+
i0.ɵɵadvance(3);
|
|
643
|
+
i0.ɵɵrepeater(ctx.Integrations);
|
|
644
|
+
i0.ɵɵadvance(2);
|
|
645
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx.SelectedStatusFilter);
|
|
646
|
+
i0.ɵɵadvance();
|
|
647
|
+
i0.ɵɵrepeater(ctx.StatusOptions);
|
|
648
|
+
i0.ɵɵadvance(4);
|
|
649
|
+
i0.ɵɵconditional(!ctx.IsLoadingRuns && ctx.Runs.length > 0 ? 17 : -1);
|
|
650
|
+
i0.ɵɵadvance();
|
|
651
|
+
i0.ɵɵconditional(ctx.IsLoadingRuns ? 18 : -1);
|
|
652
|
+
i0.ɵɵadvance();
|
|
653
|
+
i0.ɵɵconditional(!ctx.IsLoadingRuns && ctx.FilteredRuns.length === 0 ? 19 : -1);
|
|
654
|
+
i0.ɵɵadvance();
|
|
655
|
+
i0.ɵɵconditional(!ctx.IsLoadingRuns && ctx.FilteredRuns.length > 0 ? 20 : -1);
|
|
656
|
+
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.LoadingComponent, i3.DecimalPipe], styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n}\n\n.sync-activity[_ngcontent-%COMP%] {\n padding: 20px;\n height: 100%;\n display: flex;\n flex-direction: column;\n gap: 16px;\n overflow: auto;\n}\n\n\n\n.activity-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 12px;\n}\n\n.section-title[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 700;\n color: #2c3e50;\n margin: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { color: var(--primary-color, #4a6cf7); }\n\n.header-filters[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.filter-select[_ngcontent-%COMP%] {\n padding: 6px 10px;\n border: 1px solid #ddd;\n border-radius: 6px;\n font-size: 13px;\n background: #fff;\n color: #333;\n cursor: pointer;\n min-width: 160px;\n}\n\n.filter-select[_ngcontent-%COMP%]:focus { outline: none; border-color: var(--primary-color, #4a6cf7); }\n\n.refresh-btn[_ngcontent-%COMP%] {\n width: 34px;\n height: 34px;\n border: 1px solid #ddd;\n border-radius: 6px;\n background: #fff;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #666;\n font-size: 14px;\n transition: background 0.15s;\n}\n\n.refresh-btn[_ngcontent-%COMP%]:hover { background: #f0f4ff; color: var(--primary-color, #4a6cf7); }\n\n\n\n.activity-kpis[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.kpi-item[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 100px;\n background: #fff;\n border: 1px solid #eee;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.kpi-item.kpi-success[_ngcontent-%COMP%] .kpi-value[_ngcontent-%COMP%] { color: #1b7a3d; }\n.kpi-item.kpi-failed[_ngcontent-%COMP%] .kpi-value[_ngcontent-%COMP%] { color: #c62828; }\n\n.kpi-value[_ngcontent-%COMP%] {\n font-size: 22px;\n font-weight: 700;\n color: #2c3e50;\n}\n\n.kpi-label[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #888;\n margin-top: 2px;\n text-align: center;\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: #aaa;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 32px; margin-bottom: 12px; display: block; }\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] { margin: 0; font-size: 14px; }\n\n\n\n.activity-body[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n\n\n.run-list-panel[_ngcontent-%COMP%] {\n flex: 1;\n overflow: auto;\n border: 1px solid #eee;\n border-radius: 8px;\n background: #fff;\n}\n\n.run-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n}\n\n.run-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n position: sticky;\n top: 0;\n background: #f8f9fa;\n text-align: left;\n padding: 8px 10px;\n border-bottom: 2px solid #eee;\n color: #555;\n font-weight: 600;\n z-index: 1;\n}\n\n.run-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] { padding: 8px 10px; border-bottom: 1px solid #f0f0f0; }\n\n.run-row[_ngcontent-%COMP%] {\n cursor: pointer;\n transition: background 0.1s;\n}\n\n.run-row[_ngcontent-%COMP%]:hover { background: #f8f9fa; }\n.run-row.selected[_ngcontent-%COMP%] { background: #f0f4ff; }\n\n.integration-cell[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.integration-name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: #2c3e50;\n}\n\n.company-name[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #888;\n}\n\n.date-cell[_ngcontent-%COMP%], .mono-cell[_ngcontent-%COMP%] {\n font-variant-numeric: tabular-nums;\n color: #555;\n white-space: nowrap;\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.chip-green[_ngcontent-%COMP%] { background: #e6f9ed; color: #1b7a3d; }\n.chip-red[_ngcontent-%COMP%] { background: #fde8e8; color: #c62828; }\n.chip-amber[_ngcontent-%COMP%] { background: #fff7e0; color: #b5850a; }\n.chip-gray[_ngcontent-%COMP%] { background: #f0f0f0; color: #666; }\n\n\n\n.detail-panel[_ngcontent-%COMP%] {\n width: 420px;\n min-width: 380px;\n border: 1px solid #eee;\n border-radius: 8px;\n background: #fff;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.detail-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid #eee;\n background: #f8f9fa;\n}\n\n.detail-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] { margin: 0; font-size: 15px; font-weight: 600; color: #2c3e50; }\n\n.close-detail-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n cursor: pointer;\n color: #999;\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}\n\n.close-detail-btn[_ngcontent-%COMP%]:hover { background: #f0f0f0; color: #333; }\n\n\n\n.detail-tabs[_ngcontent-%COMP%] {\n display: flex;\n border-bottom: 1px solid #eee;\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: #888;\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 { color: var(--primary-color, #4a6cf7); }\n.tab-btn.active[_ngcontent-%COMP%] {\n color: var(--primary-color, #4a6cf7);\n border-bottom-color: var(--primary-color, #4a6cf7);\n}\n\n\n\n.detail-loading[_ngcontent-%COMP%], .detail-empty[_ngcontent-%COMP%] {\n padding: 24px;\n text-align: center;\n color: #aaa;\n}\n\n.detail-loading[_ngcontent-%COMP%] i[_ngcontent-%COMP%], .detail-empty[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 24px; margin-bottom: 8px; display: block; }\n.detail-loading[_ngcontent-%COMP%] p[_ngcontent-%COMP%], .detail-empty[_ngcontent-%COMP%] p[_ngcontent-%COMP%] { margin: 0; font-size: 13px; }\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: #888;\n font-weight: 600;\n border-bottom: 1px solid #eee;\n background: #fafbfc;\n}\n\n.detail-table[_ngcontent-%COMP%] th.num-col[_ngcontent-%COMP%] { text-align: right; }\n.detail-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] { padding: 7px 10px; border-bottom: 1px solid #f5f5f5; }\n.detail-table[_ngcontent-%COMP%] .num-col[_ngcontent-%COMP%] { text-align: right; font-variant-numeric: tabular-nums; }\n.detail-table[_ngcontent-%COMP%] .created-col[_ngcontent-%COMP%] { color: #1b7a3d; font-weight: 600; }\n.detail-table[_ngcontent-%COMP%] .updated-col[_ngcontent-%COMP%] { color: #0a6ea0; font-weight: 600; }\n.detail-table[_ngcontent-%COMP%] .error-col[_ngcontent-%COMP%] { color: #c62828; font-weight: 600; }\n.detail-table[_ngcontent-%COMP%] .watermark-value[_ngcontent-%COMP%] { color: #555; font-family: monospace; font-size: 11px; }\n\n.error-row[_ngcontent-%COMP%] { background: #fff8f8; }\n\n\n\n.error-log-section[_ngcontent-%COMP%] {\n padding: 12px 16px;\n border-top: 1px solid #eee;\n}\n\n.error-toggle-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n cursor: pointer;\n font-size: 12px;\n font-weight: 600;\n color: #c62828;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 0;\n}\n\n.error-toggle-btn[_ngcontent-%COMP%]:hover { text-decoration: underline; }\n\n.toggle-chevron[_ngcontent-%COMP%] {\n font-size: 10px;\n transition: transform 0.2s;\n}\n.toggle-chevron.flipped[_ngcontent-%COMP%] { transform: rotate(180deg); }\n\n.error-log-content[_ngcontent-%COMP%] {\n margin: 8px 0 0;\n padding: 10px;\n background: #fff0f0;\n border: 1px solid #fdd;\n border-radius: 4px;\n font-size: 11px;\n white-space: pre-wrap;\n word-break: break-word;\n max-height: 220px;\n overflow-y: auto;\n color: #7a1111;\n}\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: #e8eeff;\n color: var(--primary-color, #4a6cf7);\n}"] });
|
|
657
|
+
};
|
|
658
|
+
SyncActivityComponent = __decorate([
|
|
659
|
+
RegisterClass(BaseResourceComponent, 'IntegrationSyncActivity')
|
|
660
|
+
], SyncActivityComponent);
|
|
661
|
+
export { SyncActivityComponent };
|
|
662
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SyncActivityComponent, [{
|
|
663
|
+
type: Component,
|
|
664
|
+
args: [{ standalone: false, selector: 'app-sync-activity', template: "<div class=\"sync-activity\">\n\n <!-- Header bar -->\n <div class=\"activity-header\">\n <div class=\"header-left\">\n <h2 class=\"section-title\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n Sync Activity\n </h2>\n </div>\n <div class=\"header-filters\">\n <select class=\"filter-select\" [(ngModel)]=\"SelectedIntegrationID\" (change)=\"OnIntegrationChange()\">\n <option value=\"\">All Integrations</option>\n @for (integration of Integrations; track integration.ID) {\n <option [value]=\"integration.ID\">{{ integration.Name }}</option>\n }\n </select>\n\n <select class=\"filter-select\" [(ngModel)]=\"SelectedStatusFilter\" (change)=\"OnStatusFilterChange()\">\n @for (status of StatusOptions; track status) {\n <option [value]=\"status\">{{ status }}</option>\n }\n </select>\n\n <button class=\"refresh-btn\" (click)=\"LoadRuns()\" title=\"Refresh\">\n <i class=\"fa-solid fa-rotate\"></i>\n </button>\n </div>\n </div>\n\n <!-- Summary KPIs -->\n @if (!IsLoadingRuns && Runs.length > 0) {\n <div class=\"activity-kpis\">\n <div class=\"kpi-item\">\n <span class=\"kpi-value\">{{ TotalRuns }}</span>\n <span class=\"kpi-label\">Total Runs</span>\n </div>\n <div class=\"kpi-item kpi-success\">\n <span class=\"kpi-value\">{{ SuccessfulRuns }}</span>\n <span class=\"kpi-label\">Successful</span>\n </div>\n <div class=\"kpi-item kpi-failed\">\n <span class=\"kpi-value\">{{ FailedRuns }}</span>\n <span class=\"kpi-label\">Failed</span>\n </div>\n <div class=\"kpi-item\">\n <span class=\"kpi-value\">{{ TotalRecordsInView | number }}</span>\n <span class=\"kpi-label\">Records (filtered)</span>\n </div>\n </div>\n }\n\n <!-- Loading state -->\n @if (IsLoadingRuns) {\n <div class=\"loading-area\">\n <mj-loading text=\"Loading run history...\" size=\"medium\"></mj-loading>\n </div>\n }\n\n <!-- Empty state -->\n @if (!IsLoadingRuns && 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 <!-- Run list + detail split -->\n @if (!IsLoadingRuns && FilteredRuns.length > 0) {\n <div class=\"activity-body\">\n\n <!-- Run list -->\n <div class=\"run-list-panel\">\n <table class=\"run-table\">\n <thead>\n <tr>\n <th>Integration</th>\n <th>Started</th>\n <th>Status</th>\n <th>Duration</th>\n <th>Records</th>\n <th>Run By</th>\n </tr>\n </thead>\n <tbody>\n @for (run of FilteredRuns; track run.ID) {\n <tr class=\"run-row\"\n [class.selected]=\"IsSelectedRun(run.ID)\"\n (click)=\"OnRunClick(run)\">\n <td class=\"integration-cell\">\n <span class=\"integration-name\">{{ run.Integration }}</span>\n <span class=\"company-name\">{{ run.Company }}</span>\n </td>\n <td class=\"date-cell\">{{ FormatDate(run.StartedAt) }}</td>\n <td>\n <span [class]=\"StatusChipClass(run.Status)\">\n <i [class]=\"StatusIcon(run.Status)\"></i>\n {{ run.Status }}\n </span>\n </td>\n <td class=\"mono-cell\">{{ FormatDuration(run) }}</td>\n <td class=\"mono-cell\">{{ run.TotalRecords | number }}</td>\n <td>{{ run.RunByUser }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <!-- Detail panel -->\n @if (SelectedRunID) {\n <div class=\"detail-panel\">\n <div class=\"detail-header\">\n <h3>Run Details</h3>\n <button class=\"close-detail-btn\" (click)=\"OnRunClick(GetSelectedRun()!)\"\n title=\"Close details\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <!-- Tab switcher -->\n <div class=\"detail-tabs\">\n <button class=\"tab-btn\" [class.active]=\"ActiveDetailsTab === 'entities'\"\n (click)=\"SetDetailsTab('entities')\">\n <i class=\"fa-solid fa-table\"></i> Entity Breakdown\n </button>\n <button class=\"tab-btn\" [class.active]=\"ActiveDetailsTab === 'watermarks'\"\n (click)=\"SetDetailsTab('watermarks')\">\n <i class=\"fa-solid fa-droplet\"></i> Watermarks\n </button>\n </div>\n\n <!-- Entity breakdown tab -->\n @if (ActiveDetailsTab === 'entities') {\n @if (IsLoadingDetails) {\n <div class=\"detail-loading\">\n <mj-loading text=\"Loading entity breakdown...\" size=\"small\"></mj-loading>\n </div>\n } @else if (RunDetails.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 RunDetails; track detail.ID) {\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 section -->\n @if (GetSelectedRun()?.ErrorLog) {\n <div class=\"error-log-section\">\n <button class=\"error-toggle-btn\" (click)=\"ToggleErrorLog($event)\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n Error Log\n <i class=\"fa-solid fa-chevron-down toggle-chevron\"\n [class.flipped]=\"ShowErrorLog\"></i>\n </button>\n @if (ShowErrorLog) {\n <pre class=\"error-log-content\">{{ GetSelectedRun()?.ErrorLog }}</pre>\n }\n </div>\n }\n }\n\n <!-- Watermarks tab -->\n @if (ActiveDetailsTab === 'watermarks') {\n @if (IsLoadingWatermarks) {\n <div class=\"detail-loading\">\n <mj-loading text=\"Loading watermarks...\" size=\"small\"></mj-loading>\n </div>\n } @else if (Watermarks.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 Watermarks; track wm.ID) {\n <tr>\n <td>{{ wm.EntityMap }}</td>\n <td>\n <span class=\"type-badge\">{{ wm.WatermarkType }}</span>\n </td>\n <td class=\"watermark-value mono-cell\">{{ FormatWatermark(wm.WatermarkValue) }}</td>\n <td>{{ FormatDate(wm.LastAppliedAt) }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n }\n\n </div>\n }\n\n </div>\n }\n\n</div>\n", styles: [":host {\n display: block;\n height: 100%;\n}\n\n.sync-activity {\n padding: 20px;\n height: 100%;\n display: flex;\n flex-direction: column;\n gap: 16px;\n overflow: auto;\n}\n\n/* Header */\n.activity-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 12px;\n}\n\n.section-title {\n font-size: 18px;\n font-weight: 700;\n color: #2c3e50;\n margin: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.section-title i { color: var(--primary-color, #4a6cf7); }\n\n.header-filters {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.filter-select {\n padding: 6px 10px;\n border: 1px solid #ddd;\n border-radius: 6px;\n font-size: 13px;\n background: #fff;\n color: #333;\n cursor: pointer;\n min-width: 160px;\n}\n\n.filter-select:focus { outline: none; border-color: var(--primary-color, #4a6cf7); }\n\n.refresh-btn {\n width: 34px;\n height: 34px;\n border: 1px solid #ddd;\n border-radius: 6px;\n background: #fff;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #666;\n font-size: 14px;\n transition: background 0.15s;\n}\n\n.refresh-btn:hover { background: #f0f4ff; color: var(--primary-color, #4a6cf7); }\n\n/* KPIs */\n.activity-kpis {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.kpi-item {\n flex: 1;\n min-width: 100px;\n background: #fff;\n border: 1px solid #eee;\n border-radius: 8px;\n padding: 12px 16px;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.kpi-item.kpi-success .kpi-value { color: #1b7a3d; }\n.kpi-item.kpi-failed .kpi-value { color: #c62828; }\n\n.kpi-value {\n font-size: 22px;\n font-weight: 700;\n color: #2c3e50;\n}\n\n.kpi-label {\n font-size: 11px;\n color: #888;\n margin-top: 2px;\n text-align: center;\n}\n\n/* Loading / empty */\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: #aaa;\n}\n\n.empty-state i { font-size: 32px; margin-bottom: 12px; display: block; }\n.empty-state p { margin: 0; font-size: 14px; }\n\n/* Activity body split layout */\n.activity-body {\n display: flex;\n gap: 16px;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n/* Run list panel */\n.run-list-panel {\n flex: 1;\n overflow: auto;\n border: 1px solid #eee;\n border-radius: 8px;\n background: #fff;\n}\n\n.run-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n}\n\n.run-table th {\n position: sticky;\n top: 0;\n background: #f8f9fa;\n text-align: left;\n padding: 8px 10px;\n border-bottom: 2px solid #eee;\n color: #555;\n font-weight: 600;\n z-index: 1;\n}\n\n.run-table td { padding: 8px 10px; border-bottom: 1px solid #f0f0f0; }\n\n.run-row {\n cursor: pointer;\n transition: background 0.1s;\n}\n\n.run-row:hover { background: #f8f9fa; }\n.run-row.selected { background: #f0f4ff; }\n\n.integration-cell {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.integration-name {\n font-weight: 600;\n color: #2c3e50;\n}\n\n.company-name {\n font-size: 11px;\n color: #888;\n}\n\n.date-cell, .mono-cell {\n font-variant-numeric: tabular-nums;\n color: #555;\n white-space: nowrap;\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.chip-green { background: #e6f9ed; color: #1b7a3d; }\n.chip-red { background: #fde8e8; color: #c62828; }\n.chip-amber { background: #fff7e0; color: #b5850a; }\n.chip-gray { background: #f0f0f0; color: #666; }\n\n/* Detail panel */\n.detail-panel {\n width: 420px;\n min-width: 380px;\n border: 1px solid #eee;\n border-radius: 8px;\n background: #fff;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.detail-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid #eee;\n background: #f8f9fa;\n}\n\n.detail-header h3 { margin: 0; font-size: 15px; font-weight: 600; color: #2c3e50; }\n\n.close-detail-btn {\n background: none;\n border: none;\n cursor: pointer;\n color: #999;\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}\n\n.close-detail-btn:hover { background: #f0f0f0; color: #333; }\n\n/* Tabs */\n.detail-tabs {\n display: flex;\n border-bottom: 1px solid #eee;\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: #888;\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 { color: var(--primary-color, #4a6cf7); }\n.tab-btn.active {\n color: var(--primary-color, #4a6cf7);\n border-bottom-color: var(--primary-color, #4a6cf7);\n}\n\n/* Detail content */\n.detail-loading, .detail-empty {\n padding: 24px;\n text-align: center;\n color: #aaa;\n}\n\n.detail-loading i, .detail-empty i { font-size: 24px; margin-bottom: 8px; display: block; }\n.detail-loading p, .detail-empty p { margin: 0; font-size: 13px; }\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: #888;\n font-weight: 600;\n border-bottom: 1px solid #eee;\n background: #fafbfc;\n}\n\n.detail-table th.num-col { text-align: right; }\n.detail-table td { padding: 7px 10px; border-bottom: 1px solid #f5f5f5; }\n.detail-table .num-col { text-align: right; font-variant-numeric: tabular-nums; }\n.detail-table .created-col { color: #1b7a3d; font-weight: 600; }\n.detail-table .updated-col { color: #0a6ea0; font-weight: 600; }\n.detail-table .error-col { color: #c62828; font-weight: 600; }\n.detail-table .watermark-value { color: #555; font-family: monospace; font-size: 11px; }\n\n.error-row { background: #fff8f8; }\n\n/* Error log */\n.error-log-section {\n padding: 12px 16px;\n border-top: 1px solid #eee;\n}\n\n.error-toggle-btn {\n background: none;\n border: none;\n cursor: pointer;\n font-size: 12px;\n font-weight: 600;\n color: #c62828;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 0;\n}\n\n.error-toggle-btn:hover { text-decoration: underline; }\n\n.toggle-chevron {\n font-size: 10px;\n transition: transform 0.2s;\n}\n.toggle-chevron.flipped { transform: rotate(180deg); }\n\n.error-log-content {\n margin: 8px 0 0;\n padding: 10px;\n background: #fff0f0;\n border: 1px solid #fdd;\n border-radius: 4px;\n font-size: 11px;\n white-space: pre-wrap;\n word-break: break-word;\n max-height: 220px;\n overflow-y: auto;\n color: #7a1111;\n}\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: #e8eeff;\n color: var(--primary-color, #4a6cf7);\n}\n"] }]
|
|
665
|
+
}], null, null); })();
|
|
666
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SyncActivityComponent, { className: "SyncActivityComponent", filePath: "src/Integration/components/sync-activity/sync-activity.component.ts", lineNumber: 32 }); })();
|
|
667
|
+
export function LoadSyncActivityComponent() {
|
|
668
|
+
// Tree-shaking prevention: importing this module causes
|
|
669
|
+
// @RegisterClass decorators to fire, registering components.
|
|
670
|
+
}
|
|
671
|
+
//# sourceMappingURL=sync-activity.component.js.map
|