@memberjunction/ng-dashboards 2.126.1 → 2.127.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/Communication/communication-dashboard.component.d.ts +37 -0
- package/dist/Communication/communication-dashboard.component.d.ts.map +1 -0
- package/dist/Communication/communication-dashboard.component.js +225 -0
- package/dist/Communication/communication-dashboard.component.js.map +1 -0
- package/dist/Communication/communication-logs-resource.component.d.ts +26 -0
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -0
- package/dist/Communication/communication-logs-resource.component.js +244 -0
- package/dist/Communication/communication-logs-resource.component.js.map +1 -0
- package/dist/Communication/communication-monitor-resource.component.d.ts +36 -0
- package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -0
- package/dist/Communication/communication-monitor-resource.component.js +382 -0
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -0
- package/dist/Communication/communication-providers-resource.component.d.ts +27 -0
- package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -0
- package/dist/Communication/communication-providers-resource.component.js +253 -0
- package/dist/Communication/communication-providers-resource.component.js.map +1 -0
- package/dist/Communication/communication-runs-resource.component.d.ts +27 -0
- package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -0
- package/dist/Communication/communication-runs-resource.component.js +291 -0
- package/dist/Communication/communication-runs-resource.component.js.map +1 -0
- package/dist/module.d.ts +31 -26
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +33 -4
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +5 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +18 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +25 -25
|
@@ -0,0 +1,253 @@
|
|
|
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 { Component } from '@angular/core';
|
|
8
|
+
import { RegisterClass } from '@memberjunction/global';
|
|
9
|
+
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
10
|
+
import { Metadata, RunView, CompositeKey } from '@memberjunction/core';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
import * as i1 from "@memberjunction/ng-shared";
|
|
13
|
+
import * as i2 from "@angular/common";
|
|
14
|
+
function CommunicationProvidersResourceComponent_div_12_Template(rf, ctx) { if (rf & 1) {
|
|
15
|
+
i0.ɵɵelementStart(0, "div", 8);
|
|
16
|
+
i0.ɵɵelement(1, "div", 9);
|
|
17
|
+
i0.ɵɵelementStart(2, "p");
|
|
18
|
+
i0.ɵɵtext(3, "Loading providers...");
|
|
19
|
+
i0.ɵɵelementEnd()();
|
|
20
|
+
} }
|
|
21
|
+
function CommunicationProvidersResourceComponent_div_13_div_1_Template(rf, ctx) { if (rf & 1) {
|
|
22
|
+
const _r2 = i0.ɵɵgetCurrentView();
|
|
23
|
+
i0.ɵɵelementStart(0, "div", 14)(1, "div", 15)(2, "div", 16);
|
|
24
|
+
i0.ɵɵelement(3, "i");
|
|
25
|
+
i0.ɵɵelementEnd();
|
|
26
|
+
i0.ɵɵelementStart(4, "div", 17);
|
|
27
|
+
i0.ɵɵtext(5);
|
|
28
|
+
i0.ɵɵelementEnd()();
|
|
29
|
+
i0.ɵɵelementStart(6, "div", 18)(7, "h3");
|
|
30
|
+
i0.ɵɵtext(8);
|
|
31
|
+
i0.ɵɵelementEnd();
|
|
32
|
+
i0.ɵɵelementStart(9, "p");
|
|
33
|
+
i0.ɵɵtext(10);
|
|
34
|
+
i0.ɵɵelementEnd();
|
|
35
|
+
i0.ɵɵelementStart(11, "div", 19)(12, "span", 20);
|
|
36
|
+
i0.ɵɵelement(13, "i", 21);
|
|
37
|
+
i0.ɵɵtext(14, " Sending ");
|
|
38
|
+
i0.ɵɵelementEnd();
|
|
39
|
+
i0.ɵɵelementStart(15, "span", 20);
|
|
40
|
+
i0.ɵɵelement(16, "i", 22);
|
|
41
|
+
i0.ɵɵtext(17, " Receiving ");
|
|
42
|
+
i0.ɵɵelementEnd()()();
|
|
43
|
+
i0.ɵɵelementStart(18, "div", 23)(19, "button", 24);
|
|
44
|
+
i0.ɵɵlistener("click", function CommunicationProvidersResourceComponent_div_13_div_1_Template_button_click_19_listener() { const provider_r3 = i0.ɵɵrestoreView(_r2).$implicit; const ctx_r3 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r3.configureProvider(provider_r3)); });
|
|
45
|
+
i0.ɵɵelement(20, "i", 25);
|
|
46
|
+
i0.ɵɵtext(21, " Configure ");
|
|
47
|
+
i0.ɵɵelementEnd();
|
|
48
|
+
i0.ɵɵelementStart(22, "button", 26);
|
|
49
|
+
i0.ɵɵlistener("click", function CommunicationProvidersResourceComponent_div_13_div_1_Template_button_click_22_listener() { const provider_r3 = i0.ɵɵrestoreView(_r2).$implicit; const ctx_r3 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r3.viewProviderLogs(provider_r3)); });
|
|
50
|
+
i0.ɵɵtext(23, " Logs ");
|
|
51
|
+
i0.ɵɵelementEnd()()();
|
|
52
|
+
} if (rf & 2) {
|
|
53
|
+
const provider_r3 = ctx.$implicit;
|
|
54
|
+
const ctx_r3 = i0.ɵɵnextContext(2);
|
|
55
|
+
i0.ɵɵclassProp("disabled", provider_r3.Status === "Disabled");
|
|
56
|
+
i0.ɵɵadvance(3);
|
|
57
|
+
i0.ɵɵclassMap(ctx_r3.getProviderIcon(provider_r3.Name));
|
|
58
|
+
i0.ɵɵadvance();
|
|
59
|
+
i0.ɵɵclassMap(provider_r3.Status.toLowerCase());
|
|
60
|
+
i0.ɵɵadvance();
|
|
61
|
+
i0.ɵɵtextInterpolate1(" ", provider_r3.Status, " ");
|
|
62
|
+
i0.ɵɵadvance(3);
|
|
63
|
+
i0.ɵɵtextInterpolate(provider_r3.Name);
|
|
64
|
+
i0.ɵɵadvance(2);
|
|
65
|
+
i0.ɵɵtextInterpolate(provider_r3.Description || "No description provided.");
|
|
66
|
+
i0.ɵɵadvance(2);
|
|
67
|
+
i0.ɵɵclassProp("active", provider_r3.SupportsSending);
|
|
68
|
+
i0.ɵɵadvance(3);
|
|
69
|
+
i0.ɵɵclassProp("active", provider_r3.SupportsReceiving);
|
|
70
|
+
} }
|
|
71
|
+
function CommunicationProvidersResourceComponent_div_13_Template(rf, ctx) { if (rf & 1) {
|
|
72
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
73
|
+
i0.ɵɵelementStart(0, "div", 10);
|
|
74
|
+
i0.ɵɵtemplate(1, CommunicationProvidersResourceComponent_div_13_div_1_Template, 24, 13, "div", 11);
|
|
75
|
+
i0.ɵɵelementStart(2, "div", 12);
|
|
76
|
+
i0.ɵɵlistener("click", function CommunicationProvidersResourceComponent_div_13_Template_div_click_2_listener() { i0.ɵɵrestoreView(_r1); const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.addNewProvider()); });
|
|
77
|
+
i0.ɵɵelement(3, "i", 13);
|
|
78
|
+
i0.ɵɵelementStart(4, "span");
|
|
79
|
+
i0.ɵɵtext(5, "Connect New Service");
|
|
80
|
+
i0.ɵɵelementEnd()()();
|
|
81
|
+
} if (rf & 2) {
|
|
82
|
+
const ctx_r3 = i0.ɵɵnextContext();
|
|
83
|
+
i0.ɵɵadvance();
|
|
84
|
+
i0.ɵɵproperty("ngForOf", ctx_r3.providers);
|
|
85
|
+
} }
|
|
86
|
+
/**
|
|
87
|
+
* Tree-shaking prevention function
|
|
88
|
+
*/
|
|
89
|
+
export function LoadCommunicationProvidersResource() {
|
|
90
|
+
// Force inclusion in production builds
|
|
91
|
+
}
|
|
92
|
+
let CommunicationProvidersResourceComponent = class CommunicationProvidersResourceComponent extends BaseResourceComponent {
|
|
93
|
+
cdr;
|
|
94
|
+
navService;
|
|
95
|
+
isLoading = false;
|
|
96
|
+
providers = [];
|
|
97
|
+
constructor(cdr, navService) {
|
|
98
|
+
super();
|
|
99
|
+
this.cdr = cdr;
|
|
100
|
+
this.navService = navService;
|
|
101
|
+
}
|
|
102
|
+
async ngOnInit() {
|
|
103
|
+
await this.loadData();
|
|
104
|
+
this.NotifyLoadComplete();
|
|
105
|
+
}
|
|
106
|
+
ngOnDestroy() { }
|
|
107
|
+
async loadData() {
|
|
108
|
+
try {
|
|
109
|
+
this.isLoading = true;
|
|
110
|
+
this.cdr.detectChanges();
|
|
111
|
+
const rv = new RunView();
|
|
112
|
+
const result = await rv.RunView({
|
|
113
|
+
EntityName: 'Communication Providers',
|
|
114
|
+
OrderBy: 'Name ASC',
|
|
115
|
+
ResultType: 'entity_object'
|
|
116
|
+
});
|
|
117
|
+
if (result.Success) {
|
|
118
|
+
this.providers = result.Results;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
console.error('Error loading providers:', error);
|
|
123
|
+
}
|
|
124
|
+
finally {
|
|
125
|
+
this.isLoading = false;
|
|
126
|
+
this.cdr.detectChanges();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
getProviderIcon(name) {
|
|
130
|
+
const n = name.toLowerCase();
|
|
131
|
+
if (n.includes('sendgrid'))
|
|
132
|
+
return 'fa-solid fa-envelope';
|
|
133
|
+
if (n.includes('twilio'))
|
|
134
|
+
return 'fa-solid fa-comment-sms';
|
|
135
|
+
if (n.includes('aws') || n.includes('ses'))
|
|
136
|
+
return 'fa-brands fa-aws';
|
|
137
|
+
if (n.includes('slack'))
|
|
138
|
+
return 'fa-brands fa-slack';
|
|
139
|
+
if (n.includes('teams'))
|
|
140
|
+
return 'fa-solid fa-users-rectangle';
|
|
141
|
+
return 'fa-solid fa-server';
|
|
142
|
+
}
|
|
143
|
+
configureProvider(provider) {
|
|
144
|
+
const pk = new CompositeKey();
|
|
145
|
+
pk.LoadFromEntityInfoAndRecord(new Metadata().Entities.find(e => e.Name === 'Communication Providers'), provider);
|
|
146
|
+
this.navService.OpenEntityRecord('Communication Providers', pk);
|
|
147
|
+
}
|
|
148
|
+
viewProviderLogs(provider) {
|
|
149
|
+
// Navigate to logs with filter
|
|
150
|
+
// For now just open the logs tab (this would need a more complex navigation or shared state)
|
|
151
|
+
console.log('View logs for provider:', provider.Name);
|
|
152
|
+
}
|
|
153
|
+
addNewProvider() {
|
|
154
|
+
this.navService.OpenEntityRecord('Communication Providers', new CompositeKey());
|
|
155
|
+
}
|
|
156
|
+
async GetResourceDisplayName(data) {
|
|
157
|
+
return 'Providers';
|
|
158
|
+
}
|
|
159
|
+
async GetResourceIconClass(data) {
|
|
160
|
+
return 'fa-solid fa-server';
|
|
161
|
+
}
|
|
162
|
+
static ɵfac = function CommunicationProvidersResourceComponent_Factory(t) { return new (t || CommunicationProvidersResourceComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.NavigationService)); };
|
|
163
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CommunicationProvidersResourceComponent, selectors: [["mj-communication-providers-resource"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 14, vars: 2, consts: [[1, "providers-container"], [1, "providers-header"], [1, "title-area"], [1, "header-actions"], [1, "add-btn", 3, "click"], [1, "fa-solid", "fa-plus"], ["class", "loader-container", 4, "ngIf"], ["class", "providers-grid", 4, "ngIf"], [1, "loader-container"], [1, "spinner"], [1, "providers-grid"], ["class", "provider-card", 3, "disabled", 4, "ngFor", "ngForOf"], [1, "add-card", 3, "click"], [1, "fa-solid", "fa-circle-plus"], [1, "provider-card"], [1, "card-header"], [1, "provider-logo"], [1, "status-badge"], [1, "card-body"], [1, "capabilities"], [1, "cap"], [1, "fa-solid", "fa-paper-plane"], [1, "fa-solid", "fa-inbox"], [1, "card-footer"], [1, "config-btn", 3, "click"], [1, "fa-solid", "fa-gear"], [1, "view-logs-btn", 3, "click"]], template: function CommunicationProvidersResourceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
164
|
+
i0.ɵɵelementStart(0, "div", 0)(1, "header", 1)(2, "div", 2)(3, "h1");
|
|
165
|
+
i0.ɵɵtext(4, "Communication Providers");
|
|
166
|
+
i0.ɵɵelementEnd();
|
|
167
|
+
i0.ɵɵelementStart(5, "p");
|
|
168
|
+
i0.ɵɵtext(6, "Manage your messaging integrations and services");
|
|
169
|
+
i0.ɵɵelementEnd()();
|
|
170
|
+
i0.ɵɵelementStart(7, "div", 3)(8, "button", 4);
|
|
171
|
+
i0.ɵɵlistener("click", function CommunicationProvidersResourceComponent_Template_button_click_8_listener() { return ctx.addNewProvider(); });
|
|
172
|
+
i0.ɵɵelement(9, "i", 5);
|
|
173
|
+
i0.ɵɵelementStart(10, "span");
|
|
174
|
+
i0.ɵɵtext(11, "Add Provider");
|
|
175
|
+
i0.ɵɵelementEnd()()()();
|
|
176
|
+
i0.ɵɵtemplate(12, CommunicationProvidersResourceComponent_div_12_Template, 4, 0, "div", 6)(13, CommunicationProvidersResourceComponent_div_13_Template, 6, 1, "div", 7);
|
|
177
|
+
i0.ɵɵelementEnd();
|
|
178
|
+
} if (rf & 2) {
|
|
179
|
+
i0.ɵɵadvance(12);
|
|
180
|
+
i0.ɵɵproperty("ngIf", ctx.isLoading);
|
|
181
|
+
i0.ɵɵadvance();
|
|
182
|
+
i0.ɵɵproperty("ngIf", !ctx.isLoading);
|
|
183
|
+
} }, dependencies: [i2.NgForOf, i2.NgIf], styles: [".providers-container[_ngcontent-%COMP%] {\n padding: 32px;\n background-color: #f8fafc;\n min-height: 100%;\n font-family: 'Inter', system-ui, -apple-system, sans-serif;\n }\n .providers-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 32px;\n }\n .title-area[_ngcontent-%COMP%] h1[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.875rem;\n font-weight: 800;\n color: #0f172a;\n }\n .title-area[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 4px 0 0;\n color: #64748b;\n font-size: 1rem;\n }\n .add-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 24px;\n background: #3b82f6;\n border: none;\n border-radius: 10px;\n color: white;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s;\n box-shadow: 0 4px 6px -1px rgba(59, 130, 246, 0.2);\n }\n .add-btn[_ngcontent-%COMP%]:hover {\n background: #2563eb;\n transform: translateY(-1px);\n box-shadow: 0 10px 15px -3px rgba(59, 130, 246, 0.3);\n }\n\n .loader-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 100px 0;\n color: #64748b;\n }\n .spinner[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n border: 4px solid #e2e8f0;\n border-top-color: #3b82f6;\n border-radius: 50%;\n animation: _ngcontent-%COMP%_spin 1s linear infinite;\n margin-bottom: 16px;\n }\n @keyframes _ngcontent-%COMP%_spin {\n to { transform: rotate(360deg); }\n }\n\n .providers-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));\n gap: 24px;\n }\n .provider-card[_ngcontent-%COMP%] {\n background: white;\n border-radius: 20px;\n border: 1px solid #f1f5f9;\n padding: 24px;\n display: flex;\n flex-direction: column;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: 0 1px 3px rgba(0,0,0,0.05);\n }\n .provider-card[_ngcontent-%COMP%]:hover {\n transform: translateY(-4px);\n box-shadow: 0 20px 25px -5px rgba(0,0,0,0.1), 0 10px 10px -5px rgba(0,0,0,0.04);\n }\n .provider-card.disabled[_ngcontent-%COMP%] {\n opacity: 0.7;\n background: #fcfcfc;\n }\n\n .card-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 20px;\n }\n .provider-logo[_ngcontent-%COMP%] {\n width: 56px;\n height: 56px;\n background: #f8fafc;\n border-radius: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 1.75rem;\n color: #334155;\n border: 1px solid #f1f5f9;\n }\n .status-badge[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n font-weight: 700;\n padding: 4px 12px;\n border-radius: 20px;\n text-transform: uppercase;\n letter-spacing: 0.025em;\n }\n .status-badge.active[_ngcontent-%COMP%] { background: #dcfce7; color: #166534; }\n .status-badge.disabled[_ngcontent-%COMP%] { background: #f1f5f9; color: #475569; }\n\n .card-body[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 8px;\n font-size: 1.25rem;\n font-weight: 700;\n color: #0f172a;\n }\n .card-body[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 20px;\n font-size: 0.9375rem;\n color: #64748b;\n line-height: 1.5;\n height: 45px;\n overflow: hidden;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n }\n\n .capabilities[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n margin-bottom: 24px;\n }\n .cap[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n font-weight: 600;\n color: #94a3b8;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .cap.active[_ngcontent-%COMP%] {\n color: #3b82f6;\n }\n\n .card-footer[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n margin-top: auto;\n }\n .config-btn[_ngcontent-%COMP%] {\n flex: 1;\n padding: 10px;\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n color: #475569;\n font-weight: 600;\n font-size: 0.875rem;\n cursor: pointer;\n transition: all 0.2s;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .config-btn[_ngcontent-%COMP%]:hover {\n background: #f1f5f9;\n border-color: #cbd5e1;\n color: #1e293b;\n }\n .view-logs-btn[_ngcontent-%COMP%] {\n padding: 10px 16px;\n background: transparent;\n border: 1px solid transparent;\n color: #64748b;\n font-weight: 600;\n font-size: 0.875rem;\n cursor: pointer;\n }\n .view-logs-btn[_ngcontent-%COMP%]:hover {\n color: #3b82f6;\n }\n\n .add-card[_ngcontent-%COMP%] {\n border: 2px dashed #e2e8f0;\n border-radius: 20px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16px;\n color: #94a3b8;\n cursor: pointer;\n transition: all 0.2s;\n min-height: 240px;\n }\n .add-card[_ngcontent-%COMP%]:hover {\n border-color: #3b82f6;\n background: #eff6ff;\n color: #3b82f6;\n }\n .add-card[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 3rem;\n }\n .add-card[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-weight: 600;\n }"] });
|
|
184
|
+
};
|
|
185
|
+
CommunicationProvidersResourceComponent = __decorate([
|
|
186
|
+
RegisterClass(BaseResourceComponent, 'CommunicationProvidersResource')
|
|
187
|
+
], CommunicationProvidersResourceComponent);
|
|
188
|
+
export { CommunicationProvidersResourceComponent };
|
|
189
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CommunicationProvidersResourceComponent, [{
|
|
190
|
+
type: Component,
|
|
191
|
+
args: [{ selector: 'mj-communication-providers-resource', template: `
|
|
192
|
+
<div class="providers-container">
|
|
193
|
+
<header class="providers-header">
|
|
194
|
+
<div class="title-area">
|
|
195
|
+
<h1>Communication Providers</h1>
|
|
196
|
+
<p>Manage your messaging integrations and services</p>
|
|
197
|
+
</div>
|
|
198
|
+
<div class="header-actions">
|
|
199
|
+
<button class="add-btn" (click)="addNewProvider()">
|
|
200
|
+
<i class="fa-solid fa-plus"></i>
|
|
201
|
+
<span>Add Provider</span>
|
|
202
|
+
</button>
|
|
203
|
+
</div>
|
|
204
|
+
</header>
|
|
205
|
+
|
|
206
|
+
<div *ngIf="isLoading" class="loader-container">
|
|
207
|
+
<div class="spinner"></div>
|
|
208
|
+
<p>Loading providers...</p>
|
|
209
|
+
</div>
|
|
210
|
+
|
|
211
|
+
<div *ngIf="!isLoading" class="providers-grid">
|
|
212
|
+
<div *ngFor="let provider of providers" class="provider-card" [class.disabled]="provider.Status === 'Disabled'">
|
|
213
|
+
<div class="card-header">
|
|
214
|
+
<div class="provider-logo">
|
|
215
|
+
<i [class]="getProviderIcon(provider.Name)"></i>
|
|
216
|
+
</div>
|
|
217
|
+
<div class="status-badge" [class]="provider.Status.toLowerCase()">
|
|
218
|
+
{{provider.Status}}
|
|
219
|
+
</div>
|
|
220
|
+
</div>
|
|
221
|
+
<div class="card-body">
|
|
222
|
+
<h3>{{provider.Name}}</h3>
|
|
223
|
+
<p>{{provider.Description || 'No description provided.'}}</p>
|
|
224
|
+
|
|
225
|
+
<div class="capabilities">
|
|
226
|
+
<span class="cap" [class.active]="provider.SupportsSending">
|
|
227
|
+
<i class="fa-solid fa-paper-plane"></i> Sending
|
|
228
|
+
</span>
|
|
229
|
+
<span class="cap" [class.active]="provider.SupportsReceiving">
|
|
230
|
+
<i class="fa-solid fa-inbox"></i> Receiving
|
|
231
|
+
</span>
|
|
232
|
+
</div>
|
|
233
|
+
</div>
|
|
234
|
+
<div class="card-footer">
|
|
235
|
+
<button class="config-btn" (click)="configureProvider(provider)">
|
|
236
|
+
<i class="fa-solid fa-gear"></i> Configure
|
|
237
|
+
</button>
|
|
238
|
+
<button class="view-logs-btn" (click)="viewProviderLogs(provider)">
|
|
239
|
+
Logs
|
|
240
|
+
</button>
|
|
241
|
+
</div>
|
|
242
|
+
</div>
|
|
243
|
+
|
|
244
|
+
<div class="add-card" (click)="addNewProvider()">
|
|
245
|
+
<i class="fa-solid fa-circle-plus"></i>
|
|
246
|
+
<span>Connect New Service</span>
|
|
247
|
+
</div>
|
|
248
|
+
</div>
|
|
249
|
+
</div>
|
|
250
|
+
`, styles: ["\n .providers-container {\n padding: 32px;\n background-color: #f8fafc;\n min-height: 100%;\n font-family: 'Inter', system-ui, -apple-system, sans-serif;\n }\n .providers-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 32px;\n }\n .title-area h1 {\n margin: 0;\n font-size: 1.875rem;\n font-weight: 800;\n color: #0f172a;\n }\n .title-area p {\n margin: 4px 0 0;\n color: #64748b;\n font-size: 1rem;\n }\n .add-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 24px;\n background: #3b82f6;\n border: none;\n border-radius: 10px;\n color: white;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s;\n box-shadow: 0 4px 6px -1px rgba(59, 130, 246, 0.2);\n }\n .add-btn:hover {\n background: #2563eb;\n transform: translateY(-1px);\n box-shadow: 0 10px 15px -3px rgba(59, 130, 246, 0.3);\n }\n\n .loader-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 100px 0;\n color: #64748b;\n }\n .spinner {\n width: 40px;\n height: 40px;\n border: 4px solid #e2e8f0;\n border-top-color: #3b82f6;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n margin-bottom: 16px;\n }\n @keyframes spin {\n to { transform: rotate(360deg); }\n }\n\n .providers-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));\n gap: 24px;\n }\n .provider-card {\n background: white;\n border-radius: 20px;\n border: 1px solid #f1f5f9;\n padding: 24px;\n display: flex;\n flex-direction: column;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: 0 1px 3px rgba(0,0,0,0.05);\n }\n .provider-card:hover {\n transform: translateY(-4px);\n box-shadow: 0 20px 25px -5px rgba(0,0,0,0.1), 0 10px 10px -5px rgba(0,0,0,0.04);\n }\n .provider-card.disabled {\n opacity: 0.7;\n background: #fcfcfc;\n }\n\n .card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 20px;\n }\n .provider-logo {\n width: 56px;\n height: 56px;\n background: #f8fafc;\n border-radius: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 1.75rem;\n color: #334155;\n border: 1px solid #f1f5f9;\n }\n .status-badge {\n font-size: 0.75rem;\n font-weight: 700;\n padding: 4px 12px;\n border-radius: 20px;\n text-transform: uppercase;\n letter-spacing: 0.025em;\n }\n .status-badge.active { background: #dcfce7; color: #166534; }\n .status-badge.disabled { background: #f1f5f9; color: #475569; }\n\n .card-body h3 {\n margin: 0 0 8px;\n font-size: 1.25rem;\n font-weight: 700;\n color: #0f172a;\n }\n .card-body p {\n margin: 0 0 20px;\n font-size: 0.9375rem;\n color: #64748b;\n line-height: 1.5;\n height: 45px;\n overflow: hidden;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n }\n\n .capabilities {\n display: flex;\n gap: 12px;\n margin-bottom: 24px;\n }\n .cap {\n font-size: 0.75rem;\n font-weight: 600;\n color: #94a3b8;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .cap.active {\n color: #3b82f6;\n }\n\n .card-footer {\n display: flex;\n gap: 12px;\n margin-top: auto;\n }\n .config-btn {\n flex: 1;\n padding: 10px;\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n color: #475569;\n font-weight: 600;\n font-size: 0.875rem;\n cursor: pointer;\n transition: all 0.2s;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .config-btn:hover {\n background: #f1f5f9;\n border-color: #cbd5e1;\n color: #1e293b;\n }\n .view-logs-btn {\n padding: 10px 16px;\n background: transparent;\n border: 1px solid transparent;\n color: #64748b;\n font-weight: 600;\n font-size: 0.875rem;\n cursor: pointer;\n }\n .view-logs-btn:hover {\n color: #3b82f6;\n }\n\n .add-card {\n border: 2px dashed #e2e8f0;\n border-radius: 20px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16px;\n color: #94a3b8;\n cursor: pointer;\n transition: all 0.2s;\n min-height: 240px;\n }\n .add-card:hover {\n border-color: #3b82f6;\n background: #eff6ff;\n color: #3b82f6;\n }\n .add-card i {\n font-size: 3rem;\n }\n .add-card span {\n font-weight: 600;\n }\n "] }]
|
|
251
|
+
}], () => [{ type: i0.ChangeDetectorRef }, { type: i1.NavigationService }], null); })();
|
|
252
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CommunicationProvidersResourceComponent, { className: "CommunicationProvidersResourceComponent", filePath: "src/Communication/communication-providers-resource.component.ts", lineNumber: 295 }); })();
|
|
253
|
+
//# sourceMappingURL=communication-providers-resource.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"communication-providers-resource.component.js","sourceRoot":"","sources":["../../src/Communication/communication-providers-resource.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';
|
|
2
|
+
import { ResourceData } from '@memberjunction/core-entities';
|
|
3
|
+
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* Tree-shaking prevention function
|
|
7
|
+
*/
|
|
8
|
+
export declare function LoadCommunicationRunsResource(): void;
|
|
9
|
+
export declare class CommunicationRunsResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {
|
|
10
|
+
private cdr;
|
|
11
|
+
runs: any[];
|
|
12
|
+
isLoading: boolean;
|
|
13
|
+
summary: {
|
|
14
|
+
active: number;
|
|
15
|
+
completed: number;
|
|
16
|
+
successRate: number;
|
|
17
|
+
};
|
|
18
|
+
constructor(cdr: ChangeDetectorRef);
|
|
19
|
+
ngOnInit(): Promise<void>;
|
|
20
|
+
ngOnDestroy(): void;
|
|
21
|
+
loadData(): Promise<void>;
|
|
22
|
+
GetResourceDisplayName(data: ResourceData): Promise<string>;
|
|
23
|
+
GetResourceIconClass(data: ResourceData): Promise<string>;
|
|
24
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CommunicationRunsResourceComponent, never>;
|
|
25
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<CommunicationRunsResourceComponent, "mj-communication-runs-resource", never, {}, {}, never, never, false, never>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=communication-runs-resource.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"communication-runs-resource.component.d.ts","sourceRoot":"","sources":["../../src/Communication/communication-runs-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;;AAGlE;;GAEG;AACH,wBAAgB,6BAA6B,SAE5C;AAED,qBA4Pa,kCAAmC,SAAQ,qBAAsB,YAAW,MAAM,EAAE,SAAS;IAS1F,OAAO,CAAC,GAAG;IARhB,IAAI,EAAE,GAAG,EAAE,CAAM;IACjB,SAAS,UAAS;IAClB,OAAO;;;;MAIZ;gBAEkB,GAAG,EAAE,iBAAiB;IAIpC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAK/B,WAAW,IAAI,IAAI;IAEN,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAwDhC,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI3D,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;yCAhFtD,kCAAkC;2CAAlC,kCAAkC;CAmF9C"}
|
|
@@ -0,0 +1,291 @@
|
|
|
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 { Component } from '@angular/core';
|
|
8
|
+
import { RegisterClass } from '@memberjunction/global';
|
|
9
|
+
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
10
|
+
import { RunView } from '@memberjunction/core';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
import * as i1 from "@angular/common";
|
|
13
|
+
function CommunicationRunsResourceComponent_div_29_Template(rf, ctx) { if (rf & 1) {
|
|
14
|
+
i0.ɵɵelementStart(0, "div", 15);
|
|
15
|
+
i0.ɵɵelement(1, "div", 16);
|
|
16
|
+
i0.ɵɵelementEnd();
|
|
17
|
+
} }
|
|
18
|
+
function CommunicationRunsResourceComponent_tr_44_Template(rf, ctx) { if (rf & 1) {
|
|
19
|
+
i0.ɵɵelementStart(0, "tr")(1, "td")(2, "span", 17);
|
|
20
|
+
i0.ɵɵtext(3);
|
|
21
|
+
i0.ɵɵelementEnd()();
|
|
22
|
+
i0.ɵɵelementStart(4, "td")(5, "div", 18)(6, "div", 19);
|
|
23
|
+
i0.ɵɵtext(7);
|
|
24
|
+
i0.ɵɵelementEnd();
|
|
25
|
+
i0.ɵɵelementStart(8, "span");
|
|
26
|
+
i0.ɵɵtext(9);
|
|
27
|
+
i0.ɵɵelementEnd()()();
|
|
28
|
+
i0.ɵɵelementStart(10, "td");
|
|
29
|
+
i0.ɵɵtext(11);
|
|
30
|
+
i0.ɵɵpipe(12, "date");
|
|
31
|
+
i0.ɵɵelementEnd();
|
|
32
|
+
i0.ɵɵelementStart(13, "td");
|
|
33
|
+
i0.ɵɵtext(14);
|
|
34
|
+
i0.ɵɵpipe(15, "date");
|
|
35
|
+
i0.ɵɵelementEnd();
|
|
36
|
+
i0.ɵɵelementStart(16, "td", 20);
|
|
37
|
+
i0.ɵɵtext(17);
|
|
38
|
+
i0.ɵɵelementEnd()();
|
|
39
|
+
} if (rf & 2) {
|
|
40
|
+
const run_r1 = ctx.$implicit;
|
|
41
|
+
i0.ɵɵadvance(2);
|
|
42
|
+
i0.ɵɵclassMap(run_r1.Status.toLowerCase());
|
|
43
|
+
i0.ɵɵadvance();
|
|
44
|
+
i0.ɵɵtextInterpolate1(" ", run_r1.Status, " ");
|
|
45
|
+
i0.ɵɵadvance(4);
|
|
46
|
+
i0.ɵɵtextInterpolate((run_r1.User == null ? null : run_r1.User.charAt(0)) || "U");
|
|
47
|
+
i0.ɵɵadvance(2);
|
|
48
|
+
i0.ɵɵtextInterpolate(run_r1.User);
|
|
49
|
+
i0.ɵɵadvance(2);
|
|
50
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(12, 9, run_r1.StartedAt, "medium"));
|
|
51
|
+
i0.ɵɵadvance(3);
|
|
52
|
+
i0.ɵɵtextInterpolate(run_r1.EndedAt ? i0.ɵɵpipeBind2(15, 12, run_r1.EndedAt, "medium") : "-");
|
|
53
|
+
i0.ɵɵadvance(2);
|
|
54
|
+
i0.ɵɵproperty("title", run_r1.Comments);
|
|
55
|
+
i0.ɵɵadvance();
|
|
56
|
+
i0.ɵɵtextInterpolate(run_r1.Comments || "-");
|
|
57
|
+
} }
|
|
58
|
+
function CommunicationRunsResourceComponent_tr_45_Template(rf, ctx) { if (rf & 1) {
|
|
59
|
+
i0.ɵɵelementStart(0, "tr")(1, "td", 21);
|
|
60
|
+
i0.ɵɵtext(2, "No communication runs found");
|
|
61
|
+
i0.ɵɵelementEnd()();
|
|
62
|
+
} }
|
|
63
|
+
/**
|
|
64
|
+
* Tree-shaking prevention function
|
|
65
|
+
*/
|
|
66
|
+
export function LoadCommunicationRunsResource() {
|
|
67
|
+
// Force inclusion in production builds
|
|
68
|
+
}
|
|
69
|
+
let CommunicationRunsResourceComponent = class CommunicationRunsResourceComponent extends BaseResourceComponent {
|
|
70
|
+
cdr;
|
|
71
|
+
runs = [];
|
|
72
|
+
isLoading = false;
|
|
73
|
+
summary = {
|
|
74
|
+
active: 0,
|
|
75
|
+
completed: 0,
|
|
76
|
+
successRate: 0
|
|
77
|
+
};
|
|
78
|
+
constructor(cdr) {
|
|
79
|
+
super();
|
|
80
|
+
this.cdr = cdr;
|
|
81
|
+
}
|
|
82
|
+
async ngOnInit() {
|
|
83
|
+
await this.loadData();
|
|
84
|
+
this.NotifyLoadComplete();
|
|
85
|
+
}
|
|
86
|
+
ngOnDestroy() { }
|
|
87
|
+
async loadData() {
|
|
88
|
+
try {
|
|
89
|
+
this.isLoading = true;
|
|
90
|
+
this.cdr.detectChanges();
|
|
91
|
+
const rv = new RunView();
|
|
92
|
+
const yesterday = new Date();
|
|
93
|
+
yesterday.setDate(yesterday.getDate() - 1);
|
|
94
|
+
const yesterdayIso = yesterday.toISOString();
|
|
95
|
+
const [runsResult, activeResult, completedResult, failedResult] = await Promise.all([
|
|
96
|
+
rv.RunView({
|
|
97
|
+
EntityName: 'Communication Runs',
|
|
98
|
+
OrderBy: 'StartedAt DESC',
|
|
99
|
+
MaxRows: 50,
|
|
100
|
+
ResultType: 'entity_object'
|
|
101
|
+
}),
|
|
102
|
+
rv.RunView({
|
|
103
|
+
EntityName: 'Communication Runs',
|
|
104
|
+
ExtraFilter: `Status = 'In-Progress'`,
|
|
105
|
+
ResultType: 'count_only'
|
|
106
|
+
}),
|
|
107
|
+
rv.RunView({
|
|
108
|
+
EntityName: 'Communication Runs',
|
|
109
|
+
ExtraFilter: `EndedAt >= '${yesterdayIso}' AND Status = 'Complete'`,
|
|
110
|
+
ResultType: 'count_only'
|
|
111
|
+
}),
|
|
112
|
+
rv.RunView({
|
|
113
|
+
EntityName: 'Communication Runs',
|
|
114
|
+
ExtraFilter: `EndedAt >= '${yesterdayIso}' AND Status = 'Failed'`,
|
|
115
|
+
ResultType: 'count_only'
|
|
116
|
+
})
|
|
117
|
+
]);
|
|
118
|
+
if (runsResult.Success) {
|
|
119
|
+
this.runs = runsResult.Results;
|
|
120
|
+
}
|
|
121
|
+
if (activeResult.Success)
|
|
122
|
+
this.summary.active = activeResult.TotalRowCount;
|
|
123
|
+
if (completedResult.Success)
|
|
124
|
+
this.summary.completed = completedResult.TotalRowCount;
|
|
125
|
+
const totalCompleted = this.summary.completed + (failedResult.Success ? failedResult.TotalRowCount : 0);
|
|
126
|
+
if (totalCompleted > 0) {
|
|
127
|
+
this.summary.successRate = Math.round((this.summary.completed / totalCompleted) * 100);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
this.summary.successRate = 100;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
console.error('Error loading runs:', error);
|
|
135
|
+
}
|
|
136
|
+
finally {
|
|
137
|
+
this.isLoading = false;
|
|
138
|
+
this.cdr.detectChanges();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
async GetResourceDisplayName(data) {
|
|
142
|
+
return 'Runs';
|
|
143
|
+
}
|
|
144
|
+
async GetResourceIconClass(data) {
|
|
145
|
+
return 'fa-solid fa-play';
|
|
146
|
+
}
|
|
147
|
+
static ɵfac = function CommunicationRunsResourceComponent_Factory(t) { return new (t || CommunicationRunsResourceComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
148
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CommunicationRunsResourceComponent, selectors: [["mj-communication-runs-resource"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 46, vars: 6, consts: [[1, "runs-container"], [1, "runs-header"], [1, "title-area"], [1, "header-actions"], [1, "new-run-btn"], [1, "fa-solid", "fa-play"], [1, "summary-cards"], [1, "summary-card"], [1, "label"], [1, "value"], [1, "grid-wrapper"], ["class", "loading-overlay", 4, "ngIf"], [1, "custom-grid"], [4, "ngFor", "ngForOf"], [4, "ngIf"], [1, "loading-overlay"], [1, "spinner"], [1, "status-pill"], [1, "user-info"], [1, "avatar"], [1, "comments-cell", 3, "title"], ["colspan", "5", 1, "no-data"]], template: function CommunicationRunsResourceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
149
|
+
i0.ɵɵelementStart(0, "div", 0)(1, "header", 1)(2, "div", 2)(3, "h1");
|
|
150
|
+
i0.ɵɵtext(4, "Communication Runs");
|
|
151
|
+
i0.ɵɵelementEnd();
|
|
152
|
+
i0.ɵɵelementStart(5, "p");
|
|
153
|
+
i0.ɵɵtext(6, "Track and manage bulk messaging campaigns");
|
|
154
|
+
i0.ɵɵelementEnd()();
|
|
155
|
+
i0.ɵɵelementStart(7, "div", 3)(8, "button", 4);
|
|
156
|
+
i0.ɵɵelement(9, "i", 5);
|
|
157
|
+
i0.ɵɵelementStart(10, "span");
|
|
158
|
+
i0.ɵɵtext(11, "Start New Run");
|
|
159
|
+
i0.ɵɵelementEnd()()()();
|
|
160
|
+
i0.ɵɵelementStart(12, "div", 6)(13, "div", 7)(14, "span", 8);
|
|
161
|
+
i0.ɵɵtext(15, "Active Runs");
|
|
162
|
+
i0.ɵɵelementEnd();
|
|
163
|
+
i0.ɵɵelementStart(16, "span", 9);
|
|
164
|
+
i0.ɵɵtext(17);
|
|
165
|
+
i0.ɵɵelementEnd()();
|
|
166
|
+
i0.ɵɵelementStart(18, "div", 7)(19, "span", 8);
|
|
167
|
+
i0.ɵɵtext(20, "Completed (24h)");
|
|
168
|
+
i0.ɵɵelementEnd();
|
|
169
|
+
i0.ɵɵelementStart(21, "span", 9);
|
|
170
|
+
i0.ɵɵtext(22);
|
|
171
|
+
i0.ɵɵelementEnd()();
|
|
172
|
+
i0.ɵɵelementStart(23, "div", 7)(24, "span", 8);
|
|
173
|
+
i0.ɵɵtext(25, "Success Rate");
|
|
174
|
+
i0.ɵɵelementEnd();
|
|
175
|
+
i0.ɵɵelementStart(26, "span", 9);
|
|
176
|
+
i0.ɵɵtext(27);
|
|
177
|
+
i0.ɵɵelementEnd()()();
|
|
178
|
+
i0.ɵɵelementStart(28, "div", 10);
|
|
179
|
+
i0.ɵɵtemplate(29, CommunicationRunsResourceComponent_div_29_Template, 2, 0, "div", 11);
|
|
180
|
+
i0.ɵɵelementStart(30, "table", 12)(31, "thead")(32, "tr")(33, "th");
|
|
181
|
+
i0.ɵɵtext(34, "Status");
|
|
182
|
+
i0.ɵɵelementEnd();
|
|
183
|
+
i0.ɵɵelementStart(35, "th");
|
|
184
|
+
i0.ɵɵtext(36, "User");
|
|
185
|
+
i0.ɵɵelementEnd();
|
|
186
|
+
i0.ɵɵelementStart(37, "th");
|
|
187
|
+
i0.ɵɵtext(38, "Started At");
|
|
188
|
+
i0.ɵɵelementEnd();
|
|
189
|
+
i0.ɵɵelementStart(39, "th");
|
|
190
|
+
i0.ɵɵtext(40, "Ended At");
|
|
191
|
+
i0.ɵɵelementEnd();
|
|
192
|
+
i0.ɵɵelementStart(41, "th");
|
|
193
|
+
i0.ɵɵtext(42, "Comments");
|
|
194
|
+
i0.ɵɵelementEnd()()();
|
|
195
|
+
i0.ɵɵelementStart(43, "tbody");
|
|
196
|
+
i0.ɵɵtemplate(44, CommunicationRunsResourceComponent_tr_44_Template, 18, 15, "tr", 13)(45, CommunicationRunsResourceComponent_tr_45_Template, 3, 0, "tr", 14);
|
|
197
|
+
i0.ɵɵelementEnd()()()();
|
|
198
|
+
} if (rf & 2) {
|
|
199
|
+
i0.ɵɵadvance(17);
|
|
200
|
+
i0.ɵɵtextInterpolate(ctx.summary.active);
|
|
201
|
+
i0.ɵɵadvance(5);
|
|
202
|
+
i0.ɵɵtextInterpolate(ctx.summary.completed);
|
|
203
|
+
i0.ɵɵadvance(5);
|
|
204
|
+
i0.ɵɵtextInterpolate1("", ctx.summary.successRate, "%");
|
|
205
|
+
i0.ɵɵadvance(2);
|
|
206
|
+
i0.ɵɵproperty("ngIf", ctx.isLoading);
|
|
207
|
+
i0.ɵɵadvance(15);
|
|
208
|
+
i0.ɵɵproperty("ngForOf", ctx.runs);
|
|
209
|
+
i0.ɵɵadvance();
|
|
210
|
+
i0.ɵɵproperty("ngIf", ctx.runs.length === 0 && !ctx.isLoading);
|
|
211
|
+
} }, dependencies: [i1.NgForOf, i1.NgIf, i1.DatePipe], styles: [".runs-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background-color: #f8fafc;\n font-family: 'Inter', system-ui, -apple-system, sans-serif;\n }\n .runs-header[_ngcontent-%COMP%] {\n padding: 24px 32px;\n background: white;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-bottom: 1px solid #e2e8f0;\n }\n .title-area[_ngcontent-%COMP%] h1[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.5rem;\n font-weight: 800;\n color: #0f172a;\n }\n .title-area[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 4px 0 0;\n color: #64748b;\n font-size: 0.875rem;\n }\n .new-run-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: #0f172a;\n border: none;\n border-radius: 8px;\n color: white;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s;\n }\n .new-run-btn[_ngcontent-%COMP%]:hover {\n background: #1e293b;\n }\n\n .summary-cards[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n padding: 24px 32px;\n }\n .summary-card[_ngcontent-%COMP%] {\n background: white;\n padding: 16px 24px;\n border-radius: 12px;\n border: 1px solid #e2e8f0;\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n box-shadow: 0 1px 2px rgba(0,0,0,0.05);\n }\n .summary-card[_ngcontent-%COMP%] .label[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n font-weight: 600;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n .summary-card[_ngcontent-%COMP%] .value[_ngcontent-%COMP%] {\n font-size: 1.5rem;\n font-weight: 700;\n color: #0f172a;\n }\n\n .grid-wrapper[_ngcontent-%COMP%] {\n flex: 1;\n padding: 0 32px 32px;\n overflow-y: auto;\n position: relative;\n }\n\n .custom-grid[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: separate;\n border-spacing: 0;\n background: white;\n border-radius: 12px;\n overflow: hidden;\n box-shadow: 0 1px 3px rgba(0,0,0,0.05);\n border: 1px solid #e2e8f0;\n }\n .custom-grid[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n background: #f8fafc;\n padding: 16px;\n text-align: left;\n font-size: 0.75rem;\n font-weight: 700;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n border-bottom: 1px solid #e2e8f0;\n }\n .custom-grid[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 16px;\n font-size: 0.875rem;\n color: #1e293b;\n border-bottom: 1px solid #f1f5f9;\n }\n .custom-grid[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n }\n .custom-grid[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover td[_ngcontent-%COMP%] {\n background: #f8fafc;\n }\n\n .status-pill[_ngcontent-%COMP%] {\n padding: 4px 10px;\n border-radius: 20px;\n font-size: 0.75rem;\n font-weight: 700;\n text-transform: uppercase;\n }\n .status-pill.complete[_ngcontent-%COMP%] { background: #dcfce7; color: #166534; }\n .status-pill.failed[_ngcontent-%COMP%] { background: #fee2e2; color: #991b1b; }\n .status-pill.pending[_ngcontent-%COMP%] { background: #fef3c7; color: #92400e; }\n .status-pill.in-progress[_ngcontent-%COMP%] { background: #eff6ff; color: #1e40af; }\n\n .user-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n .avatar[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n background: #e2e8f0;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.75rem;\n font-weight: 700;\n color: #475569;\n }\n\n .comments-cell[_ngcontent-%COMP%] {\n max-width: 300px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: #64748b;\n }\n\n .no-data[_ngcontent-%COMP%] {\n text-align: center;\n padding: 48px !important;\n color: #94a3b8;\n font-style: italic;\n }\n\n .loading-overlay[_ngcontent-%COMP%] {\n position: absolute;\n top: 0; left: 0; right: 0; bottom: 0;\n background: rgba(255,255,255,0.7);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10;\n }\n .spinner[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border: 3px solid #e2e8f0;\n border-top-color: #0f172a;\n border-radius: 50%;\n animation: _ngcontent-%COMP%_spin 0.8s linear infinite;\n }\n @keyframes _ngcontent-%COMP%_spin { to { transform: rotate(360deg); } }"] });
|
|
212
|
+
};
|
|
213
|
+
CommunicationRunsResourceComponent = __decorate([
|
|
214
|
+
RegisterClass(BaseResourceComponent, 'CommunicationRunsResource')
|
|
215
|
+
], CommunicationRunsResourceComponent);
|
|
216
|
+
export { CommunicationRunsResourceComponent };
|
|
217
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CommunicationRunsResourceComponent, [{
|
|
218
|
+
type: Component,
|
|
219
|
+
args: [{ selector: 'mj-communication-runs-resource', template: `
|
|
220
|
+
<div class="runs-container">
|
|
221
|
+
<header class="runs-header">
|
|
222
|
+
<div class="title-area">
|
|
223
|
+
<h1>Communication Runs</h1>
|
|
224
|
+
<p>Track and manage bulk messaging campaigns</p>
|
|
225
|
+
</div>
|
|
226
|
+
<div class="header-actions">
|
|
227
|
+
<button class="new-run-btn">
|
|
228
|
+
<i class="fa-solid fa-play"></i>
|
|
229
|
+
<span>Start New Run</span>
|
|
230
|
+
</button>
|
|
231
|
+
</div>
|
|
232
|
+
</header>
|
|
233
|
+
|
|
234
|
+
<div class="summary-cards">
|
|
235
|
+
<div class="summary-card">
|
|
236
|
+
<span class="label">Active Runs</span>
|
|
237
|
+
<span class="value">{{summary.active}}</span>
|
|
238
|
+
</div>
|
|
239
|
+
<div class="summary-card">
|
|
240
|
+
<span class="label">Completed (24h)</span>
|
|
241
|
+
<span class="value">{{summary.completed}}</span>
|
|
242
|
+
</div>
|
|
243
|
+
<div class="summary-card">
|
|
244
|
+
<span class="label">Success Rate</span>
|
|
245
|
+
<span class="value">{{summary.successRate}}%</span>
|
|
246
|
+
</div>
|
|
247
|
+
</div>
|
|
248
|
+
|
|
249
|
+
<div class="grid-wrapper">
|
|
250
|
+
<div *ngIf="isLoading" class="loading-overlay">
|
|
251
|
+
<div class="spinner"></div>
|
|
252
|
+
</div>
|
|
253
|
+
|
|
254
|
+
<table class="custom-grid">
|
|
255
|
+
<thead>
|
|
256
|
+
<tr>
|
|
257
|
+
<th>Status</th>
|
|
258
|
+
<th>User</th>
|
|
259
|
+
<th>Started At</th>
|
|
260
|
+
<th>Ended At</th>
|
|
261
|
+
<th>Comments</th>
|
|
262
|
+
</tr>
|
|
263
|
+
</thead>
|
|
264
|
+
<tbody>
|
|
265
|
+
<tr *ngFor="let run of runs">
|
|
266
|
+
<td>
|
|
267
|
+
<span class="status-pill" [class]="run.Status.toLowerCase()">
|
|
268
|
+
{{run.Status}}
|
|
269
|
+
</span>
|
|
270
|
+
</td>
|
|
271
|
+
<td>
|
|
272
|
+
<div class="user-info">
|
|
273
|
+
<div class="avatar">{{run.User?.charAt(0) || 'U'}}</div>
|
|
274
|
+
<span>{{run.User}}</span>
|
|
275
|
+
</div>
|
|
276
|
+
</td>
|
|
277
|
+
<td>{{run.StartedAt | date:'medium'}}</td>
|
|
278
|
+
<td>{{run.EndedAt ? (run.EndedAt | date:'medium') : '-'}}</td>
|
|
279
|
+
<td class="comments-cell" [title]="run.Comments">{{run.Comments || '-'}}</td>
|
|
280
|
+
</tr>
|
|
281
|
+
<tr *ngIf="runs.length === 0 && !isLoading">
|
|
282
|
+
<td colspan="5" class="no-data">No communication runs found</td>
|
|
283
|
+
</tr>
|
|
284
|
+
</tbody>
|
|
285
|
+
</table>
|
|
286
|
+
</div>
|
|
287
|
+
</div>
|
|
288
|
+
`, styles: ["\n .runs-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n background-color: #f8fafc;\n font-family: 'Inter', system-ui, -apple-system, sans-serif;\n }\n .runs-header {\n padding: 24px 32px;\n background: white;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-bottom: 1px solid #e2e8f0;\n }\n .title-area h1 {\n margin: 0;\n font-size: 1.5rem;\n font-weight: 800;\n color: #0f172a;\n }\n .title-area p {\n margin: 4px 0 0;\n color: #64748b;\n font-size: 0.875rem;\n }\n .new-run-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: #0f172a;\n border: none;\n border-radius: 8px;\n color: white;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s;\n }\n .new-run-btn:hover {\n background: #1e293b;\n }\n\n .summary-cards {\n display: flex;\n gap: 24px;\n padding: 24px 32px;\n }\n .summary-card {\n background: white;\n padding: 16px 24px;\n border-radius: 12px;\n border: 1px solid #e2e8f0;\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n box-shadow: 0 1px 2px rgba(0,0,0,0.05);\n }\n .summary-card .label {\n font-size: 0.75rem;\n font-weight: 600;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n .summary-card .value {\n font-size: 1.5rem;\n font-weight: 700;\n color: #0f172a;\n }\n\n .grid-wrapper {\n flex: 1;\n padding: 0 32px 32px;\n overflow-y: auto;\n position: relative;\n }\n\n .custom-grid {\n width: 100%;\n border-collapse: separate;\n border-spacing: 0;\n background: white;\n border-radius: 12px;\n overflow: hidden;\n box-shadow: 0 1px 3px rgba(0,0,0,0.05);\n border: 1px solid #e2e8f0;\n }\n .custom-grid th {\n background: #f8fafc;\n padding: 16px;\n text-align: left;\n font-size: 0.75rem;\n font-weight: 700;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n border-bottom: 1px solid #e2e8f0;\n }\n .custom-grid td {\n padding: 16px;\n font-size: 0.875rem;\n color: #1e293b;\n border-bottom: 1px solid #f1f5f9;\n }\n .custom-grid tr:last-child td {\n border-bottom: none;\n }\n .custom-grid tr:hover td {\n background: #f8fafc;\n }\n\n .status-pill {\n padding: 4px 10px;\n border-radius: 20px;\n font-size: 0.75rem;\n font-weight: 700;\n text-transform: uppercase;\n }\n .status-pill.complete { background: #dcfce7; color: #166534; }\n .status-pill.failed { background: #fee2e2; color: #991b1b; }\n .status-pill.pending { background: #fef3c7; color: #92400e; }\n .status-pill.in-progress { background: #eff6ff; color: #1e40af; }\n\n .user-info {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n .avatar {\n width: 28px;\n height: 28px;\n background: #e2e8f0;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.75rem;\n font-weight: 700;\n color: #475569;\n }\n\n .comments-cell {\n max-width: 300px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: #64748b;\n }\n\n .no-data {\n text-align: center;\n padding: 48px !important;\n color: #94a3b8;\n font-style: italic;\n }\n\n .loading-overlay {\n position: absolute;\n top: 0; left: 0; right: 0; bottom: 0;\n background: rgba(255,255,255,0.7);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10;\n }\n .spinner {\n width: 32px;\n height: 32px;\n border: 3px solid #e2e8f0;\n border-top-color: #0f172a;\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n }\n @keyframes spin { to { transform: rotate(360deg); } }\n "] }]
|
|
289
|
+
}], () => [{ type: i0.ChangeDetectorRef }], null); })();
|
|
290
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CommunicationRunsResourceComponent, { className: "CommunicationRunsResourceComponent", filePath: "src/Communication/communication-runs-resource.component.ts", lineNumber: 266 }); })();
|
|
291
|
+
//# sourceMappingURL=communication-runs-resource.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"communication-runs-resource.component.js","sourceRoot":"","sources":["../../src/Communication/communication-runs-resource.component.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAwC,MAAM,eAAe,CAAC;AAEhF,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;;;;IA2CnC,+BAA+C;IAC3C,0BAA2B;IAC/B,iBAAM;;;IAeU,AADJ,AADJ,0BAA6B,SACrB,eAC6D;IACzD,YACJ;IACJ,AADI,iBAAO,EACN;IAGG,AADJ,AADJ,0BAAI,cACuB,cACC;IAAA,YAA8B;IAAA,iBAAM;IACxD,4BAAM;IAAA,YAAY;IAE1B,AADI,AADsB,iBAAO,EACvB,EACL;IACL,2BAAI;IAAA,aAAiC;;IAAA,iBAAK;IAC1C,2BAAI;IAAA,aAAqD;;IAAA,iBAAK;IAC9D,+BAAiD;IAAA,aAAuB;IAC5E,AAD4E,iBAAK,EAC5E;;;IAb6B,eAAkC;IAAlC,0CAAkC;IACxD,cACJ;IADI,8CACJ;IAIwB,eAA8B;IAA9B,iFAA8B;IAC5C,eAAY;IAAZ,iCAAY;IAGtB,eAAiC;IAAjC,uEAAiC;IACjC,eAAqD;IAArD,6FAAqD;IAC/B,eAAsB;IAAtB,uCAAsB;IAAC,cAAuB;IAAvB,4CAAuB;;;IAGxE,AADJ,0BAA4C,aACR;IAAA,2CAA2B;IAC/D,AAD+D,iBAAK,EAC/D;;AA1EzB;;GAEG;AACH,MAAM,UAAU,6BAA6B;IACzC,uCAAuC;AAC3C,CAAC;AA8PM,IAAM,kCAAkC,GAAxC,MAAM,kCAAmC,SAAQ,qBAAqB;IASrD;IARb,IAAI,GAAU,EAAE,CAAC;IACjB,SAAS,GAAG,KAAK,CAAC;IAClB,OAAO,GAAG;QACb,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,CAAC;QACZ,WAAW,EAAE,CAAC;KACjB,CAAC;IAEF,YAAoB,GAAsB;QACtC,KAAK,EAAE,CAAC;QADQ,QAAG,GAAH,GAAG,CAAmB;IAE1C,CAAC;IAED,KAAK,CAAC,QAAQ;QACV,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAED,WAAW,KAAW,CAAC;IAEhB,KAAK,CAAC,QAAQ;QACjB,IAAI,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YAEzB,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;YAC7B,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAC3C,MAAM,YAAY,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;YAE7C,MAAM,CAAC,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAChF,EAAE,CAAC,OAAO,CAAC;oBACP,UAAU,EAAE,oBAAoB;oBAChC,OAAO,EAAE,gBAAgB;oBACzB,OAAO,EAAE,EAAE;oBACX,UAAU,EAAE,eAAe;iBAC9B,CAAC;gBACF,EAAE,CAAC,OAAO,CAAC;oBACP,UAAU,EAAE,oBAAoB;oBAChC,WAAW,EAAE,wBAAwB;oBACrC,UAAU,EAAE,YAAY;iBAC3B,CAAC;gBACF,EAAE,CAAC,OAAO,CAAC;oBACP,UAAU,EAAE,oBAAoB;oBAChC,WAAW,EAAE,eAAe,YAAY,2BAA2B;oBACnE,UAAU,EAAE,YAAY;iBAC3B,CAAC;gBACF,EAAE,CAAC,OAAO,CAAC;oBACP,UAAU,EAAE,oBAAoB;oBAChC,WAAW,EAAE,eAAe,YAAY,yBAAyB;oBACjE,UAAU,EAAE,YAAY;iBAC3B,CAAC;aACL,CAAC,CAAC;YAEH,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACrB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC;YACnC,CAAC;YAED,IAAI,YAAY,CAAC,OAAO;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC,aAAa,CAAC;YAC3E,IAAI,eAAe,CAAC,OAAO;gBAAE,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,eAAe,CAAC,aAAa,CAAC;YAEpF,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxG,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;gBACrB,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,cAAc,CAAC,GAAG,GAAG,CAAC,CAAC;YAC3F,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,GAAG,CAAC;YACnC,CAAC;QAEL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,IAAkB;QAC3C,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,IAAkB;QACzC,OAAO,kBAAkB,CAAC;IAC9B,CAAC;4FAlFQ,kCAAkC;6DAAlC,kCAAkC;YArP/B,AADJ,AADJ,AADJ,8BAA4B,gBACI,aACA,SAChB;YAAA,kCAAkB;YAAA,iBAAK;YAC3B,yBAAG;YAAA,yDAAyC;YAChD,AADgD,iBAAI,EAC9C;YAEF,AADJ,8BAA4B,gBACI;YACxB,uBAAgC;YAChC,6BAAM;YAAA,8BAAa;YAG/B,AADI,AADI,AADuB,iBAAO,EACrB,EACP,EACD;YAID,AADJ,AADJ,+BAA2B,cACG,eACF;YAAA,4BAAW;YAAA,iBAAO;YACtC,gCAAoB;YAAA,aAAkB;YAC1C,AAD0C,iBAAO,EAC3C;YAEF,AADJ,+BAA0B,eACF;YAAA,gCAAe;YAAA,iBAAO;YAC1C,gCAAoB;YAAA,aAAqB;YAC7C,AAD6C,iBAAO,EAC9C;YAEF,AADJ,+BAA0B,eACF;YAAA,6BAAY;YAAA,iBAAO;YACvC,gCAAoB;YAAA,aAAwB;YAEpD,AADI,AADgD,iBAAO,EACjD,EACJ;YAEN,gCAA0B;YACtB,sFAA+C;YAOnC,AADJ,AADJ,AADJ,kCAA2B,aAChB,UACC,UACI;YAAA,uBAAM;YAAA,iBAAK;YACf,2BAAI;YAAA,qBAAI;YAAA,iBAAK;YACb,2BAAI;YAAA,2BAAU;YAAA,iBAAK;YACnB,2BAAI;YAAA,yBAAQ;YAAA,iBAAK;YACjB,2BAAI;YAAA,yBAAQ;YAEpB,AADI,AADgB,iBAAK,EAChB,EACD;YACR,8BAAO;YAiBH,AAhBA,sFAA6B,uEAgBe;YAM5D,AADI,AADI,AADI,iBAAQ,EACJ,EACN,EACJ;;YAlD0B,gBAAkB;YAAlB,wCAAkB;YAIlB,eAAqB;YAArB,2CAAqB;YAIrB,eAAwB;YAAxB,uDAAwB;YAK1C,eAAe;YAAf,oCAAe;YAeO,gBAAO;YAAP,kCAAO;YAgBtB,cAAqC;YAArC,8DAAqC;;;AA2LjD,kCAAkC;IA5P9C,aAAa,CAAC,qBAAqB,EAAE,2BAA2B,CAAC;GA4PrD,kCAAkC,CAmF9C;;iFAnFY,kCAAkC;cA3P9C,SAAS;2BACI,gCAAgC,YAChC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqEX;;kFAoLU,kCAAkC"}
|