@memberjunction/ng-dashboards 2.106.0 → 2.107.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 (37) hide show
  1. package/dist/Scheduling/components/scheduling-health.component.d.ts +30 -0
  2. package/dist/Scheduling/components/scheduling-health.component.d.ts.map +1 -0
  3. package/dist/Scheduling/components/scheduling-health.component.js +316 -0
  4. package/dist/Scheduling/components/scheduling-health.component.js.map +1 -0
  5. package/dist/Scheduling/components/scheduling-history.component.d.ts +48 -0
  6. package/dist/Scheduling/components/scheduling-history.component.d.ts.map +1 -0
  7. package/dist/Scheduling/components/scheduling-history.component.js +378 -0
  8. package/dist/Scheduling/components/scheduling-history.component.js.map +1 -0
  9. package/dist/Scheduling/components/scheduling-jobs.component.d.ts +48 -0
  10. package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -0
  11. package/dist/Scheduling/components/scheduling-jobs.component.js +372 -0
  12. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -0
  13. package/dist/Scheduling/components/scheduling-monitoring.component.d.ts +37 -0
  14. package/dist/Scheduling/components/scheduling-monitoring.component.d.ts.map +1 -0
  15. package/dist/Scheduling/components/scheduling-monitoring.component.js +489 -0
  16. package/dist/Scheduling/components/scheduling-monitoring.component.js.map +1 -0
  17. package/dist/Scheduling/components/scheduling-types.component.d.ts +22 -0
  18. package/dist/Scheduling/components/scheduling-types.component.d.ts.map +1 -0
  19. package/dist/Scheduling/components/scheduling-types.component.js +166 -0
  20. package/dist/Scheduling/components/scheduling-types.component.js.map +1 -0
  21. package/dist/Scheduling/scheduling-dashboard.component.d.ts +52 -0
  22. package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -0
  23. package/dist/Scheduling/scheduling-dashboard.component.js +256 -0
  24. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -0
  25. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +102 -0
  26. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -0
  27. package/dist/Scheduling/services/scheduling-instrumentation.service.js +406 -0
  28. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -0
  29. package/dist/module.d.ts +25 -19
  30. package/dist/module.d.ts.map +1 -1
  31. package/dist/module.js +32 -6
  32. package/dist/module.js.map +1 -1
  33. package/dist/public-api.d.ts +1 -0
  34. package/dist/public-api.d.ts.map +1 -1
  35. package/dist/public-api.js +3 -0
  36. package/dist/public-api.js.map +1 -1
  37. package/package.json +9 -9
@@ -0,0 +1,372 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import { Subject, BehaviorSubject, combineLatest } from 'rxjs';
3
+ import { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../services/scheduling-instrumentation.service";
6
+ import * as i2 from "@angular/common";
7
+ import * as i3 from "@progress/kendo-angular-dropdowns";
8
+ import * as i4 from "@progress/kendo-angular-inputs";
9
+ import * as i5 from "@progress/kendo-angular-buttons";
10
+ const _forTrack0 = ($index, $item) => $item.jobId;
11
+ function SchedulingJobsComponent_ng_template_5_Template(rf, ctx) { if (rf & 1) {
12
+ i0.ɵɵelement(0, "i", 13);
13
+ } }
14
+ function SchedulingJobsComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
15
+ i0.ɵɵelementStart(0, "div", 10);
16
+ i0.ɵɵelement(1, "i", 14);
17
+ i0.ɵɵelementStart(2, "p");
18
+ i0.ɵɵtext(3, "Loading jobs...");
19
+ i0.ɵɵelementEnd()();
20
+ } }
21
+ function SchedulingJobsComponent_Conditional_14_Template(rf, ctx) { if (rf & 1) {
22
+ i0.ɵɵelementStart(0, "div", 11);
23
+ i0.ɵɵelement(1, "i", 15);
24
+ i0.ɵɵelementStart(2, "p");
25
+ i0.ɵɵtext(3, "No jobs found");
26
+ i0.ɵɵelementEnd()();
27
+ } }
28
+ function SchedulingJobsComponent_Conditional_15_For_2_Conditional_49_Template(rf, ctx) { if (rf & 1) {
29
+ const _r2 = i0.ɵɵgetCurrentView();
30
+ i0.ɵɵelementStart(0, "button", 36);
31
+ i0.ɵɵlistener("click", function SchedulingJobsComponent_Conditional_15_For_2_Conditional_49_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r2); const job_r3 = i0.ɵɵnextContext().$implicit; const ctx_r3 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r3.onPauseJob(job_r3.jobId)); });
32
+ i0.ɵɵelement(1, "i", 38);
33
+ i0.ɵɵtext(2, " Pause ");
34
+ i0.ɵɵelementEnd();
35
+ } if (rf & 2) {
36
+ i0.ɵɵproperty("size", "small");
37
+ } }
38
+ function SchedulingJobsComponent_Conditional_15_For_2_Conditional_50_Template(rf, ctx) { if (rf & 1) {
39
+ const _r5 = i0.ɵɵgetCurrentView();
40
+ i0.ɵɵelementStart(0, "button", 36);
41
+ i0.ɵɵlistener("click", function SchedulingJobsComponent_Conditional_15_For_2_Conditional_50_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const job_r3 = i0.ɵɵnextContext().$implicit; const ctx_r3 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r3.onResumeJob(job_r3.jobId)); });
42
+ i0.ɵɵelement(1, "i", 39);
43
+ i0.ɵɵtext(2, " Resume ");
44
+ i0.ɵɵelementEnd();
45
+ } if (rf & 2) {
46
+ i0.ɵɵproperty("size", "small");
47
+ } }
48
+ function SchedulingJobsComponent_Conditional_15_For_2_Template(rf, ctx) { if (rf & 1) {
49
+ const _r1 = i0.ɵɵgetCurrentView();
50
+ i0.ɵɵelementStart(0, "div", 16)(1, "div", 17)(2, "div", 18);
51
+ i0.ɵɵelement(3, "i", 19);
52
+ i0.ɵɵelementStart(4, "h4");
53
+ i0.ɵɵtext(5);
54
+ i0.ɵɵelementEnd()();
55
+ i0.ɵɵelementStart(6, "kendo-chip", 20);
56
+ i0.ɵɵelement(7, "i", 21);
57
+ i0.ɵɵtext(8);
58
+ i0.ɵɵelementEnd()();
59
+ i0.ɵɵelementStart(9, "div", 22)(10, "div", 23)(11, "span", 24);
60
+ i0.ɵɵtext(12, "Type:");
61
+ i0.ɵɵelementEnd();
62
+ i0.ɵɵelementStart(13, "span", 25);
63
+ i0.ɵɵtext(14);
64
+ i0.ɵɵelementEnd()();
65
+ i0.ɵɵelementStart(15, "div", 23)(16, "span", 24);
66
+ i0.ɵɵtext(17, "Total Runs:");
67
+ i0.ɵɵelementEnd();
68
+ i0.ɵɵelementStart(18, "span", 25);
69
+ i0.ɵɵtext(19);
70
+ i0.ɵɵelementEnd()();
71
+ i0.ɵɵelementStart(20, "div", 23)(21, "span", 24);
72
+ i0.ɵɵtext(22, "Success Rate:");
73
+ i0.ɵɵelementEnd();
74
+ i0.ɵɵelementStart(23, "span", 25)(24, "div", 26)(25, "div", 27);
75
+ i0.ɵɵelement(26, "div", 28);
76
+ i0.ɵɵelementEnd();
77
+ i0.ɵɵelementStart(27, "span");
78
+ i0.ɵɵtext(28);
79
+ i0.ɵɵelementEnd()()()();
80
+ i0.ɵɵelementStart(29, "div", 23)(30, "span", 24);
81
+ i0.ɵɵtext(31, "Last Run:");
82
+ i0.ɵɵelementEnd();
83
+ i0.ɵɵelementStart(32, "span", 25);
84
+ i0.ɵɵtext(33);
85
+ i0.ɵɵelementEnd()();
86
+ i0.ɵɵelementStart(34, "div", 23)(35, "span", 24);
87
+ i0.ɵɵtext(36, "Next Run:");
88
+ i0.ɵɵelementEnd();
89
+ i0.ɵɵelementStart(37, "span", 25);
90
+ i0.ɵɵtext(38);
91
+ i0.ɵɵelementEnd()();
92
+ i0.ɵɵelementStart(39, "div", 29)(40, "div", 30);
93
+ i0.ɵɵelement(41, "i", 31);
94
+ i0.ɵɵelementStart(42, "span");
95
+ i0.ɵɵtext(43);
96
+ i0.ɵɵelementEnd()();
97
+ i0.ɵɵelementStart(44, "div", 32);
98
+ i0.ɵɵelement(45, "i", 33);
99
+ i0.ɵɵelementStart(46, "span");
100
+ i0.ɵɵtext(47);
101
+ i0.ɵɵelementEnd()()()();
102
+ i0.ɵɵelementStart(48, "div", 34);
103
+ i0.ɵɵtemplate(49, SchedulingJobsComponent_Conditional_15_For_2_Conditional_49_Template, 3, 1, "button", 35)(50, SchedulingJobsComponent_Conditional_15_For_2_Conditional_50_Template, 3, 1, "button", 35);
104
+ i0.ɵɵelementStart(51, "button", 36);
105
+ i0.ɵɵlistener("click", function SchedulingJobsComponent_Conditional_15_For_2_Template_button_click_51_listener() { const job_r3 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r3 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r3.onExecuteJob(job_r3.jobId)); });
106
+ i0.ɵɵelement(52, "i", 37);
107
+ i0.ɵɵtext(53, " Run Now ");
108
+ i0.ɵɵelementEnd()()();
109
+ } if (rf & 2) {
110
+ const job_r3 = ctx.$implicit;
111
+ const ctx_r3 = i0.ɵɵnextContext(2);
112
+ i0.ɵɵadvance(5);
113
+ i0.ɵɵtextInterpolate(job_r3.jobName);
114
+ i0.ɵɵadvance();
115
+ i0.ɵɵproperty("themeColor", ctx_r3.getStatusColor(job_r3.status))("size", "small");
116
+ i0.ɵɵadvance();
117
+ i0.ɵɵproperty("ngClass", ctx_r3.getStatusIcon(job_r3.status));
118
+ i0.ɵɵadvance();
119
+ i0.ɵɵtextInterpolate1(" ", job_r3.status, " ");
120
+ i0.ɵɵadvance(6);
121
+ i0.ɵɵtextInterpolate(job_r3.jobType);
122
+ i0.ɵɵadvance(5);
123
+ i0.ɵɵtextInterpolate(job_r3.totalRuns);
124
+ i0.ɵɵadvance(7);
125
+ i0.ɵɵstyleProp("width", job_r3.successRate * 100, "%");
126
+ i0.ɵɵadvance(2);
127
+ i0.ɵɵtextInterpolate(ctx_r3.formatPercentage(job_r3.successRate));
128
+ i0.ɵɵadvance(5);
129
+ i0.ɵɵtextInterpolate(ctx_r3.formatDate(job_r3.lastRunAt));
130
+ i0.ɵɵadvance(5);
131
+ i0.ɵɵtextInterpolate(ctx_r3.formatDate(job_r3.nextRunAt));
132
+ i0.ɵɵadvance(5);
133
+ i0.ɵɵtextInterpolate(job_r3.successCount);
134
+ i0.ɵɵadvance(4);
135
+ i0.ɵɵtextInterpolate(job_r3.failureCount);
136
+ i0.ɵɵadvance(2);
137
+ i0.ɵɵconditional(job_r3.status === "Active" ? 49 : -1);
138
+ i0.ɵɵadvance();
139
+ i0.ɵɵconditional(job_r3.status === "Paused" ? 50 : -1);
140
+ i0.ɵɵadvance();
141
+ i0.ɵɵproperty("size", "small");
142
+ } }
143
+ function SchedulingJobsComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
144
+ i0.ɵɵelementStart(0, "div", 12);
145
+ i0.ɵɵrepeaterCreate(1, SchedulingJobsComponent_Conditional_15_For_2_Template, 54, 17, "div", 16, _forTrack0);
146
+ i0.ɵɵelementEnd();
147
+ } if (rf & 2) {
148
+ const ctx_r3 = i0.ɵɵnextContext();
149
+ i0.ɵɵadvance();
150
+ i0.ɵɵrepeater(ctx_r3.filteredJobs);
151
+ } }
152
+ export class SchedulingJobsComponent {
153
+ schedulingService;
154
+ cdr;
155
+ initialState;
156
+ stateChange = new EventEmitter();
157
+ jobs = [];
158
+ filteredJobs = [];
159
+ isLoading = false;
160
+ searchTerm$ = new BehaviorSubject('');
161
+ statusFilter$ = new BehaviorSubject('all');
162
+ typeFilter$ = new BehaviorSubject('all');
163
+ statusOptions = [
164
+ { text: 'All Statuses', value: 'all' },
165
+ { text: 'Active', value: 'Active' },
166
+ { text: 'Paused', value: 'Paused' },
167
+ { text: 'Disabled', value: 'Disabled' },
168
+ { text: 'Pending', value: 'Pending' },
169
+ { text: 'Expired', value: 'Expired' }
170
+ ];
171
+ typeOptions = [
172
+ { text: 'All Types', value: 'all' }
173
+ ];
174
+ destroy$ = new Subject();
175
+ constructor(schedulingService, cdr) {
176
+ this.schedulingService = schedulingService;
177
+ this.cdr = cdr;
178
+ }
179
+ ngOnInit() {
180
+ this.loadState();
181
+ this.setupFilters();
182
+ this.loadData();
183
+ }
184
+ ngOnDestroy() {
185
+ this.destroy$.next();
186
+ this.destroy$.complete();
187
+ }
188
+ loadState() {
189
+ if (this.initialState) {
190
+ if (this.initialState.searchTerm)
191
+ this.searchTerm$.next(this.initialState.searchTerm);
192
+ if (this.initialState.statusFilter)
193
+ this.statusFilter$.next(this.initialState.statusFilter);
194
+ if (this.initialState.typeFilter)
195
+ this.typeFilter$.next(this.initialState.typeFilter);
196
+ }
197
+ }
198
+ setupFilters() {
199
+ combineLatest([
200
+ this.searchTerm$.pipe(debounceTime(300), distinctUntilChanged()),
201
+ this.statusFilter$.pipe(distinctUntilChanged()),
202
+ this.typeFilter$.pipe(distinctUntilChanged())
203
+ ])
204
+ .pipe(takeUntil(this.destroy$))
205
+ .subscribe(() => {
206
+ this.applyFilters();
207
+ this.emitStateChange();
208
+ });
209
+ }
210
+ loadData() {
211
+ this.isLoading = true;
212
+ this.schedulingService.jobStatistics$
213
+ .pipe(takeUntil(this.destroy$))
214
+ .subscribe({
215
+ next: (jobs) => {
216
+ this.jobs = jobs;
217
+ this.updateTypeOptions();
218
+ this.applyFilters();
219
+ this.isLoading = false;
220
+ this.cdr.markForCheck();
221
+ },
222
+ error: (error) => {
223
+ console.error('Error loading jobs:', error);
224
+ this.isLoading = false;
225
+ this.cdr.markForCheck();
226
+ }
227
+ });
228
+ }
229
+ updateTypeOptions() {
230
+ const uniqueTypes = Array.from(new Set(this.jobs.map(j => j.jobType)));
231
+ this.typeOptions = [
232
+ { text: 'All Types', value: 'all' },
233
+ ...uniqueTypes.map(type => ({ text: type, value: type }))
234
+ ];
235
+ }
236
+ applyFilters() {
237
+ let filtered = [...this.jobs];
238
+ const searchTerm = this.searchTerm$.value.toLowerCase();
239
+ if (searchTerm) {
240
+ filtered = filtered.filter(job => job.jobName.toLowerCase().includes(searchTerm) ||
241
+ job.jobType.toLowerCase().includes(searchTerm));
242
+ }
243
+ const statusFilter = this.statusFilter$.value;
244
+ if (statusFilter !== 'all') {
245
+ filtered = filtered.filter(job => job.status === statusFilter);
246
+ }
247
+ const typeFilter = this.typeFilter$.value;
248
+ if (typeFilter !== 'all') {
249
+ filtered = filtered.filter(job => job.jobType === typeFilter);
250
+ }
251
+ this.filteredJobs = filtered;
252
+ this.cdr.markForCheck();
253
+ }
254
+ onSearchChange(value) {
255
+ this.searchTerm$.next(value);
256
+ }
257
+ onStatusFilterChange(value) {
258
+ this.statusFilter$.next(value);
259
+ }
260
+ onTypeFilterChange(value) {
261
+ this.typeFilter$.next(value);
262
+ }
263
+ onRefresh() {
264
+ this.schedulingService.refresh();
265
+ }
266
+ getStatusColor(status) {
267
+ switch (status) {
268
+ case 'Active': return 'success';
269
+ case 'Paused': return 'warning';
270
+ case 'Disabled': return 'error';
271
+ case 'Pending': return 'info';
272
+ case 'Expired': return 'error';
273
+ default: return 'info';
274
+ }
275
+ }
276
+ getStatusIcon(status) {
277
+ switch (status) {
278
+ case 'Active': return 'fa-play-circle';
279
+ case 'Paused': return 'fa-pause-circle';
280
+ case 'Disabled': return 'fa-ban';
281
+ case 'Pending': return 'fa-clock';
282
+ case 'Expired': return 'fa-calendar-times';
283
+ default: return 'fa-question-circle';
284
+ }
285
+ }
286
+ formatPercentage(value) {
287
+ return (value * 100).toFixed(1) + '%';
288
+ }
289
+ formatDate(date) {
290
+ if (!date)
291
+ return 'Never';
292
+ return new Date(date).toLocaleString();
293
+ }
294
+ async onPauseJob(jobId) {
295
+ const result = await this.schedulingService.updateJobStatus(jobId, 'Paused');
296
+ if (result) {
297
+ console.log('Job paused successfully');
298
+ }
299
+ }
300
+ async onResumeJob(jobId) {
301
+ const result = await this.schedulingService.updateJobStatus(jobId, 'Active');
302
+ if (result) {
303
+ console.log('Job resumed successfully');
304
+ }
305
+ }
306
+ async onExecuteJob(jobId) {
307
+ const result = await this.schedulingService.executeJobManually(jobId);
308
+ if (result) {
309
+ console.log('Job executed successfully');
310
+ }
311
+ }
312
+ emitStateChange() {
313
+ const state = {
314
+ searchTerm: this.searchTerm$.value,
315
+ statusFilter: this.statusFilter$.value,
316
+ typeFilter: this.typeFilter$.value
317
+ };
318
+ this.stateChange.emit(state);
319
+ }
320
+ static ɵfac = function SchedulingJobsComponent_Factory(t) { return new (t || SchedulingJobsComponent)(i0.ɵɵdirectiveInject(i1.SchedulingInstrumentationService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
321
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SchedulingJobsComponent, selectors: [["app-scheduling-jobs"]], inputs: { initialState: "initialState" }, outputs: { stateChange: "stateChange" }, decls: 16, vars: 15, consts: [[1, "scheduling-jobs"], [1, "jobs-header"], [1, "filters-row"], [1, "search-container"], ["placeholder", "Search jobs...", 3, "valueChange", "value"], ["kendoTextBoxPrefixTemplate", ""], ["textField", "text", "valueField", "value", 3, "valueChange", "data", "valuePrimitive", "value"], ["kendoButton", "", 3, "click", "disabled"], [1, "fa-solid", "fa-refresh"], [1, "results-count"], [1, "loading-overlay"], [1, "empty-state"], [1, "jobs-grid"], [1, "fa-solid", "fa-search"], [1, "fa-solid", "fa-spinner", "fa-spin", "fa-3x"], [1, "fa-solid", "fa-inbox"], [1, "job-card"], [1, "job-card-header"], [1, "job-title"], [1, "fa-solid", "fa-calendar-alt"], [3, "themeColor", "size"], [1, "fa-solid", 3, "ngClass"], [1, "job-card-body"], [1, "job-info-row"], [1, "label"], [1, "value"], [1, "success-rate"], [1, "rate-bar"], [1, "rate-fill"], [1, "job-stats"], [1, "stat", "success"], [1, "fa-solid", "fa-check-circle"], [1, "stat", "error"], [1, "fa-solid", "fa-exclamation-circle"], [1, "job-card-actions"], ["kendoButton", "", 3, "size"], ["kendoButton", "", 3, "click", "size"], [1, "fa-solid", "fa-bolt"], [1, "fa-solid", "fa-pause"], [1, "fa-solid", "fa-play"]], template: function SchedulingJobsComponent_Template(rf, ctx) { if (rf & 1) {
322
+ i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "div", 3)(4, "kendo-textbox", 4);
323
+ i0.ɵɵlistener("valueChange", function SchedulingJobsComponent_Template_kendo_textbox_valueChange_4_listener($event) { return ctx.onSearchChange($event); });
324
+ i0.ɵɵtemplate(5, SchedulingJobsComponent_ng_template_5_Template, 1, 0, "ng-template", 5);
325
+ i0.ɵɵelementEnd()();
326
+ i0.ɵɵelementStart(6, "kendo-dropdownlist", 6);
327
+ i0.ɵɵlistener("valueChange", function SchedulingJobsComponent_Template_kendo_dropdownlist_valueChange_6_listener($event) { return ctx.onStatusFilterChange($event); });
328
+ i0.ɵɵelementEnd();
329
+ i0.ɵɵelementStart(7, "kendo-dropdownlist", 6);
330
+ i0.ɵɵlistener("valueChange", function SchedulingJobsComponent_Template_kendo_dropdownlist_valueChange_7_listener($event) { return ctx.onTypeFilterChange($event); });
331
+ i0.ɵɵelementEnd();
332
+ i0.ɵɵelementStart(8, "button", 7);
333
+ i0.ɵɵlistener("click", function SchedulingJobsComponent_Template_button_click_8_listener() { return ctx.onRefresh(); });
334
+ i0.ɵɵelement(9, "i", 8);
335
+ i0.ɵɵtext(10, " Refresh ");
336
+ i0.ɵɵelementEnd()();
337
+ i0.ɵɵelementStart(11, "div", 9);
338
+ i0.ɵɵtext(12);
339
+ i0.ɵɵelementEnd()();
340
+ i0.ɵɵtemplate(13, SchedulingJobsComponent_Conditional_13_Template, 4, 0, "div", 10)(14, SchedulingJobsComponent_Conditional_14_Template, 4, 0, "div", 11)(15, SchedulingJobsComponent_Conditional_15_Template, 3, 0, "div", 12);
341
+ i0.ɵɵelementEnd();
342
+ } if (rf & 2) {
343
+ i0.ɵɵadvance(4);
344
+ i0.ɵɵproperty("value", ctx.searchTerm$.value);
345
+ i0.ɵɵadvance(2);
346
+ i0.ɵɵproperty("data", ctx.statusOptions)("valuePrimitive", true)("value", ctx.statusFilter$.value);
347
+ i0.ɵɵadvance();
348
+ i0.ɵɵproperty("data", ctx.typeOptions)("valuePrimitive", true)("value", ctx.typeFilter$.value);
349
+ i0.ɵɵadvance();
350
+ i0.ɵɵproperty("disabled", ctx.isLoading);
351
+ i0.ɵɵadvance();
352
+ i0.ɵɵclassProp("fa-spin", ctx.isLoading);
353
+ i0.ɵɵadvance(3);
354
+ i0.ɵɵtextInterpolate2(" Showing ", ctx.filteredJobs.length, " of ", ctx.jobs.length, " jobs ");
355
+ i0.ɵɵadvance();
356
+ i0.ɵɵconditional(ctx.isLoading && ctx.jobs.length === 0 ? 13 : -1);
357
+ i0.ɵɵadvance();
358
+ i0.ɵɵconditional(!ctx.isLoading && ctx.filteredJobs.length === 0 ? 14 : -1);
359
+ i0.ɵɵadvance();
360
+ i0.ɵɵconditional(ctx.filteredJobs.length > 0 ? 15 : -1);
361
+ } }, dependencies: [i2.NgClass, i3.DropDownListComponent, i4.TextBoxComponent, i4.TextBoxPrefixTemplateDirective, i5.ButtonComponent, i5.ChipComponent], styles: [".scheduling-jobs[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.jobs-header[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.filters-row[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n align-items: center;\n\n .search-container {\n flex: 1;\n min-width: 250px;\n }\n}\n\n.results-count[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #6c757d;\n}\n\n.loading-overlay[_ngcontent-%COMP%], \n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px;\n color: #6c757d;\n\n i {\n margin-bottom: 16px;\n font-size: 48px;\n opacity: 0.3;\n }\n\n p {\n margin: 0;\n font-size: 14px;\n }\n}\n\n.jobs-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));\n gap: 20px;\n overflow: auto;\n}\n\n.job-card[_ngcontent-%COMP%] {\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n display: flex;\n flex-direction: column;\n transition: transform 0.2s;\n\n &:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0,0,0,0.15);\n }\n}\n\n.job-card-header[_ngcontent-%COMP%] {\n padding: 16px;\n border-bottom: 1px solid #dee2e6;\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n .job-title {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n\n i {\n color: #0078d4;\n font-size: 20px;\n }\n\n h4 {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n }\n }\n}\n\n.job-card-body[_ngcontent-%COMP%] {\n padding: 16px;\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.job-info-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-size: 13px;\n\n .label {\n color: #6c757d;\n font-weight: 500;\n }\n\n .value {\n font-weight: 500;\n }\n}\n\n.success-rate[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n\n .rate-bar {\n flex: 1;\n height: 8px;\n background: #e9ecef;\n border-radius: 4px;\n overflow: hidden;\n\n .rate-fill {\n height: 100%;\n background: linear-gradient(90deg, #107c10 0%, #86d16f 100%);\n transition: width 0.3s;\n }\n }\n\n span {\n font-size: 12px;\n font-weight: 600;\n color: #107c10;\n }\n}\n\n.job-stats[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n padding-top: 8px;\n margin-top: 8px;\n border-top: 1px solid #dee2e6;\n\n .stat {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n font-weight: 600;\n\n &.success {\n color: #107c10;\n }\n\n &.error {\n color: #d13438;\n }\n }\n}\n\n.job-card-actions[_ngcontent-%COMP%] {\n padding: 12px 16px;\n border-top: 1px solid #dee2e6;\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n}"] });
362
+ }
363
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SchedulingJobsComponent, [{
364
+ type: Component,
365
+ args: [{ selector: 'app-scheduling-jobs', template: "<div class=\"scheduling-jobs\">\n <div class=\"jobs-header\">\n <div class=\"filters-row\">\n <div class=\"search-container\">\n <kendo-textbox\n placeholder=\"Search jobs...\"\n [value]=\"searchTerm$.value\"\n (valueChange)=\"onSearchChange($event)\">\n <ng-template kendoTextBoxPrefixTemplate>\n <i class=\"fa-solid fa-search\"></i>\n </ng-template>\n </kendo-textbox>\n </div>\n\n <kendo-dropdownlist\n [data]=\"statusOptions\"\n textField=\"text\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n [value]=\"statusFilter$.value\"\n (valueChange)=\"onStatusFilterChange($event)\">\n </kendo-dropdownlist>\n\n <kendo-dropdownlist\n [data]=\"typeOptions\"\n textField=\"text\"\n valueField=\"value\"\n [valuePrimitive]=\"true\"\n [value]=\"typeFilter$.value\"\n (valueChange)=\"onTypeFilterChange($event)\">\n </kendo-dropdownlist>\n\n <button kendoButton (click)=\"onRefresh()\" [disabled]=\"isLoading\">\n <i class=\"fa-solid fa-refresh\" [class.fa-spin]=\"isLoading\"></i>\n Refresh\n </button>\n </div>\n\n <div class=\"results-count\">\n Showing {{ filteredJobs.length }} of {{ jobs.length }} jobs\n </div>\n </div>\n\n @if (isLoading && jobs.length === 0) {\n <div class=\"loading-overlay\">\n <i class=\"fa-solid fa-spinner fa-spin fa-3x\"></i>\n <p>Loading jobs...</p>\n </div>\n }\n\n @if (!isLoading && filteredJobs.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No jobs found</p>\n </div>\n }\n\n @if (filteredJobs.length > 0) {\n <div class=\"jobs-grid\">\n @for (job of filteredJobs; track job.jobId) {\n <div class=\"job-card\">\n <div class=\"job-card-header\">\n <div class=\"job-title\">\n <i class=\"fa-solid fa-calendar-alt\"></i>\n <h4>{{ job.jobName }}</h4>\n </div>\n <kendo-chip\n [themeColor]=\"getStatusColor(job.status)\"\n [size]=\"'small'\">\n <i class=\"fa-solid\" [ngClass]=\"getStatusIcon(job.status)\"></i>\n {{ job.status }}\n </kendo-chip>\n </div>\n\n <div class=\"job-card-body\">\n <div class=\"job-info-row\">\n <span class=\"label\">Type:</span>\n <span class=\"value\">{{ job.jobType }}</span>\n </div>\n\n <div class=\"job-info-row\">\n <span class=\"label\">Total Runs:</span>\n <span class=\"value\">{{ job.totalRuns }}</span>\n </div>\n\n <div class=\"job-info-row\">\n <span class=\"label\">Success Rate:</span>\n <span class=\"value\">\n <div class=\"success-rate\">\n <div class=\"rate-bar\">\n <div class=\"rate-fill\" [style.width.%]=\"job.successRate * 100\"></div>\n </div>\n <span>{{ formatPercentage(job.successRate) }}</span>\n </div>\n </span>\n </div>\n\n <div class=\"job-info-row\">\n <span class=\"label\">Last Run:</span>\n <span class=\"value\">{{ formatDate(job.lastRunAt) }}</span>\n </div>\n\n <div class=\"job-info-row\">\n <span class=\"label\">Next Run:</span>\n <span class=\"value\">{{ formatDate(job.nextRunAt) }}</span>\n </div>\n\n <div class=\"job-stats\">\n <div class=\"stat success\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>{{ job.successCount }}</span>\n </div>\n <div class=\"stat error\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <span>{{ job.failureCount }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"job-card-actions\">\n @if (job.status === 'Active') {\n <button kendoButton [size]=\"'small'\" (click)=\"onPauseJob(job.jobId)\">\n <i class=\"fa-solid fa-pause\"></i> Pause\n </button>\n }\n @if (job.status === 'Paused') {\n <button kendoButton [size]=\"'small'\" (click)=\"onResumeJob(job.jobId)\">\n <i class=\"fa-solid fa-play\"></i> Resume\n </button>\n }\n <button kendoButton [size]=\"'small'\" (click)=\"onExecuteJob(job.jobId)\">\n <i class=\"fa-solid fa-bolt\"></i> Run Now\n </button>\n </div>\n </div>\n }\n </div>\n }\n</div>\n", styles: [".scheduling-jobs {\n height: 100%;\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.jobs-header {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.filters-row {\n display: flex;\n gap: 12px;\n align-items: center;\n\n .search-container {\n flex: 1;\n min-width: 250px;\n }\n}\n\n.results-count {\n font-size: 13px;\n color: #6c757d;\n}\n\n.loading-overlay,\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px;\n color: #6c757d;\n\n i {\n margin-bottom: 16px;\n font-size: 48px;\n opacity: 0.3;\n }\n\n p {\n margin: 0;\n font-size: 14px;\n }\n}\n\n.jobs-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));\n gap: 20px;\n overflow: auto;\n}\n\n.job-card {\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n display: flex;\n flex-direction: column;\n transition: transform 0.2s;\n\n &:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0,0,0,0.15);\n }\n}\n\n.job-card-header {\n padding: 16px;\n border-bottom: 1px solid #dee2e6;\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n .job-title {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n\n i {\n color: #0078d4;\n font-size: 20px;\n }\n\n h4 {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n }\n }\n}\n\n.job-card-body {\n padding: 16px;\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.job-info-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-size: 13px;\n\n .label {\n color: #6c757d;\n font-weight: 500;\n }\n\n .value {\n font-weight: 500;\n }\n}\n\n.success-rate {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n\n .rate-bar {\n flex: 1;\n height: 8px;\n background: #e9ecef;\n border-radius: 4px;\n overflow: hidden;\n\n .rate-fill {\n height: 100%;\n background: linear-gradient(90deg, #107c10 0%, #86d16f 100%);\n transition: width 0.3s;\n }\n }\n\n span {\n font-size: 12px;\n font-weight: 600;\n color: #107c10;\n }\n}\n\n.job-stats {\n display: flex;\n gap: 16px;\n padding-top: 8px;\n margin-top: 8px;\n border-top: 1px solid #dee2e6;\n\n .stat {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n font-weight: 600;\n\n &.success {\n color: #107c10;\n }\n\n &.error {\n color: #d13438;\n }\n }\n}\n\n.job-card-actions {\n padding: 12px 16px;\n border-top: 1px solid #dee2e6;\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n}\n"] }]
366
+ }], () => [{ type: i1.SchedulingInstrumentationService }, { type: i0.ChangeDetectorRef }], { initialState: [{
367
+ type: Input
368
+ }], stateChange: [{
369
+ type: Output
370
+ }] }); })();
371
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SchedulingJobsComponent, { className: "SchedulingJobsComponent", filePath: "src/Scheduling/components/scheduling-jobs.component.ts", lineNumber: 11 }); })();
372
+ //# sourceMappingURL=scheduling-jobs.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduling-jobs.component.js","sourceRoot":"","sources":["../../../src/Scheduling/components/scheduling-jobs.component.ts","../../../src/Scheduling/components/scheduling-jobs.component.html"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { OnInit, OnDestroy, EventEmitter, ChangeDetectorRef } from '@angular/core';
2
+ import { SchedulingInstrumentationService, SchedulingKPIs, JobExecution, UpcomingExecution } from '../services/scheduling-instrumentation.service';
3
+ import * as i0 from "@angular/core";
4
+ export declare class SchedulingMonitoringComponent implements OnInit, OnDestroy {
5
+ private schedulingService;
6
+ private cdr;
7
+ initialState: any;
8
+ stateChange: EventEmitter<any>;
9
+ kpis: SchedulingKPIs | null;
10
+ liveExecutions: JobExecution[];
11
+ upcomingExecutions: UpcomingExecution[];
12
+ isLoading: boolean;
13
+ autoRefreshInterval: number;
14
+ autoRefreshEnabled: boolean;
15
+ private destroy$;
16
+ private refreshTimer;
17
+ constructor(schedulingService: SchedulingInstrumentationService, cdr: ChangeDetectorRef);
18
+ ngOnInit(): void;
19
+ ngOnDestroy(): void;
20
+ private loadState;
21
+ private loadData;
22
+ private setupAutoRefresh;
23
+ onRefresh(): void;
24
+ toggleAutoRefresh(): void;
25
+ setRefreshInterval(interval: number): void;
26
+ getStatusClass(status: string): string;
27
+ getStatusIcon(status: string): string;
28
+ formatDuration(ms?: number): string;
29
+ formatTimeAgo(date: Date): string;
30
+ formatTimeUntil(date: Date): string;
31
+ formatCost(cost: number): string;
32
+ formatPercentage(value: number): string;
33
+ private emitStateChange;
34
+ static ɵfac: i0.ɵɵFactoryDeclaration<SchedulingMonitoringComponent, never>;
35
+ static ɵcmp: i0.ɵɵComponentDeclaration<SchedulingMonitoringComponent, "app-scheduling-monitoring", never, { "initialState": { "alias": "initialState"; "required": false; }; }, { "stateChange": "stateChange"; }, never, never, false, never>;
36
+ }
37
+ //# sourceMappingURL=scheduling-monitoring.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduling-monitoring.component.d.ts","sourceRoot":"","sources":["../../../src/Scheduling/components/scheduling-monitoring.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAiB,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAG7G,OAAO,EAAE,gCAAgC,EAAE,cAAc,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;;AAEnJ,qBAKa,6BAA8B,YAAW,MAAM,EAAE,SAAS;IAenE,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,GAAG;IAfJ,YAAY,EAAE,GAAG,CAAC;IACjB,WAAW,oBAA2B;IAEzC,IAAI,EAAE,cAAc,GAAG,IAAI,CAAQ;IACnC,cAAc,EAAE,YAAY,EAAE,CAAM;IACpC,kBAAkB,EAAE,iBAAiB,EAAE,CAAM;IAC7C,SAAS,UAAS;IAClB,mBAAmB,EAAE,MAAM,CAAS;IACpC,kBAAkB,UAAQ;IAEjC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,YAAY,CAAM;gBAGhB,iBAAiB,EAAE,gCAAgC,EACnD,GAAG,EAAE,iBAAiB;IAGhC,QAAQ,IAAI,IAAI;IAMhB,WAAW,IAAI,IAAI;IAQnB,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,QAAQ;IA6ChB,OAAO,CAAC,gBAAgB;IAQjB,SAAS,IAAI,IAAI;IAIjB,iBAAiB,IAAI,IAAI;IAWzB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAW1C,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAWtC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAWrC,cAAc,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAUnC,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;IAajC,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;IAcnC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAMhC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAI9C,OAAO,CAAC,eAAe;yCA5LZ,6BAA6B;2CAA7B,6BAA6B;CAmMzC"}