@snugdesk/avaya-ipo-widget 0.2.2 → 0.2.4
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/fesm2022/snugdesk-avaya-ipo-widget.mjs +965 -353
- package/fesm2022/snugdesk-avaya-ipo-widget.mjs.map +1 -1
- package/index.d.ts +174 -43
- package/package.json +1 -1
- package/src/assets/css/intl-tel-input-dropdown.css +0 -0
- package/src/assets/images/bg-app_color_line.gif +0 -0
- package/src/assets/images/icons/sd-backspace.png +0 -0
- package/src/assets/images/icons/sd-call_failed.gif +0 -0
- package/src/assets/images/logo-avaya_small_color.svg +0 -20
- package/src/assets/images/logo-avaya_small_gray.svg +0 -16
|
@@ -21,24 +21,37 @@ import { MatButtonModule } from '@angular/material/button';
|
|
|
21
21
|
import { PhoneNumberUtil, PhoneNumberFormat } from 'google-libphonenumber';
|
|
22
22
|
|
|
23
23
|
const APP_CONFIG = {
|
|
24
|
+
// Widget build version — shown in the footer so you can confirm which build is loaded.
|
|
25
|
+
// Keep this in sync with the "version" field in projects/avaya-ipo-widget/package.json.
|
|
26
|
+
WIDGET_VERSION: '0.2.4',
|
|
24
27
|
ASSET_CDN_BASE_URL: 'https://d39qei1249155h.cloudfront.net/avaya-ipo-widget',
|
|
25
28
|
AWL_SDK_URL: 'https://d39qei1249155h.cloudfront.net/avaya-ipo-widget/assets/js/awl.min.js',
|
|
26
29
|
AGENT_STATUS_API_URL: 'https://v2xla9n0t6.execute-api.us-west-2.amazonaws.com/dev',
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
// Snugdesk backend (SnugdeskApiV1) endpoint that upserts a call as a real Interaction so it shows
|
|
31
|
+
// up in the same call history as every other channel in snugdesk-app.
|
|
32
|
+
INTERACTION_CALL_LOG_API_URL: 'https://api.snugdesk.com/avaya-ipo/call-log',
|
|
33
|
+
// Stores the full call recording in the backend and links it to the Interaction, triggering the
|
|
34
|
+
// server-side Gemini transcription/summary pipeline.
|
|
35
|
+
INTERACTION_CALL_RECORDING_API_URL: 'https://api.snugdesk.com/avaya-ipo/call-recording',
|
|
36
|
+
// How recordings reach the backend:
|
|
37
|
+
// 'complete' — one upload at call end via INTERACTION_CALL_RECORDING_API_URL (original flow)
|
|
38
|
+
// 'chunked' — stream 5s chunks over RECORDING_SOCKET_WS_URL during the call; the backend
|
|
39
|
+
// (avaya-ipo-recording-socket Lambda) stitches on every socket close, so a dead tab
|
|
40
|
+
// loses at most the last few seconds. Overridable per-embed via the
|
|
41
|
+
// [recordingUploadMode] input on the widget tag.
|
|
42
|
+
RECORDING_UPLOAD_MODE: 'complete',
|
|
43
|
+
// API Gateway WebSocket fronting the avaya-ipo-recording-socket Lambda ($connect/$disconnect/$default).
|
|
44
|
+
// From the snugdesk-backend-api stack output: AvayaIpoRecordingSocketUrl.
|
|
45
|
+
RECORDING_SOCKET_WS_URL: 'wss://lmarx4fzy3.execute-api.ap-south-1.amazonaws.com/production',
|
|
46
|
+
// Live in-call transcription (UI kept; backend integration planned — dev endpoint for now).
|
|
47
|
+
TRANSCRIPTION_WS_URL: 'ws://localhost:3100/live-stt/stream',
|
|
48
|
+
TRANSCRIPTION_LANGUAGE: 'auto',
|
|
49
|
+
TRANSCRIPTION_MODEL: 'nova-2',
|
|
35
50
|
COUNTRY_ENDPOINT: 'https://d39qei1249155h.cloudfront.net/avaya-ipo-widget/assets/metadata/countries.json',
|
|
36
51
|
PHONE_NUMBER_LOOKUP_BASE: 'https://api.snugdesk.com/phone-numbers',
|
|
37
52
|
PHONE_NUMBER_HLR_BASE: 'https://api.snugdesk.com/phone-numbers/hlr',
|
|
38
53
|
PHONE_LOOKUP_COUNTRY_CODE: '91',
|
|
39
|
-
ENTITY_SEARCH_BASE: 'https://search.snugdesk.com/entities',
|
|
40
54
|
OPENSEARCH_ENTITIES_URL: 'https://api.snugdesk.com/opensearch/entities',
|
|
41
|
-
PUSH_API_BASE: 'https://<your-api-id>.execute-api.<region>.amazonaws.com',
|
|
42
55
|
DIAL_OUT_PREFIX: '0',
|
|
43
56
|
};
|
|
44
57
|
const assetUrl = (path) => {
|
|
@@ -207,14 +220,41 @@ class AvayaIPOService {
|
|
|
207
220
|
this.ringAudio.loop = true;
|
|
208
221
|
this.ringAudio.currentTime = 0;
|
|
209
222
|
this.ringAudio.play().catch(() => {
|
|
210
|
-
//
|
|
223
|
+
// Autoplay blocked — the page has had no user gesture yet (common with auto-login).
|
|
224
|
+
// Ring as soon as the user interacts, if the call is still ringing by then.
|
|
225
|
+
console.warn('[avaya-ipo] Ring tone blocked by autoplay policy; will ring on first user gesture');
|
|
226
|
+
this.armRingRetryOnGesture();
|
|
211
227
|
});
|
|
212
228
|
}
|
|
213
229
|
catch {
|
|
214
230
|
// ignore play errors
|
|
215
231
|
}
|
|
216
232
|
}
|
|
233
|
+
ringRetryHandler = null;
|
|
234
|
+
armRingRetryOnGesture() {
|
|
235
|
+
if (this.ringRetryHandler || typeof document === 'undefined') {
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
const handler = () => {
|
|
239
|
+
this.disarmRingRetry();
|
|
240
|
+
// Only ring if the incoming call is still pending.
|
|
241
|
+
if (this.lastIncomingCall && this.ringAudio) {
|
|
242
|
+
this.ringAudio.play().catch(() => { });
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
this.ringRetryHandler = handler;
|
|
246
|
+
['click', 'keydown', 'touchstart'].forEach((type) => document.addEventListener(type, handler, { once: true, capture: true }));
|
|
247
|
+
}
|
|
248
|
+
disarmRingRetry() {
|
|
249
|
+
if (!this.ringRetryHandler || typeof document === 'undefined') {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
const handler = this.ringRetryHandler;
|
|
253
|
+
this.ringRetryHandler = null;
|
|
254
|
+
['click', 'keydown', 'touchstart'].forEach((type) => document.removeEventListener(type, handler, { capture: true }));
|
|
255
|
+
}
|
|
217
256
|
stopRingTone() {
|
|
257
|
+
this.disarmRingRetry();
|
|
218
258
|
if (!this.ringAudio) {
|
|
219
259
|
return;
|
|
220
260
|
}
|
|
@@ -246,7 +286,6 @@ class AvayaIPOService {
|
|
|
246
286
|
disableResiliency: false,
|
|
247
287
|
};
|
|
248
288
|
agentStatusApiUrl = APP_CONFIG.AGENT_STATUS_API_URL;
|
|
249
|
-
CALL_HISTORY_API_URL = APP_CONFIG.CALL_HISTORY_API_URL;
|
|
250
289
|
prewarmedStream;
|
|
251
290
|
isSafari() {
|
|
252
291
|
return /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
|
|
@@ -755,13 +794,17 @@ class AvayaIPOService {
|
|
|
755
794
|
}
|
|
756
795
|
}
|
|
757
796
|
logCall(callData) {
|
|
758
|
-
//
|
|
759
|
-
|
|
760
|
-
//
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
797
|
+
// Push the call into the Snugdesk backend as a real Interaction. The backend (avaya-ipo/call-log)
|
|
798
|
+
// resolves the entity/endpoint and creates-or-updates the Interaction keyed by callId, so the call
|
|
799
|
+
// shows up in the same call history snugdesk-app reads. Authenticated with the Snugdesk session JWT.
|
|
800
|
+
let headers = new HttpHeaders({ 'Content-Type': 'application/json' });
|
|
801
|
+
const token = (typeof sessionStorage !== 'undefined' &&
|
|
802
|
+
sessionStorage.getItem('auth_sessionToken')) ||
|
|
803
|
+
'';
|
|
804
|
+
if (token) {
|
|
805
|
+
headers = headers.set('Authorization', `Bearer ${token}`);
|
|
806
|
+
}
|
|
807
|
+
return this.http.post(APP_CONFIG.INTERACTION_CALL_LOG_API_URL, callData, {
|
|
765
808
|
headers,
|
|
766
809
|
});
|
|
767
810
|
}
|
|
@@ -1065,6 +1108,7 @@ class EntitiesSearchService {
|
|
|
1065
1108
|
http;
|
|
1066
1109
|
authenticationService;
|
|
1067
1110
|
nameCache = new Map();
|
|
1111
|
+
entityIdCache = new Map();
|
|
1068
1112
|
constructor(http, authenticationService) {
|
|
1069
1113
|
this.http = http;
|
|
1070
1114
|
this.authenticationService = authenticationService;
|
|
@@ -1088,20 +1132,7 @@ class EntitiesSearchService {
|
|
|
1088
1132
|
],
|
|
1089
1133
|
query: {
|
|
1090
1134
|
bool: {
|
|
1091
|
-
filter: [
|
|
1092
|
-
{ term: { is_blocked: false } },
|
|
1093
|
-
{ term: { tenant_id: tenantId } },
|
|
1094
|
-
{
|
|
1095
|
-
bool: {
|
|
1096
|
-
should: [
|
|
1097
|
-
{ exists: { field: 'phone_numbers' } },
|
|
1098
|
-
{ exists: { field: 'phone' } },
|
|
1099
|
-
{ exists: { field: 'normalizedPhoneNumber' } },
|
|
1100
|
-
],
|
|
1101
|
-
minimum_should_match: 1,
|
|
1102
|
-
},
|
|
1103
|
-
},
|
|
1104
|
-
],
|
|
1135
|
+
filter: [{ term: { tenant_id: tenantId } }],
|
|
1105
1136
|
},
|
|
1106
1137
|
},
|
|
1107
1138
|
};
|
|
@@ -1219,19 +1250,28 @@ class EntitiesSearchService {
|
|
|
1219
1250
|
return this.nameCache.get(key) || null;
|
|
1220
1251
|
}
|
|
1221
1252
|
async lookupNameByPhone(tenantId, phoneNumber, size = 25) {
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1253
|
+
return (await this.lookupEntityByPhone(tenantId, phoneNumber, size)).name;
|
|
1254
|
+
}
|
|
1255
|
+
/** Resolve the entity (id + name) matching a phone number; both are cached per tenant+number. */
|
|
1256
|
+
async lookupEntityByPhone(tenantId, phoneNumber, size = 25) {
|
|
1257
|
+
const key = this.cacheKey(tenantId, phoneNumber);
|
|
1258
|
+
const cachedName = this.nameCache.get(key) || null;
|
|
1259
|
+
const cachedId = this.entityIdCache.get(key) || null;
|
|
1260
|
+
if (cachedName || cachedId) {
|
|
1261
|
+
return { id: cachedId, name: cachedName };
|
|
1225
1262
|
}
|
|
1226
1263
|
const res = await this.searchByPhone(tenantId, phoneNumber, size);
|
|
1227
1264
|
const hit = res?.hits?.hits?.[0];
|
|
1228
|
-
const
|
|
1229
|
-
const
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1265
|
+
const source = hit?._source || {};
|
|
1266
|
+
const name = typeof source.name === 'string' ? source.name.trim() : '';
|
|
1267
|
+
const id = (source.id || hit?._id || '').toString().trim();
|
|
1268
|
+
if (name) {
|
|
1269
|
+
this.nameCache.set(key, name);
|
|
1233
1270
|
}
|
|
1234
|
-
|
|
1271
|
+
if (id) {
|
|
1272
|
+
this.entityIdCache.set(key, id);
|
|
1273
|
+
}
|
|
1274
|
+
return { id: id || null, name: name || null };
|
|
1235
1275
|
}
|
|
1236
1276
|
postEntities(body) {
|
|
1237
1277
|
const token = this.authenticationService.getAuthSessionToken();
|
|
@@ -1256,19 +1296,47 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImpor
|
|
|
1256
1296
|
args: [{ providedIn: 'root' }]
|
|
1257
1297
|
}], ctorParameters: () => [{ type: i1.HttpClient }, { type: AuthenticationService }] });
|
|
1258
1298
|
|
|
1299
|
+
/**
|
|
1300
|
+
* Shows the same AI call analysis as snugdesk-app's conversation view: the data is read
|
|
1301
|
+
* from the Interaction record (metadata.aiAnalysis), which the server-side pipeline fills
|
|
1302
|
+
* after the recording is uploaded — no client-side transcription is run here.
|
|
1303
|
+
*/
|
|
1259
1304
|
class CallDetailsComponent {
|
|
1260
|
-
|
|
1305
|
+
appSync;
|
|
1261
1306
|
call;
|
|
1262
1307
|
transcriptLines = [];
|
|
1263
|
-
|
|
1308
|
+
conversationSummary = [];
|
|
1309
|
+
nextActions = [];
|
|
1310
|
+
keyConcerns = [];
|
|
1311
|
+
callType = '';
|
|
1312
|
+
customerIntent = '';
|
|
1264
1313
|
customerSentiment = '';
|
|
1265
|
-
|
|
1266
|
-
|
|
1314
|
+
aiConfidenceScore = null;
|
|
1315
|
+
summaryText = '';
|
|
1316
|
+
aiProcessingStatus = '';
|
|
1317
|
+
hasAnalysis = false;
|
|
1318
|
+
isRefreshing = false;
|
|
1319
|
+
refreshError = '';
|
|
1267
1320
|
isTranscriptFullscreen = false;
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1321
|
+
GET_INTERACTION_QUERY = `query GetInteraction($id: ID!) {
|
|
1322
|
+
getInteraction(id: $id) {
|
|
1323
|
+
id
|
|
1324
|
+
metadata
|
|
1325
|
+
summary
|
|
1326
|
+
aiProcessingStatus
|
|
1327
|
+
recording { location }
|
|
1328
|
+
}
|
|
1329
|
+
}`;
|
|
1330
|
+
constructor(appSync) {
|
|
1331
|
+
this.appSync = appSync;
|
|
1332
|
+
}
|
|
1333
|
+
ngOnChanges(changes) {
|
|
1334
|
+
if (changes['call']) {
|
|
1335
|
+
this.parseAnalysisFromCall();
|
|
1336
|
+
}
|
|
1337
|
+
}
|
|
1338
|
+
get isAnalysisPending() {
|
|
1339
|
+
return ['PENDING', 'IN_PROGRESS'].includes((this.aiProcessingStatus || '').toUpperCase());
|
|
1272
1340
|
}
|
|
1273
1341
|
getBadge() {
|
|
1274
1342
|
const base = this.call?.phoneNumber?.country?.code ||
|
|
@@ -1294,36 +1362,106 @@ class CallDetailsComponent {
|
|
|
1294
1362
|
const normalized = raw.toLowerCase();
|
|
1295
1363
|
if (normalized === 'customer') {
|
|
1296
1364
|
const name = this.getDisplayName();
|
|
1297
|
-
return name && name !== 'Unknown' ? name : '
|
|
1365
|
+
return name && name !== 'Unknown' ? name : 'Customer';
|
|
1298
1366
|
}
|
|
1299
1367
|
if (normalized === 'agent') {
|
|
1300
1368
|
return 'Agent';
|
|
1301
1369
|
}
|
|
1302
1370
|
return raw || 'Unknown';
|
|
1303
1371
|
}
|
|
1304
|
-
|
|
1305
|
-
|
|
1372
|
+
getSentimentEmoji() {
|
|
1373
|
+
const value = (this.customerSentiment || '').toLowerCase();
|
|
1374
|
+
if (value.includes('angry') || value.includes('frustrat'))
|
|
1375
|
+
return '😠';
|
|
1376
|
+
if (value.includes('calm'))
|
|
1377
|
+
return '😌';
|
|
1378
|
+
if (value.includes('happy') || value.includes('positive') || value.includes('satisf'))
|
|
1379
|
+
return '😄';
|
|
1380
|
+
if (value.includes('confus'))
|
|
1381
|
+
return '😕';
|
|
1382
|
+
if (value.includes('neutral'))
|
|
1383
|
+
return '😐';
|
|
1384
|
+
if (value.includes('negative') || value.includes('upset'))
|
|
1385
|
+
return '🙁';
|
|
1386
|
+
return '';
|
|
1387
|
+
}
|
|
1388
|
+
/** Re-read the Interaction record (the AI pipeline fills metadata.aiAnalysis asynchronously). */
|
|
1389
|
+
async refreshAnalysis() {
|
|
1390
|
+
const id = this.call?.id;
|
|
1391
|
+
if (!id || this.isRefreshing) {
|
|
1306
1392
|
return;
|
|
1307
1393
|
}
|
|
1308
|
-
this.
|
|
1309
|
-
this.
|
|
1394
|
+
this.isRefreshing = true;
|
|
1395
|
+
this.refreshError = '';
|
|
1310
1396
|
try {
|
|
1311
|
-
const
|
|
1312
|
-
const
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1397
|
+
const res = await this.appSync.query(this.GET_INTERACTION_QUERY, { id });
|
|
1398
|
+
const interaction = res?.data?.getInteraction;
|
|
1399
|
+
if (interaction) {
|
|
1400
|
+
this.call = {
|
|
1401
|
+
...this.call,
|
|
1402
|
+
summary: interaction.summary || this.call?.summary || '',
|
|
1403
|
+
metadata: this.safeParse(interaction.metadata) || this.call?.metadata,
|
|
1404
|
+
aiProcessingStatus: interaction.aiProcessingStatus || '',
|
|
1405
|
+
fullCallRecordingUrl: interaction.recording?.location || this.call?.fullCallRecordingUrl || '',
|
|
1406
|
+
};
|
|
1407
|
+
this.parseAnalysisFromCall();
|
|
1408
|
+
}
|
|
1319
1409
|
}
|
|
1320
1410
|
catch (err) {
|
|
1321
|
-
console.error('[CallDetails]
|
|
1322
|
-
this.
|
|
1411
|
+
console.error('[CallDetails] Failed to refresh interaction', err);
|
|
1412
|
+
this.refreshError = 'Failed to refresh analysis. Please try again.';
|
|
1323
1413
|
}
|
|
1324
1414
|
finally {
|
|
1325
|
-
this.
|
|
1415
|
+
this.isRefreshing = false;
|
|
1416
|
+
}
|
|
1417
|
+
}
|
|
1418
|
+
toggleTranscriptFullscreen() {
|
|
1419
|
+
this.isTranscriptFullscreen = !this.isTranscriptFullscreen;
|
|
1420
|
+
}
|
|
1421
|
+
/** Pull the structured AI analysis off the interaction's metadata — same shape snugdesk-app reads. */
|
|
1422
|
+
parseAnalysisFromCall() {
|
|
1423
|
+
const metadata = this.safeParse(this.call?.metadata) || {};
|
|
1424
|
+
const ai = metadata.aiAnalysis || {};
|
|
1425
|
+
this.summaryText = this.normalizeText(this.call?.summary);
|
|
1426
|
+
this.aiProcessingStatus = (this.call?.aiProcessingStatus || '').toString();
|
|
1427
|
+
this.conversationSummary = this.normalizeBulletItems(ai.conversationSummary);
|
|
1428
|
+
this.nextActions = this.normalizeBulletItems(ai.nextAction);
|
|
1429
|
+
this.keyConcerns = this.normalizeBulletItems(ai.keyConcerns);
|
|
1430
|
+
this.callType = this.normalizeText(ai.callType);
|
|
1431
|
+
this.customerIntent = this.normalizeText(ai.customerIntent);
|
|
1432
|
+
this.customerSentiment = this.normalizeText(ai.customerSentiment);
|
|
1433
|
+
const score = Number(ai.aiConfidenceScore);
|
|
1434
|
+
this.aiConfidenceScore = Number.isFinite(score) ? Math.round(score) : null;
|
|
1435
|
+
this.transcriptLines = this.normalizeTranscript(ai.transcript);
|
|
1436
|
+
this.hasAnalysis =
|
|
1437
|
+
this.transcriptLines.length > 0 ||
|
|
1438
|
+
this.conversationSummary.length > 0 ||
|
|
1439
|
+
!!this.callType ||
|
|
1440
|
+
!!this.customerIntent ||
|
|
1441
|
+
!!this.customerSentiment ||
|
|
1442
|
+
this.keyConcerns.length > 0 ||
|
|
1443
|
+
this.nextActions.length > 0;
|
|
1444
|
+
}
|
|
1445
|
+
normalizeText(value) {
|
|
1446
|
+
if (value === null || value === undefined)
|
|
1447
|
+
return '';
|
|
1448
|
+
return value.toString().trim();
|
|
1449
|
+
}
|
|
1450
|
+
normalizeBulletItems(input) {
|
|
1451
|
+
if (!input)
|
|
1452
|
+
return [];
|
|
1453
|
+
if (Array.isArray(input)) {
|
|
1454
|
+
return input
|
|
1455
|
+
.map((item) => typeof item === 'string' ? item.trim() : this.normalizeText(item?.text ?? item))
|
|
1456
|
+
.filter(Boolean);
|
|
1457
|
+
}
|
|
1458
|
+
if (typeof input === 'string') {
|
|
1459
|
+
return input
|
|
1460
|
+
.split(/\r?\n|•/)
|
|
1461
|
+
.map((line) => line.replace(/^\s*[-*\d.)]+\s*/, '').trim())
|
|
1462
|
+
.filter(Boolean);
|
|
1326
1463
|
}
|
|
1464
|
+
return [];
|
|
1327
1465
|
}
|
|
1328
1466
|
normalizeTranscript(input) {
|
|
1329
1467
|
if (!input) {
|
|
@@ -1334,40 +1472,26 @@ class CallDetailsComponent {
|
|
|
1334
1472
|
.split(/\r?\n/)
|
|
1335
1473
|
.map((line) => line.trim())
|
|
1336
1474
|
.filter(Boolean)
|
|
1337
|
-
.map((line) =>
|
|
1338
|
-
const parsed = this.parseSpeakerLine(line);
|
|
1339
|
-
return { speaker: parsed.speaker, text: parsed.text };
|
|
1340
|
-
});
|
|
1475
|
+
.map((line) => this.parseSpeakerLine(line));
|
|
1341
1476
|
}
|
|
1342
1477
|
if (Array.isArray(input)) {
|
|
1343
1478
|
return input
|
|
1344
1479
|
.map((entry) => {
|
|
1345
1480
|
if (typeof entry === 'string') {
|
|
1346
|
-
|
|
1347
|
-
return { speaker: parsed.speaker, text: parsed.text };
|
|
1481
|
+
return this.parseSpeakerLine(entry);
|
|
1348
1482
|
}
|
|
1349
1483
|
if (entry && typeof entry === 'object') {
|
|
1350
1484
|
return {
|
|
1351
|
-
speaker: entry.speaker,
|
|
1352
|
-
text: entry.text,
|
|
1485
|
+
speaker: entry.speaker || entry.role,
|
|
1486
|
+
text: entry.text ?? entry.message ?? entry.utterance ?? entry.content,
|
|
1353
1487
|
};
|
|
1354
1488
|
}
|
|
1355
1489
|
return null;
|
|
1356
1490
|
})
|
|
1357
|
-
.filter(
|
|
1491
|
+
.filter((line) => !!line && !!line.text);
|
|
1358
1492
|
}
|
|
1359
1493
|
return [];
|
|
1360
1494
|
}
|
|
1361
|
-
getSentimentEmoji() {
|
|
1362
|
-
const value = (this.customerSentiment || '').toLowerCase();
|
|
1363
|
-
if (value.includes('positive'))
|
|
1364
|
-
return '🙂';
|
|
1365
|
-
if (value.includes('negative'))
|
|
1366
|
-
return '☹️';
|
|
1367
|
-
if (value.includes('neutral'))
|
|
1368
|
-
return '😐';
|
|
1369
|
-
return '';
|
|
1370
|
-
}
|
|
1371
1495
|
parseSpeakerLine(line) {
|
|
1372
1496
|
const match = line.match(/^\s*(agent|customer)\s*:\s*(.*)$/i);
|
|
1373
1497
|
if (match) {
|
|
@@ -1375,56 +1499,74 @@ class CallDetailsComponent {
|
|
|
1375
1499
|
}
|
|
1376
1500
|
return { text: line.trim() };
|
|
1377
1501
|
}
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
return name;
|
|
1389
|
-
}
|
|
1390
|
-
}
|
|
1391
|
-
catch {
|
|
1392
|
-
const parts = url.split('/').filter(Boolean);
|
|
1393
|
-
const name = parts[parts.length - 1];
|
|
1394
|
-
if (name) {
|
|
1395
|
-
return name;
|
|
1396
|
-
}
|
|
1397
|
-
}
|
|
1502
|
+
safeParse(value) {
|
|
1503
|
+
if (!value)
|
|
1504
|
+
return null;
|
|
1505
|
+
if (typeof value === 'object')
|
|
1506
|
+
return value;
|
|
1507
|
+
try {
|
|
1508
|
+
return JSON.parse(value);
|
|
1509
|
+
}
|
|
1510
|
+
catch {
|
|
1511
|
+
return null;
|
|
1398
1512
|
}
|
|
1399
|
-
return 'call-recording.wav';
|
|
1400
1513
|
}
|
|
1401
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: CallDetailsComponent, deps: [{ token: i1.
|
|
1402
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: CallDetailsComponent, isStandalone: false, selector: "app-call-details", inputs: { call: "call" }, ngImport: i0, template: "<div class=\"call-profile\">\n <div class=\"profile-header\">\n <div class=\"avatar\">\n <svg viewBox=\"0 0 448 512\" width=\"28\" height=\"28\" fill=\"currentColor\" aria-hidden=\"true\">\n <path\n d=\"M224 256A128 128 0 1 0 224 0a128 128 0 1 0 0 256zm-45.7 48C79.8 304 0 383.8 0 482.3C0 498.7 13.3 512 29.7 512H418.3c16.4 0 29.7-13.3 29.7-29.7C448 383.8 368.2 304 269.7 304H178.3z\" />\n </svg>\n </div>\n <div class=\"profile-info\">\n <div class=\"primary-number\">\n {{ getDisplayName() }}\n </div>\n <div class=\"secondary-info\">\n {{ getPhone() || 'Unknown' }}\n </div>\n <div class=\"meta-line\">\n <span>{{ call?.timestamp | date : 'medium' }}</span>\n <span class=\"divider\">|</span>\n @if (call?.disconnectSide === 'CALLER' && (call?.duration ?? 0) === 0) {\n <span class=\"divider\">|</span>\n <span class=\"missed-badge\">\n <svg viewBox=\"0 0 640 512\" width=\"12px\" aria-hidden=\"true\" style=\"fill: currentColor;\">\n <path d=\"M232 0c9.7 0 18.5 5.8 22.2 14.8s1.7 19.3-5.2 26.2l-39 39 58.7 58.7C282.3 152.4 300.8 160 320 160s37.7-7.6 51.3-21.3L503 7c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9L405.3 172.7C382.6 195.3 352 208 320 208s-62.6-12.7-85.3-35.3L176 113.9l-39 39c-6.9 6.9-17.2 8.9-26.2 5.2s-14.8-12.5-14.8-22.2L96 24c0-13.3 10.7-24 24-24L232 0zM51.4 489.9l-35.4-62c-9.7-16.9-8.3-38.1 5.5-51.7C72.6 325.9 178.1 256 320 256s247.4 69.9 298.5 120.2c13.9 13.6 15.2 34.8 5.5 51.7l-35.4 62c-7.4 12.9-22.7 19.1-37 14.8L438.8 470.8c-13.5-4.1-22.8-16.5-22.8-30.6l0-56.2c-62.3-20.8-129.7-20.8-192 0l0 56.2c0 14.1-9.3 26.6-22.8 30.6L88.4 504.7c-14.3 4.3-29.6-1.8-37-14.8z\" />\n </svg>\n <span>Missed Call</span>\n </span>\n }\n </div>\n </div>\n </div>\n\n <div class=\"detail-card summary-card\">\n <div class=\"detail-row\">\n <div class=\"label\">Duration</div>\n <div class=\"value\">{{ call?.duration ?? 0 }}s</div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Disconnect Side</div>\n <div class=\"value\">{{ call?.disconnectSide || 'N/A' }}</div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Country</div>\n <div class=\"value\">\n {{\n call?.phoneNumber?.country?.nameEn ||\n call?.phoneNumber?.lookupPhoneNumber?.country ||\n 'N/A'\n }}\n </div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Provider</div>\n <div class=\"value\">\n {{\n call?.phoneNumber?.lookupPhoneNumber?.['prefix-network'] ||\n call?.phoneNumber?.lookupPhoneNumber?.provider ||\n 'N/A'\n }}\n </div>\n </div>\n </div>\n\n <div class=\"detail-card transcription-card\" [class.fullscreen]=\"isTranscriptFullscreen\">\n <div class=\"detail-title\">Call Recording</div>\n <audio\n *ngIf=\"call?.fullCallRecordingUrl; else noRecording\"\n controls\n [src]=\"call?.fullCallRecordingUrl\"\n ></audio>\n <ng-template #noRecording>\n @if ((call?.duration ?? 0) > 0) {\n <button class=\"disabled-btn\" disabled>Processing</button>\n } @else {\n <button class=\"disabled-btn\" disabled>Recording not available</button>\n }\n </ng-template>\n </div>\n\n @if (!hasGeneratedTranscript) {\n <div class=\"transcription-actions outside\">\n <button class=\"action-btn\" type=\"button\" [disabled]=\"isTranscribing\" (click)=\"runTranscription()\">\n <span class=\"btn-content\">\n @if (isTranscribing) {\n <span class=\"btn-spinner\" aria-hidden=\"true\"></span>\n }\n <span>{{ isTranscribing ? 'Generating...' : 'Run AI Call Analysis' }}</span>\n </span>\n </button>\n @if (transcriptionError) {\n <div class=\"status-error\">{{ transcriptionError }}</div>\n }\n </div>\n }\n\n <div class=\"detail-card\">\n <div class=\"detail-title\">Call Summary</div>\n @if (customerSentiment) {\n <div class=\"summary-sentiment\">\n Customer Sentiment: {{ customerSentiment }}\n @if (getSentimentEmoji()) {\n <span class=\"summary-emoji\">{{ getSentimentEmoji() }}</span>\n }\n </div>\n }\n @if (summaryText) {\n <div class=\"summary-text\">{{ summaryText }}</div>\n } @else {\n <div class=\"placeholder\">No summary available.</div>\n }\n </div>\n\n <div class=\"detail-card transcription-card\" [class.fullscreen]=\"isTranscriptFullscreen\">\n <div class=\"detail-title-row\">\n <div class=\"detail-title\">AI Call Transcription</div>\n @if (transcriptLines?.length) {\n <button\n class=\"chat-thread-btn\"\n type=\"button\"\n (click)=\"toggleTranscriptFullscreen()\"\n [attr.aria-label]=\"isTranscriptFullscreen ? 'Exit full screen' : 'Enter full screen'\"\n >\n @if (isTranscriptFullscreen) {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z\"\n />\n </svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\"\n />\n </svg>\n }\n </button>\n }\n </div>\n @if (call?.fullCallRecordingUrl) {\n @if (transcriptLines?.length) {\n <div class=\"chat-thread\">\n @for (line of transcriptLines; track $index) {\n <div class=\"chat-bubble\" [class.agent]=\"(line.speaker || '').toLowerCase() === 'agent'\">\n <div class=\"chat-speaker\">{{ getTranscriptSpeaker(line) }}</div>\n <div class=\"chat-text\">{{ line.text || '' }}</div>\n </div>\n }\n </div>\n } @else if (isTranscribing) {\n <div class=\"transcription-skeleton\">\n @for (item of [1,2,3,4,5]; track item) {\n <div class=\"transcription-skeleton-line\"></div>\n }\n </div>\n } @else {\n <div class=\"placeholder\">No transcription available.</div>\n }\n\n } @else {\n <div class=\"placeholder\">No recording available for transcription.</div>\n }\n </div>\n</div>\n", styles: [":host{display:block;width:100%;box-sizing:border-box}.call-profile{display:flex;flex-direction:column;gap:14px;font-family:Open Sans,Helvetica Neue,Arial,sans-serif;color:#111}.profile-header{display:flex;gap:12px;align-items:center;padding:12px;border-radius:12px;background:#f8f8f8}.avatar{width:52px;height:52px;border-radius:14px;background:#e8edf2;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:14px;color:#1f2937}.profile-info{display:flex;flex-direction:column;gap:6px}.primary-number{font-size:16px;font-weight:800;color:#111827}.secondary-info{font-size:12px;color:#6b7280}.meta-line{display:flex;gap:6px;align-items:center;font-size:12px;color:#4b5563;flex-wrap:wrap}.meta-line .divider{color:#a0aec0}.meta-line .dir.inbound{color:#2b8a3e}.meta-line .dir.outbound{color:#1f6fb2}.meta-line .missed-badge{color:#d14343;font-weight:700}.detail-card{display:flex;flex-direction:column;gap:10px;padding:12px;border-radius:12px;background:#fff;border:1px solid #ededed}.summary-card{order:1}.transcription-card{order:2}.detail-card audio{width:100%}.disabled-btn{width:100%;border:1px solid #e0e0e0;background:#f3f3f3;color:#9a9a9a;padding:10px;border-radius:10px;font-weight:600;cursor:not-allowed}.detail-title{font-weight:800;color:#1f1f1f;font-size:14px}.detail-title-row{display:flex;align-items:center;justify-content:space-between}.transcription-actions{display:flex;flex-direction:column;gap:8px}.transcription-actions.outside{padding:0 4px}.detail-card.is-inactive{opacity:.45;filter:grayscale(.2);pointer-events:none}.action-btn{border:none;background:#111827;color:#f9fafb;padding:10px 14px;border-radius:10px;font-weight:700;cursor:pointer}.btn-content{display:inline-flex;align-items:center;gap:8px}.btn-spinner{width:14px;height:14px;border-radius:999px;border:2px solid rgba(249,250,251,.35);border-top-color:#f9fafb;animation:spin .8s linear infinite}.action-btn:hover:not(:disabled){background:#0f172a}.action-btn:disabled{background:#9ca3af;cursor:not-allowed}.status-error{color:#d14343;font-size:12px;font-weight:600}.transcription-skeleton{display:flex;flex-direction:column;gap:10px}.transcription-skeleton-line{height:10px;border-radius:999px;background:linear-gradient(90deg,#eee,#f7f7f7 45%,#eee);background-size:200% 100%;animation:skeleton-shine 1.2s ease-in-out infinite}.transcription-skeleton-line:nth-child(2){width:85%}.transcription-skeleton-line:nth-child(3){width:90%}.transcription-skeleton-line:nth-child(4){width:70%}.transcription-skeleton-line:nth-child(5){width:60%}.chat-thread{display:flex;flex-direction:column;gap:8px}.chat-thread-btn{border:1px solid #e5e7eb;background:#fff;color:#111827;padding:6px;border-radius:8px;font-weight:700;cursor:pointer;font-size:12px;width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center}.chat-thread-btn svg{width:16px;height:16px}.transcription-card.fullscreen{position:fixed;inset:0;background:#f9fafb;padding:16px;z-index:1000;animation:transcript-expand .25s ease;border-radius:0}.transcription-card.fullscreen .detail-title-row{position:sticky;top:0;background:#f9fafb;z-index:2}.transcription-card.fullscreen .chat-thread{flex:1 1 auto;overflow-y:auto;padding-bottom:8px}.detail-card{transition:transform .25s ease,opacity .25s ease}.transcription-card:not(.fullscreen){animation:transcript-collapse .2s ease}.chat-bubble{align-self:flex-start;max-width:86%;background:#f4f5f7;border-radius:12px;padding:8px 10px;border:1px solid #ebebeb}.chat-bubble.agent{align-self:flex-end;background:#e8f1ff;border-color:#c6daf7}.chat-speaker{font-size:11px;font-weight:700;color:#6b7280;text-transform:capitalize;margin-bottom:4px}.chat-text{font-size:13px;color:#1f2937;line-height:1.4}.summary-text{font-size:13px;color:#374151;line-height:1.4}.summary-sentiment{font-size:12px;font-weight:700;color:#1f2937;margin-bottom:6px}.summary-emoji{margin-left:6px;font-size:14px}.summary-grid,.qa-grid{display:grid;gap:8px}.summary-card,.qa-card{border:1px solid #ededed;border-radius:10px;padding:10px;background:#fafafa}.summary-title,.qa-title{font-weight:700;color:#1f2937;font-size:12px;margin-bottom:6px;text-transform:capitalize}.summary-text,.qa-answer{font-size:13px;color:#374151;line-height:1.4}.qa-reason{margin-top:6px;font-size:12px;color:#6b7280;line-height:1.4}.sentiment-score{color:#6b7280;font-size:12px}@keyframes transcript-expand{0%{transform:scale(.98);opacity:.6}to{transform:scale(1);opacity:1}}@keyframes transcript-collapse{0%{transform:scale(1.02);opacity:.6}to{transform:scale(1);opacity:1}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes skeleton-shine{0%{background-position:200% 0}to{background-position:-200% 0}}.placeholder{font-size:13px;color:#6b6b6b}.detail-row{display:flex;justify-content:space-between;align-items:center}.label{font-weight:700;color:#4b5563;font-size:13px}.value{color:#111;text-align:right;font-weight:600;font-size:13px}.value.mono{font-family:SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;color:#374151}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
|
|
1514
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: CallDetailsComponent, deps: [{ token: i1$1.AppSyncHelperService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1515
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: CallDetailsComponent, isStandalone: false, selector: "app-call-details", inputs: { call: "call" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"avaya-ipo-call-profile\">\n <div class=\"avaya-ipo-profile-header\">\n <div class=\"avaya-ipo-avatar\">\n <svg viewBox=\"0 0 448 512\" width=\"28\" height=\"28\" fill=\"currentColor\" aria-hidden=\"true\">\n <path\n d=\"M224 256A128 128 0 1 0 224 0a128 128 0 1 0 0 256zm-45.7 48C79.8 304 0 383.8 0 482.3C0 498.7 13.3 512 29.7 512H418.3c16.4 0 29.7-13.3 29.7-29.7C448 383.8 368.2 304 269.7 304H178.3z\" />\n </svg>\n </div>\n <div class=\"avaya-ipo-profile-info\">\n <div class=\"avaya-ipo-primary-number\">\n {{ getDisplayName() }}\n </div>\n <div class=\"avaya-ipo-secondary-info\">\n {{ getPhone() || 'Unknown' }}\n </div>\n <div class=\"avaya-ipo-meta-line\">\n <span>{{ call?.timestamp | date : 'medium' }}</span>\n <span class=\"avaya-ipo-divider\">|</span>\n @if (call?.disconnectSide === 'CALLER' && (call?.duration ?? 0) === 0) {\n <span class=\"avaya-ipo-divider\">|</span>\n <span class=\"avaya-ipo-missed-badge\">\n <svg viewBox=\"0 0 640 512\" width=\"12px\" aria-hidden=\"true\" style=\"fill: currentColor;\">\n <path d=\"M232 0c9.7 0 18.5 5.8 22.2 14.8s1.7 19.3-5.2 26.2l-39 39 58.7 58.7C282.3 152.4 300.8 160 320 160s37.7-7.6 51.3-21.3L503 7c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9L405.3 172.7C382.6 195.3 352 208 320 208s-62.6-12.7-85.3-35.3L176 113.9l-39 39c-6.9 6.9-17.2 8.9-26.2 5.2s-14.8-12.5-14.8-22.2L96 24c0-13.3 10.7-24 24-24L232 0zM51.4 489.9l-35.4-62c-9.7-16.9-8.3-38.1 5.5-51.7C72.6 325.9 178.1 256 320 256s247.4 69.9 298.5 120.2c13.9 13.6 15.2 34.8 5.5 51.7l-35.4 62c-7.4 12.9-22.7 19.1-37 14.8L438.8 470.8c-13.5-4.1-22.8-16.5-22.8-30.6l0-56.2c-62.3-20.8-129.7-20.8-192 0l0 56.2c0 14.1-9.3 26.6-22.8 30.6L88.4 504.7c-14.3 4.3-29.6-1.8-37-14.8z\" />\n </svg>\n <span>Missed Call</span>\n </span>\n }\n </div>\n </div>\n </div>\n\n <div class=\"avaya-ipo-detail-card avaya-ipo-summary-card\">\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Duration</div>\n <div class=\"avaya-ipo-value\">{{ call?.duration ?? 0 }}s</div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Disconnect Side</div>\n <div class=\"avaya-ipo-value\">{{ call?.disconnectSide || 'N/A' }}</div>\n </div>\n </div>\n\n <div class=\"avaya-ipo-detail-card\">\n <div class=\"avaya-ipo-detail-title\">Call Recording</div>\n <audio\n *ngIf=\"call?.fullCallRecordingUrl; else noRecording\"\n controls\n [src]=\"call?.fullCallRecordingUrl\"\n ></audio>\n <ng-template #noRecording>\n @if ((call?.duration ?? 0) > 0) {\n <button class=\"avaya-ipo-disabled-btn\" disabled>Processing</button>\n } @else {\n <button class=\"avaya-ipo-disabled-btn\" disabled>Recording not available</button>\n }\n </ng-template>\n </div>\n\n <!-- AI Call Analysis \u2014 read from the Interaction record (metadata.aiAnalysis), like snugdesk-app -->\n <div class=\"avaya-ipo-detail-card\">\n <div class=\"avaya-ipo-detail-title-row\">\n <div class=\"avaya-ipo-detail-title\">AI Call Analysis</div>\n <button\n class=\"avaya-ipo-chat-thread-btn\"\n type=\"button\"\n (click)=\"refreshAnalysis()\"\n [disabled]=\"isRefreshing\"\n aria-label=\"Refresh analysis\"\n title=\"Refresh analysis\"\n >\n @if (isRefreshing) {\n <span class=\"avaya-ipo-btn-spinner\" aria-hidden=\"true\"></span>\n } @else {\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\"\n d=\"M17.65 6.35A7.96 7.96 0 0 0 12 4a8 8 0 1 0 7.73 10h-2.08A6 6 0 1 1 12 6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z\" />\n </svg>\n }\n </button>\n </div>\n\n @if (hasAnalysis) {\n @if (aiConfidenceScore !== null) {\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">AI Confidence</div>\n <div class=\"avaya-ipo-value\">{{ aiConfidenceScore }}%</div>\n </div>\n }\n @if (callType) {\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Call Type</div>\n <div class=\"avaya-ipo-value\">{{ callType }}</div>\n </div>\n }\n @if (customerSentiment) {\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Sentiment</div>\n <div class=\"avaya-ipo-value\">\n {{ customerSentiment }}\n @if (getSentimentEmoji()) {\n <span class=\"avaya-ipo-summary-emoji\">{{ getSentimentEmoji() }}</span>\n }\n </div>\n </div>\n }\n @if (customerIntent) {\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Customer Intent</div>\n <div class=\"avaya-ipo-value\">{{ customerIntent }}</div>\n </div>\n }\n @if (conversationSummary.length) {\n <div class=\"avaya-ipo-analysis-section\">\n <div class=\"avaya-ipo-analysis-heading\">Conversation Summary</div>\n <ul class=\"avaya-ipo-analysis-list\">\n @for (item of conversationSummary; track $index) {\n <li>{{ item }}</li>\n }\n </ul>\n </div>\n }\n @if (keyConcerns.length) {\n <div class=\"avaya-ipo-analysis-section\">\n <div class=\"avaya-ipo-analysis-heading\">Key Concerns</div>\n <ul class=\"avaya-ipo-analysis-list\">\n @for (item of keyConcerns; track $index) {\n <li>{{ item }}</li>\n }\n </ul>\n </div>\n }\n @if (nextActions.length) {\n <div class=\"avaya-ipo-analysis-section\">\n <div class=\"avaya-ipo-analysis-heading\">Next Actions</div>\n <ul class=\"avaya-ipo-analysis-list\">\n @for (item of nextActions; track $index) {\n <li>{{ item }}</li>\n }\n </ul>\n </div>\n }\n } @else if (isAnalysisPending || isRefreshing) {\n <div class=\"avaya-ipo-transcription-skeleton\">\n @for (item of [1,2,3]; track item) {\n <div class=\"avaya-ipo-transcription-skeleton-line\"></div>\n }\n </div>\n <div class=\"avaya-ipo-placeholder\">AI analysis is being generated\u2026 use refresh to check again.</div>\n } @else if (summaryText) {\n <div class=\"avaya-ipo-summary-text\">{{ summaryText }}</div>\n } @else {\n <div class=\"avaya-ipo-placeholder\">No AI analysis available for this call yet.</div>\n }\n @if (refreshError) {\n <div class=\"avaya-ipo-status-error\">{{ refreshError }}</div>\n }\n </div>\n\n <div class=\"avaya-ipo-detail-card avaya-ipo-transcription-card\" [class.avaya-ipo-fullscreen]=\"isTranscriptFullscreen\">\n <div class=\"avaya-ipo-detail-title-row\">\n <div class=\"avaya-ipo-detail-title\">Transcript</div>\n @if (transcriptLines.length) {\n <button\n class=\"avaya-ipo-chat-thread-btn\"\n type=\"button\"\n (click)=\"toggleTranscriptFullscreen()\"\n [attr.aria-label]=\"isTranscriptFullscreen ? 'Exit full screen' : 'Enter full screen'\"\n >\n @if (isTranscriptFullscreen) {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z\"\n />\n </svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\"\n />\n </svg>\n }\n </button>\n }\n </div>\n @if (transcriptLines.length) {\n <div class=\"avaya-ipo-chat-thread\">\n @for (line of transcriptLines; track $index) {\n <div class=\"avaya-ipo-chat-bubble\" [class.avaya-ipo-agent]=\"(line.speaker || '').toLowerCase() === 'agent'\">\n <div class=\"avaya-ipo-chat-speaker\">{{ getTranscriptSpeaker(line) }}</div>\n <div class=\"avaya-ipo-chat-text\">{{ line.text || '' }}</div>\n </div>\n }\n </div>\n } @else if (isAnalysisPending || isRefreshing) {\n <div class=\"avaya-ipo-transcription-skeleton\">\n @for (item of [1,2,3,4,5]; track item) {\n <div class=\"avaya-ipo-transcription-skeleton-line\"></div>\n }\n </div>\n } @else {\n <div class=\"avaya-ipo-placeholder\">No transcript available.</div>\n }\n </div>\n</div>\n", styles: [":host{display:block;width:100%;box-sizing:border-box}.avaya-ipo-call-profile{display:flex;flex-direction:column;gap:14px;font-family:Open Sans,Helvetica Neue,Arial,sans-serif;color:var(--sd-text, #333)}.avaya-ipo-profile-header{display:flex;gap:12px;align-items:center;padding:12px;border-radius:var(--sd-radius-lg, 14px);background:var(--sd-surface-muted, #f7f7f7)}.avaya-ipo-avatar{width:52px;height:52px;border-radius:var(--sd-radius-lg, 14px);background:var(--sd-avatar, #eceff3);display:flex;align-items:center;justify-content:center;font-weight:800;font-size:14px;color:var(--sd-text, #333)}.avaya-ipo-profile-info{display:flex;flex-direction:column;gap:6px}.avaya-ipo-primary-number{font-size:16px;font-weight:800;color:var(--sd-text, #333)}.avaya-ipo-secondary-info{font-size:12px;color:var(--sd-text-muted, #5f6368)}.avaya-ipo-meta-line{display:flex;gap:6px;align-items:center;font-size:12px;color:var(--sd-text-muted, #5f6368);flex-wrap:wrap}.avaya-ipo-meta-line .avaya-ipo-divider{color:var(--sd-text-subtle, #9ca3af)}.avaya-ipo-meta-line .avaya-ipo-missed-badge{color:var(--sd-call-end, #e5484d);font-weight:700}.avaya-ipo-detail-card{display:flex;flex-direction:column;gap:10px;padding:12px;border-radius:var(--sd-radius-lg, 14px);background:var(--sd-card, #fff);border:1px solid var(--sd-border, #e3e3e3)}.avaya-ipo-detail-card audio{width:100%}.avaya-ipo-disabled-btn{width:100%;border:1px solid var(--sd-border, #e3e3e3);background:var(--sd-surface-muted, #f7f7f7);color:var(--sd-text-subtle, #9ca3af);padding:10px;border-radius:var(--sd-radius, 10px);font-weight:600;cursor:not-allowed}.avaya-ipo-detail-title{font-weight:800;color:var(--sd-text, #333);font-size:14px}.avaya-ipo-detail-title-row{display:flex;align-items:center;justify-content:space-between}.avaya-ipo-btn-spinner{width:14px;height:14px;border-radius:var(--sd-radius-pill, 999px);border:2px solid color-mix(in srgb,var(--sd-accent-contrast, #fff) 35%,transparent);border-top-color:var(--sd-accent-contrast, #fff);animation:spin .8s linear infinite}.avaya-ipo-status-error{color:var(--sd-call-end, #e5484d);font-size:12px;font-weight:600}.avaya-ipo-transcription-skeleton{display:flex;flex-direction:column;gap:10px}.avaya-ipo-transcription-skeleton-line{height:10px;border-radius:var(--sd-radius-pill, 999px);background:linear-gradient(90deg,var(--sd-surface-sunken, #e8e8e8) 0%,var(--sd-surface-muted, #f7f7f7) 45%,var(--sd-surface-sunken, #e8e8e8) 100%);background-size:200% 100%;animation:skeleton-shine 1.2s ease-in-out infinite}.avaya-ipo-transcription-skeleton-line:nth-child(2){width:85%}.avaya-ipo-transcription-skeleton-line:nth-child(3){width:90%}.avaya-ipo-transcription-skeleton-line:nth-child(4){width:70%}.avaya-ipo-transcription-skeleton-line:nth-child(5){width:60%}.avaya-ipo-chat-thread{display:flex;flex-direction:column;gap:8px}.avaya-ipo-chat-thread-btn{border:1px solid var(--sd-border, #e3e3e3);background:var(--sd-surface, #fff);color:var(--sd-text, #333);padding:6px;border-radius:var(--sd-radius-sm, 8px);font-weight:700;cursor:pointer;font-size:12px;width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;transition:background .15s ease,border-color .15s ease}.avaya-ipo-chat-thread-btn:hover{background:var(--sd-surface-muted, #f7f7f7)}.avaya-ipo-chat-thread-btn svg{width:16px;height:16px}.avaya-ipo-transcription-card.avaya-ipo-fullscreen{position:absolute;inset:0;background:var(--sd-surface, #fff);padding:16px;z-index:1000;animation:transcript-expand .25s ease;border-radius:0}:host-context(.avaya-ipo-mode-standalone) .avaya-ipo-transcription-card.avaya-ipo-fullscreen{position:fixed}.avaya-ipo-transcription-card.avaya-ipo-fullscreen .avaya-ipo-detail-title-row{position:sticky;top:0;background:var(--sd-surface, #fff);z-index:2}.avaya-ipo-transcription-card.avaya-ipo-fullscreen .avaya-ipo-chat-thread{flex:1 1 auto;overflow-y:auto;padding-bottom:8px}.avaya-ipo-detail-card{transition:transform .25s ease,opacity .25s ease}.avaya-ipo-transcription-card:not(.avaya-ipo-fullscreen){animation:transcript-collapse .2s ease}.avaya-ipo-chat-bubble{align-self:flex-start;max-width:86%;background:var(--sd-surface-muted, #f7f7f7);border-radius:var(--sd-radius, 10px);padding:8px 10px;border:1px solid var(--sd-border, #e3e3e3)}.avaya-ipo-chat-bubble.avaya-ipo-agent{align-self:flex-end;background:var(--sd-accent-soft, #fff1ea);border-color:color-mix(in srgb,var(--sd-accent, #ff6633) 35%,transparent)}.avaya-ipo-chat-speaker{font-size:11px;font-weight:700;color:var(--sd-text-muted, #5f6368);text-transform:capitalize;margin-bottom:4px}.avaya-ipo-chat-text,.avaya-ipo-summary-text{font-size:13px;color:var(--sd-text, #333);line-height:1.4}.avaya-ipo-summary-emoji{margin-left:6px;font-size:14px}.avaya-ipo-summary-card{border:1px solid var(--sd-border, #e3e3e3);border-radius:var(--sd-radius, 10px);padding:10px;background:var(--sd-surface-muted, #f7f7f7)}@keyframes transcript-expand{0%{transform:scale(.98);opacity:.6}to{transform:scale(1);opacity:1}}@keyframes transcript-collapse{0%{transform:scale(1.02);opacity:.6}to{transform:scale(1);opacity:1}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes skeleton-shine{0%{background-position:200% 0}to{background-position:-200% 0}}.avaya-ipo-placeholder{font-size:13px;color:var(--sd-text-muted, #5f6368)}.avaya-ipo-analysis-section{margin-top:10px}.avaya-ipo-analysis-heading{font-size:12px;font-weight:700;color:var(--sd-text-muted, #5f6368);text-transform:uppercase;letter-spacing:.4px;margin-bottom:4px}.avaya-ipo-analysis-list{margin:0;padding-left:18px;display:flex;flex-direction:column;gap:4px}.avaya-ipo-analysis-list li{font-size:13px;color:var(--sd-text, #333);line-height:1.45}.avaya-ipo-detail-row{display:flex;justify-content:space-between;align-items:center}.avaya-ipo-label{font-weight:700;color:var(--sd-text-muted, #5f6368);font-size:13px}.avaya-ipo-value{color:var(--sd-text, #333);text-align:right;font-weight:600;font-size:13px}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
|
|
1403
1516
|
}
|
|
1404
1517
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: CallDetailsComponent, decorators: [{
|
|
1405
1518
|
type: Component,
|
|
1406
|
-
args: [{ selector: 'app-call-details', standalone: false, template: "<div class=\"call-profile\">\n <div class=\"profile-header\">\n <div class=\"avatar\">\n <svg viewBox=\"0 0 448 512\" width=\"28\" height=\"28\" fill=\"currentColor\" aria-hidden=\"true\">\n <path\n d=\"M224 256A128 128 0 1 0 224 0a128 128 0 1 0 0 256zm-45.7 48C79.8 304 0 383.8 0 482.3C0 498.7 13.3 512 29.7 512H418.3c16.4 0 29.7-13.3 29.7-29.7C448 383.8 368.2 304 269.7 304H178.3z\" />\n </svg>\n </div>\n <div class=\"profile-info\">\n <div class=\"primary-number\">\n {{ getDisplayName() }}\n </div>\n <div class=\"secondary-info\">\n {{ getPhone() || 'Unknown' }}\n </div>\n <div class=\"meta-line\">\n <span>{{ call?.timestamp | date : 'medium' }}</span>\n <span class=\"divider\">|</span>\n @if (call?.disconnectSide === 'CALLER' && (call?.duration ?? 0) === 0) {\n <span class=\"divider\">|</span>\n <span class=\"missed-badge\">\n <svg viewBox=\"0 0 640 512\" width=\"12px\" aria-hidden=\"true\" style=\"fill: currentColor;\">\n <path d=\"M232 0c9.7 0 18.5 5.8 22.2 14.8s1.7 19.3-5.2 26.2l-39 39 58.7 58.7C282.3 152.4 300.8 160 320 160s37.7-7.6 51.3-21.3L503 7c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9L405.3 172.7C382.6 195.3 352 208 320 208s-62.6-12.7-85.3-35.3L176 113.9l-39 39c-6.9 6.9-17.2 8.9-26.2 5.2s-14.8-12.5-14.8-22.2L96 24c0-13.3 10.7-24 24-24L232 0zM51.4 489.9l-35.4-62c-9.7-16.9-8.3-38.1 5.5-51.7C72.6 325.9 178.1 256 320 256s247.4 69.9 298.5 120.2c13.9 13.6 15.2 34.8 5.5 51.7l-35.4 62c-7.4 12.9-22.7 19.1-37 14.8L438.8 470.8c-13.5-4.1-22.8-16.5-22.8-30.6l0-56.2c-62.3-20.8-129.7-20.8-192 0l0 56.2c0 14.1-9.3 26.6-22.8 30.6L88.4 504.7c-14.3 4.3-29.6-1.8-37-14.8z\" />\n </svg>\n <span>Missed Call</span>\n </span>\n }\n </div>\n </div>\n </div>\n\n <div class=\"detail-card summary-card\">\n <div class=\"detail-row\">\n <div class=\"label\">Duration</div>\n <div class=\"value\">{{ call?.duration ?? 0 }}s</div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Disconnect Side</div>\n <div class=\"value\">{{ call?.disconnectSide || 'N/A' }}</div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Country</div>\n <div class=\"value\">\n {{\n call?.phoneNumber?.country?.nameEn ||\n call?.phoneNumber?.lookupPhoneNumber?.country ||\n 'N/A'\n }}\n </div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Provider</div>\n <div class=\"value\">\n {{\n call?.phoneNumber?.lookupPhoneNumber?.['prefix-network'] ||\n call?.phoneNumber?.lookupPhoneNumber?.provider ||\n 'N/A'\n }}\n </div>\n </div>\n </div>\n\n <div class=\"detail-card transcription-card\" [class.fullscreen]=\"isTranscriptFullscreen\">\n <div class=\"detail-title\">Call Recording</div>\n <audio\n *ngIf=\"call?.fullCallRecordingUrl; else noRecording\"\n controls\n [src]=\"call?.fullCallRecordingUrl\"\n ></audio>\n <ng-template #noRecording>\n @if ((call?.duration ?? 0) > 0) {\n <button class=\"disabled-btn\" disabled>Processing</button>\n } @else {\n <button class=\"disabled-btn\" disabled>Recording not available</button>\n }\n </ng-template>\n </div>\n\n @if (!hasGeneratedTranscript) {\n <div class=\"transcription-actions outside\">\n <button class=\"action-btn\" type=\"button\" [disabled]=\"isTranscribing\" (click)=\"runTranscription()\">\n <span class=\"btn-content\">\n @if (isTranscribing) {\n <span class=\"btn-spinner\" aria-hidden=\"true\"></span>\n }\n <span>{{ isTranscribing ? 'Generating...' : 'Run AI Call Analysis' }}</span>\n </span>\n </button>\n @if (transcriptionError) {\n <div class=\"status-error\">{{ transcriptionError }}</div>\n }\n </div>\n }\n\n <div class=\"detail-card\">\n <div class=\"detail-title\">Call Summary</div>\n @if (customerSentiment) {\n <div class=\"summary-sentiment\">\n Customer Sentiment: {{ customerSentiment }}\n @if (getSentimentEmoji()) {\n <span class=\"summary-emoji\">{{ getSentimentEmoji() }}</span>\n }\n </div>\n }\n @if (summaryText) {\n <div class=\"summary-text\">{{ summaryText }}</div>\n } @else {\n <div class=\"placeholder\">No summary available.</div>\n }\n </div>\n\n <div class=\"detail-card transcription-card\" [class.fullscreen]=\"isTranscriptFullscreen\">\n <div class=\"detail-title-row\">\n <div class=\"detail-title\">AI Call Transcription</div>\n @if (transcriptLines?.length) {\n <button\n class=\"chat-thread-btn\"\n type=\"button\"\n (click)=\"toggleTranscriptFullscreen()\"\n [attr.aria-label]=\"isTranscriptFullscreen ? 'Exit full screen' : 'Enter full screen'\"\n >\n @if (isTranscriptFullscreen) {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z\"\n />\n </svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\"\n />\n </svg>\n }\n </button>\n }\n </div>\n @if (call?.fullCallRecordingUrl) {\n @if (transcriptLines?.length) {\n <div class=\"chat-thread\">\n @for (line of transcriptLines; track $index) {\n <div class=\"chat-bubble\" [class.agent]=\"(line.speaker || '').toLowerCase() === 'agent'\">\n <div class=\"chat-speaker\">{{ getTranscriptSpeaker(line) }}</div>\n <div class=\"chat-text\">{{ line.text || '' }}</div>\n </div>\n }\n </div>\n } @else if (isTranscribing) {\n <div class=\"transcription-skeleton\">\n @for (item of [1,2,3,4,5]; track item) {\n <div class=\"transcription-skeleton-line\"></div>\n }\n </div>\n } @else {\n <div class=\"placeholder\">No transcription available.</div>\n }\n\n } @else {\n <div class=\"placeholder\">No recording available for transcription.</div>\n }\n </div>\n</div>\n", styles: [":host{display:block;width:100%;box-sizing:border-box}.call-profile{display:flex;flex-direction:column;gap:14px;font-family:Open Sans,Helvetica Neue,Arial,sans-serif;color:#111}.profile-header{display:flex;gap:12px;align-items:center;padding:12px;border-radius:12px;background:#f8f8f8}.avatar{width:52px;height:52px;border-radius:14px;background:#e8edf2;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:14px;color:#1f2937}.profile-info{display:flex;flex-direction:column;gap:6px}.primary-number{font-size:16px;font-weight:800;color:#111827}.secondary-info{font-size:12px;color:#6b7280}.meta-line{display:flex;gap:6px;align-items:center;font-size:12px;color:#4b5563;flex-wrap:wrap}.meta-line .divider{color:#a0aec0}.meta-line .dir.inbound{color:#2b8a3e}.meta-line .dir.outbound{color:#1f6fb2}.meta-line .missed-badge{color:#d14343;font-weight:700}.detail-card{display:flex;flex-direction:column;gap:10px;padding:12px;border-radius:12px;background:#fff;border:1px solid #ededed}.summary-card{order:1}.transcription-card{order:2}.detail-card audio{width:100%}.disabled-btn{width:100%;border:1px solid #e0e0e0;background:#f3f3f3;color:#9a9a9a;padding:10px;border-radius:10px;font-weight:600;cursor:not-allowed}.detail-title{font-weight:800;color:#1f1f1f;font-size:14px}.detail-title-row{display:flex;align-items:center;justify-content:space-between}.transcription-actions{display:flex;flex-direction:column;gap:8px}.transcription-actions.outside{padding:0 4px}.detail-card.is-inactive{opacity:.45;filter:grayscale(.2);pointer-events:none}.action-btn{border:none;background:#111827;color:#f9fafb;padding:10px 14px;border-radius:10px;font-weight:700;cursor:pointer}.btn-content{display:inline-flex;align-items:center;gap:8px}.btn-spinner{width:14px;height:14px;border-radius:999px;border:2px solid rgba(249,250,251,.35);border-top-color:#f9fafb;animation:spin .8s linear infinite}.action-btn:hover:not(:disabled){background:#0f172a}.action-btn:disabled{background:#9ca3af;cursor:not-allowed}.status-error{color:#d14343;font-size:12px;font-weight:600}.transcription-skeleton{display:flex;flex-direction:column;gap:10px}.transcription-skeleton-line{height:10px;border-radius:999px;background:linear-gradient(90deg,#eee,#f7f7f7 45%,#eee);background-size:200% 100%;animation:skeleton-shine 1.2s ease-in-out infinite}.transcription-skeleton-line:nth-child(2){width:85%}.transcription-skeleton-line:nth-child(3){width:90%}.transcription-skeleton-line:nth-child(4){width:70%}.transcription-skeleton-line:nth-child(5){width:60%}.chat-thread{display:flex;flex-direction:column;gap:8px}.chat-thread-btn{border:1px solid #e5e7eb;background:#fff;color:#111827;padding:6px;border-radius:8px;font-weight:700;cursor:pointer;font-size:12px;width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center}.chat-thread-btn svg{width:16px;height:16px}.transcription-card.fullscreen{position:fixed;inset:0;background:#f9fafb;padding:16px;z-index:1000;animation:transcript-expand .25s ease;border-radius:0}.transcription-card.fullscreen .detail-title-row{position:sticky;top:0;background:#f9fafb;z-index:2}.transcription-card.fullscreen .chat-thread{flex:1 1 auto;overflow-y:auto;padding-bottom:8px}.detail-card{transition:transform .25s ease,opacity .25s ease}.transcription-card:not(.fullscreen){animation:transcript-collapse .2s ease}.chat-bubble{align-self:flex-start;max-width:86%;background:#f4f5f7;border-radius:12px;padding:8px 10px;border:1px solid #ebebeb}.chat-bubble.agent{align-self:flex-end;background:#e8f1ff;border-color:#c6daf7}.chat-speaker{font-size:11px;font-weight:700;color:#6b7280;text-transform:capitalize;margin-bottom:4px}.chat-text{font-size:13px;color:#1f2937;line-height:1.4}.summary-text{font-size:13px;color:#374151;line-height:1.4}.summary-sentiment{font-size:12px;font-weight:700;color:#1f2937;margin-bottom:6px}.summary-emoji{margin-left:6px;font-size:14px}.summary-grid,.qa-grid{display:grid;gap:8px}.summary-card,.qa-card{border:1px solid #ededed;border-radius:10px;padding:10px;background:#fafafa}.summary-title,.qa-title{font-weight:700;color:#1f2937;font-size:12px;margin-bottom:6px;text-transform:capitalize}.summary-text,.qa-answer{font-size:13px;color:#374151;line-height:1.4}.qa-reason{margin-top:6px;font-size:12px;color:#6b7280;line-height:1.4}.sentiment-score{color:#6b7280;font-size:12px}@keyframes transcript-expand{0%{transform:scale(.98);opacity:.6}to{transform:scale(1);opacity:1}}@keyframes transcript-collapse{0%{transform:scale(1.02);opacity:.6}to{transform:scale(1);opacity:1}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes skeleton-shine{0%{background-position:200% 0}to{background-position:-200% 0}}.placeholder{font-size:13px;color:#6b6b6b}.detail-row{display:flex;justify-content:space-between;align-items:center}.label{font-weight:700;color:#4b5563;font-size:13px}.value{color:#111;text-align:right;font-weight:600;font-size:13px}.value.mono{font-family:SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;color:#374151}\n"] }]
|
|
1407
|
-
}], ctorParameters: () => [{ type: i1.
|
|
1519
|
+
args: [{ selector: 'app-call-details', standalone: false, template: "<div class=\"avaya-ipo-call-profile\">\n <div class=\"avaya-ipo-profile-header\">\n <div class=\"avaya-ipo-avatar\">\n <svg viewBox=\"0 0 448 512\" width=\"28\" height=\"28\" fill=\"currentColor\" aria-hidden=\"true\">\n <path\n d=\"M224 256A128 128 0 1 0 224 0a128 128 0 1 0 0 256zm-45.7 48C79.8 304 0 383.8 0 482.3C0 498.7 13.3 512 29.7 512H418.3c16.4 0 29.7-13.3 29.7-29.7C448 383.8 368.2 304 269.7 304H178.3z\" />\n </svg>\n </div>\n <div class=\"avaya-ipo-profile-info\">\n <div class=\"avaya-ipo-primary-number\">\n {{ getDisplayName() }}\n </div>\n <div class=\"avaya-ipo-secondary-info\">\n {{ getPhone() || 'Unknown' }}\n </div>\n <div class=\"avaya-ipo-meta-line\">\n <span>{{ call?.timestamp | date : 'medium' }}</span>\n <span class=\"avaya-ipo-divider\">|</span>\n @if (call?.disconnectSide === 'CALLER' && (call?.duration ?? 0) === 0) {\n <span class=\"avaya-ipo-divider\">|</span>\n <span class=\"avaya-ipo-missed-badge\">\n <svg viewBox=\"0 0 640 512\" width=\"12px\" aria-hidden=\"true\" style=\"fill: currentColor;\">\n <path d=\"M232 0c9.7 0 18.5 5.8 22.2 14.8s1.7 19.3-5.2 26.2l-39 39 58.7 58.7C282.3 152.4 300.8 160 320 160s37.7-7.6 51.3-21.3L503 7c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9L405.3 172.7C382.6 195.3 352 208 320 208s-62.6-12.7-85.3-35.3L176 113.9l-39 39c-6.9 6.9-17.2 8.9-26.2 5.2s-14.8-12.5-14.8-22.2L96 24c0-13.3 10.7-24 24-24L232 0zM51.4 489.9l-35.4-62c-9.7-16.9-8.3-38.1 5.5-51.7C72.6 325.9 178.1 256 320 256s247.4 69.9 298.5 120.2c13.9 13.6 15.2 34.8 5.5 51.7l-35.4 62c-7.4 12.9-22.7 19.1-37 14.8L438.8 470.8c-13.5-4.1-22.8-16.5-22.8-30.6l0-56.2c-62.3-20.8-129.7-20.8-192 0l0 56.2c0 14.1-9.3 26.6-22.8 30.6L88.4 504.7c-14.3 4.3-29.6-1.8-37-14.8z\" />\n </svg>\n <span>Missed Call</span>\n </span>\n }\n </div>\n </div>\n </div>\n\n <div class=\"avaya-ipo-detail-card avaya-ipo-summary-card\">\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Duration</div>\n <div class=\"avaya-ipo-value\">{{ call?.duration ?? 0 }}s</div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Disconnect Side</div>\n <div class=\"avaya-ipo-value\">{{ call?.disconnectSide || 'N/A' }}</div>\n </div>\n </div>\n\n <div class=\"avaya-ipo-detail-card\">\n <div class=\"avaya-ipo-detail-title\">Call Recording</div>\n <audio\n *ngIf=\"call?.fullCallRecordingUrl; else noRecording\"\n controls\n [src]=\"call?.fullCallRecordingUrl\"\n ></audio>\n <ng-template #noRecording>\n @if ((call?.duration ?? 0) > 0) {\n <button class=\"avaya-ipo-disabled-btn\" disabled>Processing</button>\n } @else {\n <button class=\"avaya-ipo-disabled-btn\" disabled>Recording not available</button>\n }\n </ng-template>\n </div>\n\n <!-- AI Call Analysis \u2014 read from the Interaction record (metadata.aiAnalysis), like snugdesk-app -->\n <div class=\"avaya-ipo-detail-card\">\n <div class=\"avaya-ipo-detail-title-row\">\n <div class=\"avaya-ipo-detail-title\">AI Call Analysis</div>\n <button\n class=\"avaya-ipo-chat-thread-btn\"\n type=\"button\"\n (click)=\"refreshAnalysis()\"\n [disabled]=\"isRefreshing\"\n aria-label=\"Refresh analysis\"\n title=\"Refresh analysis\"\n >\n @if (isRefreshing) {\n <span class=\"avaya-ipo-btn-spinner\" aria-hidden=\"true\"></span>\n } @else {\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\"\n d=\"M17.65 6.35A7.96 7.96 0 0 0 12 4a8 8 0 1 0 7.73 10h-2.08A6 6 0 1 1 12 6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z\" />\n </svg>\n }\n </button>\n </div>\n\n @if (hasAnalysis) {\n @if (aiConfidenceScore !== null) {\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">AI Confidence</div>\n <div class=\"avaya-ipo-value\">{{ aiConfidenceScore }}%</div>\n </div>\n }\n @if (callType) {\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Call Type</div>\n <div class=\"avaya-ipo-value\">{{ callType }}</div>\n </div>\n }\n @if (customerSentiment) {\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Sentiment</div>\n <div class=\"avaya-ipo-value\">\n {{ customerSentiment }}\n @if (getSentimentEmoji()) {\n <span class=\"avaya-ipo-summary-emoji\">{{ getSentimentEmoji() }}</span>\n }\n </div>\n </div>\n }\n @if (customerIntent) {\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Customer Intent</div>\n <div class=\"avaya-ipo-value\">{{ customerIntent }}</div>\n </div>\n }\n @if (conversationSummary.length) {\n <div class=\"avaya-ipo-analysis-section\">\n <div class=\"avaya-ipo-analysis-heading\">Conversation Summary</div>\n <ul class=\"avaya-ipo-analysis-list\">\n @for (item of conversationSummary; track $index) {\n <li>{{ item }}</li>\n }\n </ul>\n </div>\n }\n @if (keyConcerns.length) {\n <div class=\"avaya-ipo-analysis-section\">\n <div class=\"avaya-ipo-analysis-heading\">Key Concerns</div>\n <ul class=\"avaya-ipo-analysis-list\">\n @for (item of keyConcerns; track $index) {\n <li>{{ item }}</li>\n }\n </ul>\n </div>\n }\n @if (nextActions.length) {\n <div class=\"avaya-ipo-analysis-section\">\n <div class=\"avaya-ipo-analysis-heading\">Next Actions</div>\n <ul class=\"avaya-ipo-analysis-list\">\n @for (item of nextActions; track $index) {\n <li>{{ item }}</li>\n }\n </ul>\n </div>\n }\n } @else if (isAnalysisPending || isRefreshing) {\n <div class=\"avaya-ipo-transcription-skeleton\">\n @for (item of [1,2,3]; track item) {\n <div class=\"avaya-ipo-transcription-skeleton-line\"></div>\n }\n </div>\n <div class=\"avaya-ipo-placeholder\">AI analysis is being generated\u2026 use refresh to check again.</div>\n } @else if (summaryText) {\n <div class=\"avaya-ipo-summary-text\">{{ summaryText }}</div>\n } @else {\n <div class=\"avaya-ipo-placeholder\">No AI analysis available for this call yet.</div>\n }\n @if (refreshError) {\n <div class=\"avaya-ipo-status-error\">{{ refreshError }}</div>\n }\n </div>\n\n <div class=\"avaya-ipo-detail-card avaya-ipo-transcription-card\" [class.avaya-ipo-fullscreen]=\"isTranscriptFullscreen\">\n <div class=\"avaya-ipo-detail-title-row\">\n <div class=\"avaya-ipo-detail-title\">Transcript</div>\n @if (transcriptLines.length) {\n <button\n class=\"avaya-ipo-chat-thread-btn\"\n type=\"button\"\n (click)=\"toggleTranscriptFullscreen()\"\n [attr.aria-label]=\"isTranscriptFullscreen ? 'Exit full screen' : 'Enter full screen'\"\n >\n @if (isTranscriptFullscreen) {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z\"\n />\n </svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\"\n />\n </svg>\n }\n </button>\n }\n </div>\n @if (transcriptLines.length) {\n <div class=\"avaya-ipo-chat-thread\">\n @for (line of transcriptLines; track $index) {\n <div class=\"avaya-ipo-chat-bubble\" [class.avaya-ipo-agent]=\"(line.speaker || '').toLowerCase() === 'agent'\">\n <div class=\"avaya-ipo-chat-speaker\">{{ getTranscriptSpeaker(line) }}</div>\n <div class=\"avaya-ipo-chat-text\">{{ line.text || '' }}</div>\n </div>\n }\n </div>\n } @else if (isAnalysisPending || isRefreshing) {\n <div class=\"avaya-ipo-transcription-skeleton\">\n @for (item of [1,2,3,4,5]; track item) {\n <div class=\"avaya-ipo-transcription-skeleton-line\"></div>\n }\n </div>\n } @else {\n <div class=\"avaya-ipo-placeholder\">No transcript available.</div>\n }\n </div>\n</div>\n", styles: [":host{display:block;width:100%;box-sizing:border-box}.avaya-ipo-call-profile{display:flex;flex-direction:column;gap:14px;font-family:Open Sans,Helvetica Neue,Arial,sans-serif;color:var(--sd-text, #333)}.avaya-ipo-profile-header{display:flex;gap:12px;align-items:center;padding:12px;border-radius:var(--sd-radius-lg, 14px);background:var(--sd-surface-muted, #f7f7f7)}.avaya-ipo-avatar{width:52px;height:52px;border-radius:var(--sd-radius-lg, 14px);background:var(--sd-avatar, #eceff3);display:flex;align-items:center;justify-content:center;font-weight:800;font-size:14px;color:var(--sd-text, #333)}.avaya-ipo-profile-info{display:flex;flex-direction:column;gap:6px}.avaya-ipo-primary-number{font-size:16px;font-weight:800;color:var(--sd-text, #333)}.avaya-ipo-secondary-info{font-size:12px;color:var(--sd-text-muted, #5f6368)}.avaya-ipo-meta-line{display:flex;gap:6px;align-items:center;font-size:12px;color:var(--sd-text-muted, #5f6368);flex-wrap:wrap}.avaya-ipo-meta-line .avaya-ipo-divider{color:var(--sd-text-subtle, #9ca3af)}.avaya-ipo-meta-line .avaya-ipo-missed-badge{color:var(--sd-call-end, #e5484d);font-weight:700}.avaya-ipo-detail-card{display:flex;flex-direction:column;gap:10px;padding:12px;border-radius:var(--sd-radius-lg, 14px);background:var(--sd-card, #fff);border:1px solid var(--sd-border, #e3e3e3)}.avaya-ipo-detail-card audio{width:100%}.avaya-ipo-disabled-btn{width:100%;border:1px solid var(--sd-border, #e3e3e3);background:var(--sd-surface-muted, #f7f7f7);color:var(--sd-text-subtle, #9ca3af);padding:10px;border-radius:var(--sd-radius, 10px);font-weight:600;cursor:not-allowed}.avaya-ipo-detail-title{font-weight:800;color:var(--sd-text, #333);font-size:14px}.avaya-ipo-detail-title-row{display:flex;align-items:center;justify-content:space-between}.avaya-ipo-btn-spinner{width:14px;height:14px;border-radius:var(--sd-radius-pill, 999px);border:2px solid color-mix(in srgb,var(--sd-accent-contrast, #fff) 35%,transparent);border-top-color:var(--sd-accent-contrast, #fff);animation:spin .8s linear infinite}.avaya-ipo-status-error{color:var(--sd-call-end, #e5484d);font-size:12px;font-weight:600}.avaya-ipo-transcription-skeleton{display:flex;flex-direction:column;gap:10px}.avaya-ipo-transcription-skeleton-line{height:10px;border-radius:var(--sd-radius-pill, 999px);background:linear-gradient(90deg,var(--sd-surface-sunken, #e8e8e8) 0%,var(--sd-surface-muted, #f7f7f7) 45%,var(--sd-surface-sunken, #e8e8e8) 100%);background-size:200% 100%;animation:skeleton-shine 1.2s ease-in-out infinite}.avaya-ipo-transcription-skeleton-line:nth-child(2){width:85%}.avaya-ipo-transcription-skeleton-line:nth-child(3){width:90%}.avaya-ipo-transcription-skeleton-line:nth-child(4){width:70%}.avaya-ipo-transcription-skeleton-line:nth-child(5){width:60%}.avaya-ipo-chat-thread{display:flex;flex-direction:column;gap:8px}.avaya-ipo-chat-thread-btn{border:1px solid var(--sd-border, #e3e3e3);background:var(--sd-surface, #fff);color:var(--sd-text, #333);padding:6px;border-radius:var(--sd-radius-sm, 8px);font-weight:700;cursor:pointer;font-size:12px;width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;transition:background .15s ease,border-color .15s ease}.avaya-ipo-chat-thread-btn:hover{background:var(--sd-surface-muted, #f7f7f7)}.avaya-ipo-chat-thread-btn svg{width:16px;height:16px}.avaya-ipo-transcription-card.avaya-ipo-fullscreen{position:absolute;inset:0;background:var(--sd-surface, #fff);padding:16px;z-index:1000;animation:transcript-expand .25s ease;border-radius:0}:host-context(.avaya-ipo-mode-standalone) .avaya-ipo-transcription-card.avaya-ipo-fullscreen{position:fixed}.avaya-ipo-transcription-card.avaya-ipo-fullscreen .avaya-ipo-detail-title-row{position:sticky;top:0;background:var(--sd-surface, #fff);z-index:2}.avaya-ipo-transcription-card.avaya-ipo-fullscreen .avaya-ipo-chat-thread{flex:1 1 auto;overflow-y:auto;padding-bottom:8px}.avaya-ipo-detail-card{transition:transform .25s ease,opacity .25s ease}.avaya-ipo-transcription-card:not(.avaya-ipo-fullscreen){animation:transcript-collapse .2s ease}.avaya-ipo-chat-bubble{align-self:flex-start;max-width:86%;background:var(--sd-surface-muted, #f7f7f7);border-radius:var(--sd-radius, 10px);padding:8px 10px;border:1px solid var(--sd-border, #e3e3e3)}.avaya-ipo-chat-bubble.avaya-ipo-agent{align-self:flex-end;background:var(--sd-accent-soft, #fff1ea);border-color:color-mix(in srgb,var(--sd-accent, #ff6633) 35%,transparent)}.avaya-ipo-chat-speaker{font-size:11px;font-weight:700;color:var(--sd-text-muted, #5f6368);text-transform:capitalize;margin-bottom:4px}.avaya-ipo-chat-text,.avaya-ipo-summary-text{font-size:13px;color:var(--sd-text, #333);line-height:1.4}.avaya-ipo-summary-emoji{margin-left:6px;font-size:14px}.avaya-ipo-summary-card{border:1px solid var(--sd-border, #e3e3e3);border-radius:var(--sd-radius, 10px);padding:10px;background:var(--sd-surface-muted, #f7f7f7)}@keyframes transcript-expand{0%{transform:scale(.98);opacity:.6}to{transform:scale(1);opacity:1}}@keyframes transcript-collapse{0%{transform:scale(1.02);opacity:.6}to{transform:scale(1);opacity:1}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes skeleton-shine{0%{background-position:200% 0}to{background-position:-200% 0}}.avaya-ipo-placeholder{font-size:13px;color:var(--sd-text-muted, #5f6368)}.avaya-ipo-analysis-section{margin-top:10px}.avaya-ipo-analysis-heading{font-size:12px;font-weight:700;color:var(--sd-text-muted, #5f6368);text-transform:uppercase;letter-spacing:.4px;margin-bottom:4px}.avaya-ipo-analysis-list{margin:0;padding-left:18px;display:flex;flex-direction:column;gap:4px}.avaya-ipo-analysis-list li{font-size:13px;color:var(--sd-text, #333);line-height:1.45}.avaya-ipo-detail-row{display:flex;justify-content:space-between;align-items:center}.avaya-ipo-label{font-weight:700;color:var(--sd-text-muted, #5f6368);font-size:13px}.avaya-ipo-value{color:var(--sd-text, #333);text-align:right;font-weight:600;font-size:13px}\n"] }]
|
|
1520
|
+
}], ctorParameters: () => [{ type: i1$1.AppSyncHelperService }], propDecorators: { call: [{
|
|
1408
1521
|
type: Input
|
|
1409
1522
|
}] } });
|
|
1410
1523
|
|
|
1411
1524
|
class CallHistoryComponent {
|
|
1412
|
-
http;
|
|
1413
1525
|
cdr;
|
|
1526
|
+
appSync;
|
|
1527
|
+
auth;
|
|
1414
1528
|
mode = 'dial';
|
|
1415
1529
|
tenantId;
|
|
1416
1530
|
agentId;
|
|
1417
1531
|
makeCallEv = new EventEmitter();
|
|
1418
1532
|
transferEv = new EventEmitter();
|
|
1419
|
-
CALL_HISTORY_API_URL = APP_CONFIG.CALL_HISTORY_API_URL;
|
|
1420
1533
|
showHistoryLoader = false;
|
|
1421
1534
|
callHistory = [];
|
|
1422
1535
|
searchTerm = '';
|
|
1423
1536
|
recentCallactiveTab = 'recentCall';
|
|
1424
1537
|
selectedCall = null;
|
|
1425
|
-
|
|
1426
|
-
|
|
1538
|
+
// Same backend call history snugdesk-app reads: all PHONE-channel Interactions for the tenant,
|
|
1539
|
+
// newest first. Run through @snugdesk/core's AppSync helper so auth + Amplify config are shared
|
|
1540
|
+
// with the host app.
|
|
1541
|
+
LIST_PHONE_INTERACTIONS_QUERY = `query ListPhoneInteractionsByTenantId($tenantId: ID!, $sortDirection: ModelSortDirection, $filter: ModelInteractionFilterInput, $limit: Int, $nextToken: String) {
|
|
1542
|
+
listInteractionsByTenantId(tenantId: $tenantId, sortDirection: $sortDirection, filter: $filter, limit: $limit, nextToken: $nextToken) {
|
|
1543
|
+
items {
|
|
1544
|
+
id
|
|
1545
|
+
providerInteractionId
|
|
1546
|
+
channel
|
|
1547
|
+
provider
|
|
1548
|
+
direction
|
|
1549
|
+
status
|
|
1550
|
+
last_status
|
|
1551
|
+
metadata
|
|
1552
|
+
summary
|
|
1553
|
+
aiProcessingStatus
|
|
1554
|
+
startedAt
|
|
1555
|
+
completedAt
|
|
1556
|
+
duration
|
|
1557
|
+
createdAt
|
|
1558
|
+
recording { key bucket location }
|
|
1559
|
+
entityConversation { id entityAddress }
|
|
1560
|
+
entity { id name phoneNumberE164 }
|
|
1561
|
+
endpoint { id address }
|
|
1562
|
+
}
|
|
1563
|
+
nextToken
|
|
1564
|
+
}
|
|
1565
|
+
}`;
|
|
1566
|
+
constructor(cdr, appSync, auth) {
|
|
1427
1567
|
this.cdr = cdr;
|
|
1568
|
+
this.appSync = appSync;
|
|
1569
|
+
this.auth = auth;
|
|
1428
1570
|
}
|
|
1429
1571
|
async ngOnInit() {
|
|
1430
1572
|
await this.loadCallHistory();
|
|
@@ -1435,18 +1577,16 @@ class CallHistoryComponent {
|
|
|
1435
1577
|
async loadCallHistory() {
|
|
1436
1578
|
this.showHistoryLoader = true;
|
|
1437
1579
|
try {
|
|
1438
|
-
const tenantId = this.tenantId || this.
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
console.warn('Missing tenantId or agentId for call history', {
|
|
1442
|
-
tenantId,
|
|
1443
|
-
userId,
|
|
1444
|
-
});
|
|
1580
|
+
const tenantId = this.tenantId || this.auth.getTenantId();
|
|
1581
|
+
if (!tenantId) {
|
|
1582
|
+
console.warn('Missing tenantId for call history');
|
|
1445
1583
|
return;
|
|
1446
1584
|
}
|
|
1447
|
-
const
|
|
1448
|
-
|
|
1449
|
-
|
|
1585
|
+
const items = await this.fetchPhoneInteractions(tenantId);
|
|
1586
|
+
this.callHistory = items
|
|
1587
|
+
.map((interaction) => this.mapInteractionToHistoryItem(interaction))
|
|
1588
|
+
.filter((item) => !!item)
|
|
1589
|
+
.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
|
|
1450
1590
|
}
|
|
1451
1591
|
catch (error) {
|
|
1452
1592
|
console.error('Failed to load call history:', error);
|
|
@@ -1456,9 +1596,89 @@ class CallHistoryComponent {
|
|
|
1456
1596
|
this.cdr.detectChanges();
|
|
1457
1597
|
}
|
|
1458
1598
|
}
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1599
|
+
async fetchPhoneInteractions(tenantId) {
|
|
1600
|
+
const interactions = [];
|
|
1601
|
+
let nextToken;
|
|
1602
|
+
let pages = 0;
|
|
1603
|
+
// Scope to the logged-in agent: Avaya interactions are tagged with hostId = the agent's user id.
|
|
1604
|
+
const userId = this.auth.getUserId();
|
|
1605
|
+
const andFilters = [
|
|
1606
|
+
{ channel: { eq: 'PHONE' } },
|
|
1607
|
+
{ deletedAt: { attributeExists: false } },
|
|
1608
|
+
];
|
|
1609
|
+
if (userId) {
|
|
1610
|
+
andFilters.push({ hostId: { eq: userId } });
|
|
1611
|
+
}
|
|
1612
|
+
do {
|
|
1613
|
+
const variables = {
|
|
1614
|
+
tenantId,
|
|
1615
|
+
sortDirection: 'DESC',
|
|
1616
|
+
filter: { and: andFilters },
|
|
1617
|
+
limit: 100,
|
|
1618
|
+
};
|
|
1619
|
+
if (nextToken) {
|
|
1620
|
+
variables.nextToken = nextToken;
|
|
1621
|
+
}
|
|
1622
|
+
const res = await this.appSync.query(this.LIST_PHONE_INTERACTIONS_QUERY, variables);
|
|
1623
|
+
const data = res?.data?.listInteractionsByTenantId;
|
|
1624
|
+
if (Array.isArray(data?.items)) {
|
|
1625
|
+
interactions.push(...data.items.filter((i) => !!i));
|
|
1626
|
+
}
|
|
1627
|
+
nextToken = data?.nextToken || undefined;
|
|
1628
|
+
pages++;
|
|
1629
|
+
} while (nextToken && interactions.length < 200 && pages < 5);
|
|
1630
|
+
return interactions;
|
|
1631
|
+
}
|
|
1632
|
+
mapInteractionToHistoryItem(interaction) {
|
|
1633
|
+
if (!interaction) {
|
|
1634
|
+
return null;
|
|
1635
|
+
}
|
|
1636
|
+
const metadata = this.safeParse(interaction.metadata) || {};
|
|
1637
|
+
const phoneData = metadata.phoneData || {};
|
|
1638
|
+
const direction = (interaction.direction || '').toUpperCase() === 'OUT' ? 'outbound' : 'inbound';
|
|
1639
|
+
const status = interaction.status || '';
|
|
1640
|
+
const duration = Number(interaction.duration) || 0;
|
|
1641
|
+
const missed = ['MISSED', 'NO_ANSWER'].includes(status);
|
|
1642
|
+
const customerNumber = interaction.entity?.phoneNumberE164 ||
|
|
1643
|
+
interaction.entityConversation?.entityAddress ||
|
|
1644
|
+
phoneData.CallerID ||
|
|
1645
|
+
phoneData.CustomerNumber ||
|
|
1646
|
+
'';
|
|
1647
|
+
const entityName = (interaction.entity?.name || '').toString();
|
|
1648
|
+
const isJustNumber = !entityName || /^\+?[\d\s-]+$/.test(entityName);
|
|
1649
|
+
const name = !isJustNumber ? entityName : metadata.callerName || '';
|
|
1650
|
+
const tsSec = interaction.startedAt || interaction.createdAt || 0;
|
|
1651
|
+
const disconnectSide = missed && direction === 'inbound' ? 'CALLER' : metadata.disconnectSide || 'AGENT';
|
|
1652
|
+
return {
|
|
1653
|
+
id: interaction.id,
|
|
1654
|
+
callId: interaction.providerInteractionId,
|
|
1655
|
+
direction,
|
|
1656
|
+
status,
|
|
1657
|
+
duration: missed ? 0 : duration,
|
|
1658
|
+
disconnectSide,
|
|
1659
|
+
timestamp: tsSec ? new Date(tsSec * 1000).toISOString() : new Date().toISOString(),
|
|
1660
|
+
summary: interaction.summary || '',
|
|
1661
|
+
metadata,
|
|
1662
|
+
aiProcessingStatus: interaction.aiProcessingStatus || '',
|
|
1663
|
+
fullCallRecordingUrl: interaction.recording?.location || metadata.phoneData?.AudioFile || '',
|
|
1664
|
+
phoneNumber: {
|
|
1665
|
+
normalizedPhoneNumber: customerNumber,
|
|
1666
|
+
name: name || undefined,
|
|
1667
|
+
lookupPhoneNumber: name ? { name } : undefined,
|
|
1668
|
+
},
|
|
1669
|
+
};
|
|
1670
|
+
}
|
|
1671
|
+
safeParse(value) {
|
|
1672
|
+
if (!value)
|
|
1673
|
+
return null;
|
|
1674
|
+
if (typeof value === 'object')
|
|
1675
|
+
return value;
|
|
1676
|
+
try {
|
|
1677
|
+
return JSON.parse(value);
|
|
1678
|
+
}
|
|
1679
|
+
catch {
|
|
1680
|
+
return null;
|
|
1681
|
+
}
|
|
1462
1682
|
}
|
|
1463
1683
|
makeCall(phoneNumber, name) {
|
|
1464
1684
|
const dialOut = formatDialOutNumber(phoneNumber);
|
|
@@ -1563,33 +1783,6 @@ class CallHistoryComponent {
|
|
|
1563
1783
|
}
|
|
1564
1784
|
return undefined;
|
|
1565
1785
|
}
|
|
1566
|
-
formatDialOutFromInput(value) {
|
|
1567
|
-
return formatDialOutNumber(value);
|
|
1568
|
-
}
|
|
1569
|
-
getTenantIdFromSession() {
|
|
1570
|
-
const raw = sessionStorage.getItem('sd-tenant');
|
|
1571
|
-
if (!raw)
|
|
1572
|
-
return undefined;
|
|
1573
|
-
try {
|
|
1574
|
-
const parsed = JSON.parse(raw);
|
|
1575
|
-
return parsed?.id || parsed?.tenantId || undefined;
|
|
1576
|
-
}
|
|
1577
|
-
catch {
|
|
1578
|
-
return undefined;
|
|
1579
|
-
}
|
|
1580
|
-
}
|
|
1581
|
-
getUserIdFromSession() {
|
|
1582
|
-
const raw = sessionStorage.getItem('sd-user');
|
|
1583
|
-
if (!raw)
|
|
1584
|
-
return undefined;
|
|
1585
|
-
try {
|
|
1586
|
-
const parsed = JSON.parse(raw);
|
|
1587
|
-
return parsed?.id || parsed?.userId || undefined;
|
|
1588
|
-
}
|
|
1589
|
-
catch {
|
|
1590
|
-
return undefined;
|
|
1591
|
-
}
|
|
1592
|
-
}
|
|
1593
1786
|
getPhoneDisplay(item) {
|
|
1594
1787
|
return (item?.phoneNumber?.name ||
|
|
1595
1788
|
item?.lookupPhoneNumber?.name ||
|
|
@@ -1653,13 +1846,13 @@ class CallHistoryComponent {
|
|
|
1653
1846
|
year: 'numeric',
|
|
1654
1847
|
});
|
|
1655
1848
|
}
|
|
1656
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: CallHistoryComponent, deps: [{ token: i1.
|
|
1657
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: CallHistoryComponent, isStandalone: false, selector: "app-call-history", inputs: { mode: "mode", tenantId: "tenantId", agentId: "agentId" }, outputs: { makeCallEv: "makeCallEv", transferEv: "transferEv" }, ngImport: i0, template: "<div class=\"recent_container_outer\">\n @if (showHistoryLoader) {\n <div class=\"history_skeleton\">\n @for (item of [1,2,3,4]; track item) {\n <div class=\"skeleton_row\">\n <div class=\"skeleton_avatar shine\"></div>\n <div class=\"skeleton_body\">\n <div class=\"skeleton_line wide shine\"></div>\n <div class=\"skeleton_line medium shine\"></div>\n </div>\n <div class=\"skeleton_meta\">\n <div class=\"skeleton_line short shine\"></div>\n </div>\n </div>\n }\n </div>\n } @else if (selectedCall) {\n <div class=\"history_details_panel\">\n <button class=\"back_btn\" type=\"button\" (click)=\"closeDetails()\">\u2190 Back</button>\n <app-call-details [call]=\"selectedCall\"></app-call-details>\n </div>\n } @else {\n @if (recentCallactiveTab === 'recentCall') {\n <div class=\"recent_tab_container\">\n <div class=\"container_recent_list\">\n @if (!selectedCall) {\n <div class=\"recent_options_header\">\n <div class=\"recent_inner\">\n <button class=\"recent_btn\" (click)=\"recentSelectTab('recentCall')\"\n [class.active]=\"$any(recentCallactiveTab) === 'recentCall'\">\n <span class=\"tab_icon\">\n <svg viewBox=\"0 0 512 512\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </span>\n <span>Recent</span>\n </button>\n <button class=\"recent_btn\" (click)=\"recentSelectTab('missedCall')\"\n [class.active]=\"$any(recentCallactiveTab) === 'missedCall'\">\n <span class=\"tab_icon\">\n <svg viewBox=\"0 0 512 512\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M504.971 75.029l-68-68C430.182.241 423.6-1.547 417.6.758 411.7 3.067 408 8.798 408 15v72H248C111.033 87 0 198.033 0 335v48c0 13.255 10.745 24 24 24h64c13.255 0 24-10.745 24-24v-48c0-74.991 61.009-136 136-136h160v72c0 6.202 3.7 11.933 9.6 14.242 6 2.305 12.582.517 16.629-3.758l68-68c9.373-9.373 9.373-24.569 0-33.941z\" />\n </svg>\n </span>\n <span>Missed Call</span>\n </button>\n </div>\n </div>\n <div class=\"container_recent_search\">\n <div class=\"search_wrap\">\n <svg class=\"search_icon\" viewBox=\"0 0 512 512\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M208 48C111 48 32 127 32 224s79 176 176 176c43.2 0 82.7-15.3 113.7-40.6l81.4 81.4c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-81.4-81.4C416.7 306.7 432 267.2 432 224 432 127 353 48 256 48zm-128 176c0-70.7 57.3-128 128-128s128 57.3 128 128-57.3 128-128 128S80 294.7 80 224z\"/>\n </svg>\n <input\n type=\"search\"\n placeholder=\"Search numbers or names\"\n [(ngModel)]=\"searchTerm\"\n />\n </div>\n </div>\n }\n <div class=\"container_recent_list_inner\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n @for (group of groupedRecent; track $index) {\n @if (group.label) {\n <div class=\"history_group_label\">{{ group.label }}</div>\n }\n @for (call of group.items; track $index) {\n <div class=\"outer_container_recent\">\n <div class=\"history_item\" (click)=\"onSelectCall(call)\">\n <div class=\"history_avatar grd1\">\n {{ getPhoneBadge(call) }}\n </div>\n <div class=\"history_body\">\n <div class=\"history_row\">\n <div class=\"history_name\" [class.history_name_missed]=\"call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0\">\n {{ getPhoneDisplay(call) }}\n </div>\n <div class=\"history_time\">{{ call.timestamp | date : \"hh:mm a\" }}</div>\n </div>\n <div class=\"history_meta\" [ngClass]=\"{\n missed: call.status === 'MISSED',\n caller_drop: call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0\n }\">\n <span class=\"meta_label\" [ngClass]=\"{\n inbound: call.direction?.toLowerCase() === 'inbound',\n outbound: call.direction?.toLowerCase() === 'outbound',\n missed: call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0\n }\">\n @if (call.direction?.toLowerCase() === 'inbound') {\n @if (call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0) {\n <svg viewBox=\"0 0 640 512\" width=\"12px\" aria-hidden=\"true\" style=\"fill: currentColor;\">\n <path d=\"M232 0c9.7 0 18.5 5.8 22.2 14.8s1.7 19.3-5.2 26.2l-39 39 58.7 58.7C282.3 152.4 300.8 160 320 160s37.7-7.6 51.3-21.3L503 7c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9L405.3 172.7C382.6 195.3 352 208 320 208s-62.6-12.7-85.3-35.3L176 113.9l-39 39c-6.9 6.9-17.2 8.9-26.2 5.2s-14.8-12.5-14.8-22.2L96 24c0-13.3 10.7-24 24-24L232 0zM51.4 489.9l-35.4-62c-9.7-16.9-8.3-38.1 5.5-51.7C72.6 325.9 178.1 256 320 256s247.4 69.9 298.5 120.2c13.9 13.6 15.2 34.8 5.5 51.7l-35.4 62c-7.4 12.9-22.7 19.1-37 14.8L438.8 470.8c-13.5-4.1-22.8-16.5-22.8-30.6l0-56.2c-62.3-20.8-129.7-20.8-192 0l0 56.2c0 14.1-9.3 26.6-22.8 30.6L88.4 504.7c-14.3 4.3-29.6-1.8-37-14.8z\" />\n </svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M17 7L7 17M7 17H17M7 17V7\" />\n </svg>\n }\n <span class=\"direction_text\">\n @if (call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0) {\n Missed call\n } @else {\n Incoming\n }\n </span>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M7 17L17 7M17 7H7M17 7V17\" />\n </svg>\n <span class=\"direction_text\">Outgoing</span>\n }\n </span>\n </div>\n </div>\n <div class=\"history_actions\">\n @if (mode === 'transfer') {\n <button class=\"button_recent_call\" (click)=\"transferEv.emit(call); $event.stopPropagation()\">\n <svg viewBox=\"0 0 512 512\" height=\"18px\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n } @else {\n <button class=\"button_recent_call\" (click)=\"\n makeCall(call.phoneNumber?.normalizedPhoneNumber, call.phoneNumber?.name || call.lookupPhoneNumber?.name); $event.stopPropagation()\n \">\n <svg viewBox=\"0 0 512 512\" height=\"18px\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n }\n </div>\n </div>\n </div>\n }\n }\n @if (callHistory.length === 0) {\n <div class=\"container_call_history_not_found\">\n <h2>No Call History</h2>\n <p>Your call history is empty</p>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n } @if (recentCallactiveTab === 'missedCall') {\n <div class=\"recent_tab_container\">\n <div class=\"container_recent_list\">\n @if (!selectedCall) {\n <div class=\"recent_options_header\">\n <div class=\"recent_inner\">\n <button class=\"recent_btn\" (click)=\"recentSelectTab('recentCall')\"\n [class.active]=\"$any(recentCallactiveTab) === 'recentCall'\">\n <span class=\"tab_icon\">\n <svg viewBox=\"0 0 512 512\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </span>\n <span>Recent</span>\n </button>\n <button class=\"recent_btn\" (click)=\"recentSelectTab('missedCall')\"\n [class.active]=\"$any(recentCallactiveTab) === 'missedCall'\">\n <span class=\"tab_icon\">\n <svg viewBox=\"0 0 512 512\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M504.971 75.029l-68-68C430.182.241 423.6-1.547 417.6.758 411.7 3.067 408 8.798 408 15v72H248C111.033 87 0 198.033 0 335v48c0 13.255 10.745 24 24 24h64c13.255 0 24-10.745 24-24v-48c0-74.991 61.009-136 136-136h160v72c0 6.202 3.7 11.933 9.6 14.242 6 2.305 12.582.517 16.629-3.758l68-68c9.373-9.373 9.373-24.569 0-33.941z\" />\n </svg>\n </span>\n <span>Missed Call</span>\n </button>\n </div>\n </div>\n <div class=\"container_recent_search\">\n <div class=\"search_wrap\">\n <svg class=\"search_icon\" viewBox=\"0 0 512 512\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M208 48C111 48 32 127 32 224s79 176 176 176c43.2 0 82.7-15.3 113.7-40.6l81.4 81.4c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-81.4-81.4C416.7 306.7 432 267.2 432 224 432 127 353 48 256 48zm-128 176c0-70.7 57.3-128 128-128s128 57.3 128 128-57.3 128-128 128S80 294.7 80 224z\"/>\n </svg>\n <input\n type=\"search\"\n placeholder=\"Search numbers or names\"\n [(ngModel)]=\"searchTerm\"\n />\n </div>\n </div>\n }\n <div class=\"container_recent_list_inner\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n @for (group of groupedMissed; track $index) {\n @if (group.label) {\n <div class=\"history_group_label\">{{ group.label }}</div>\n }\n @for (call of group.items; track $index) {\n <div class=\"outer_container_recent\">\n <div class=\"history_item\" (click)=\"onSelectCall(call)\">\n <div class=\"history_avatar grd1\">\n {{ getPhoneBadge(call) }}\n </div>\n <div class=\"history_body\">\n <div class=\"history_row\">\n <div class=\"history_name history_name_missed\">\n {{ getPhoneDisplay(call) }}\n </div>\n <div class=\"history_time\">{{ call.timestamp | date : \"hh:mm a\" }}</div>\n </div>\n <div class=\"history_meta caller_drop\">\n <span class=\"meta_label missed\">\n <svg viewBox=\"0 0 640 512\" width=\"12px\" aria-hidden=\"true\" style=\"fill: currentColor;\">\n <path d=\"M232 0c9.7 0 18.5 5.8 22.2 14.8s1.7 19.3-5.2 26.2l-39 39 58.7 58.7C282.3 152.4 300.8 160 320 160s37.7-7.6 51.3-21.3L503 7c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9L405.3 172.7C382.6 195.3 352 208 320 208s-62.6-12.7-85.3-35.3L176 113.9l-39 39c-6.9 6.9-17.2 8.9-26.2 5.2s-14.8-12.5-14.8-22.2L96 24c0-13.3 10.7-24 24-24L232 0zM51.4 489.9l-35.4-62c-9.7-16.9-8.3-38.1 5.5-51.7C72.6 325.9 178.1 256 320 256s247.4 69.9 298.5 120.2c13.9 13.6 15.2 34.8 5.5 51.7l-35.4 62c-7.4 12.9-22.7 19.1-37 14.8L438.8 470.8c-13.5-4.1-22.8-16.5-22.8-30.6l0-56.2c-62.3-20.8-129.7-20.8-192 0l0 56.2c0 14.1-9.3 26.6-22.8 30.6L88.4 504.7c-14.3 4.3-29.6-1.8-37-14.8z\" />\n </svg>\n <span class=\"direction_text\">Missed call</span>\n </span>\n </div>\n </div>\n <div class=\"history_actions\">\n <button class=\"button_recent_call\" (click)=\"selectFromHistory(call); $event.stopPropagation()\">\n <svg viewBox=\"0 0 512 512\" height=\"15px\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n }\n }\n @if (callerDropped.length === 0) {\n <div class=\"container_call_history_not_found\">\n <h2>No missed calls</h2>\n <p>No inbound calls ended by caller.</p>\n </div>\n }\n </div>\n <!-- /.scrollbox-content -->\n </div>\n <!-- /.scrollbox -->\n </div>\n <!-- /.container_recent_list_inner -->\n </div>\n <!-- /.container_recent_list -->\n </div>\n <!-- /.recent_tab_container -->\n }\n }\n</div>\n", styles: [":host{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}.recent_container_outer{margin:0;padding:0;width:100%;position:relative;display:flex;flex-direction:column;flex:1 1 auto;min-height:0;overflow-y:auto;padding-bottom:var(--sd-tabs-height, 60px)}.recent_options_header{margin:0;padding:12px 15px 8px;width:100%;text-align:center;position:sticky;top:0;z-index:6;background:var(--sd-surface, #fff)}.recent_inner{margin:0;padding:4px;width:100%;height:40px;background:#f2f3f7;border-radius:12px;display:flex;align-items:center;justify-content:center;gap:6px}.recent_btn{margin:0;padding:0 10px;width:50%;display:flex;align-items:center;justify-content:center;border:none;outline:none;background:transparent;height:32px;border-radius:10px;color:#6b6b6b;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;gap:6px;font-weight:600;font-size:13px}.recent_btn:hover{background:#e8e8ee;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.recent_btn.active{color:#1f1f1f;background:#fff;font-weight:700;box-shadow:0 2px 6px #0000000d}.tab_icon{display:flex;align-items:center;justify-content:center;color:inherit}.recent_heading{font-family:var(--sd-text-font-family);font-size:20px;color:var(--sd-text-color-dark);font-weight:700;letter-spacing:-.65px;padding:0 0 15px 15px;line-height:normal;margin:0;width:100%;max-width:100%;box-sizing:border-box;overflow:hidden}.container_recent_search{margin:0 0 15px;padding:0 15px;width:100%;max-width:100%;box-sizing:border-box;position:sticky;top:56px;z-index:5;background:var(--sd-surface, #fff)}.container_recent_search input{padding:0 42px;width:100%;outline:none;display:block;border:1px solid #e0e0e0;color:#1f1f1f;font-size:13px;letter-spacing:-.15px;font-family:var(--sd-text-font-family);background:#fafafa;font-style:normal;font-weight:600;position:relative;border-radius:12px;height:42px;box-shadow:inset 0 1px 2px #0000000f}.search_wrap{position:relative}.search_icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);color:#888}.recent_tab_container{margin:0;padding:0;width:100%;flex:1 1 auto;min-height:0;position:relative}.container_recent_list{width:100%;margin:0;padding:0;position:relative;flex:1 1 auto;min-height:0}.container_recent_list_inner{width:100%;position:relative;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:flex;flex-direction:column;flex:1 1 auto;min-height:0}.scrollbox{height:auto;overflow-y:visible;overflow-x:hidden;visibility:visible;padding:0 0 12px;position:relative;scroll-behavior:smooth;scrollbar-width:thin;width:100%;flex:1 1 auto;min-height:0}.outer_container_recent{width:100%;max-width:100%;margin:0;padding:0 15px;box-sizing:border-box;overflow:hidden}.container_recent_item{width:100%;position:relative;display:flex;flex-direction:row;height:auto;pointer-events:all;border-radius:8px;overflow:hidden;cursor:pointer}.calling_btn{display:none}.history_item{display:flex;align-items:center;gap:12px;padding:12px 0;border-bottom:1px solid #ededed;background:transparent;box-shadow:none}.history_item:hover{background:#f7f7f7}.history_avatar{width:44px;height:44px;border-radius:12px;display:flex;align-items:center;justify-content:center;background:#f0f0f0;font-weight:700;color:#333}.history_body{flex:1;display:flex;flex-direction:column;gap:6px}.history_row{display:flex;align-items:center;justify-content:space-between;gap:10px}.history_name{font-weight:700;color:#1f1f1f}.history_name_missed{color:#d14343}.history_time{font-size:12px;color:#666}.history_meta{display:flex;align-items:center;gap:8px;font-size:12px;color:#555}.history_meta .meta_label{display:inline-flex;align-items:center;gap:6px}.history_meta .meta_label svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round}.history_meta .direction_text{font-size:12px;font-weight:500}.history_meta.missed,.history_meta.caller_drop{color:#d14343}.history_meta .meta_label.inbound{color:#2b8a3e}.history_meta .meta_label.outbound{color:#1f6fb2}.history_meta .meta_label.missed{color:#d14343}.history_actions{display:flex;align-items:center;justify-content:center}.history_details_panel{padding:0 15px 12px;display:flex;flex-direction:column;gap:12px;height:100%;box-sizing:border-box;overflow-y:auto}.back_btn{width:80px;border:1px solid #e0e0e0;background:#fff;color:#333;border-radius:8px;padding:8px;cursor:pointer;font-weight:600}.history_skeleton{padding:12px 15px;display:flex;flex-direction:column;gap:12px}.skeleton_row{display:flex;align-items:center;gap:12px}.skeleton_avatar{width:42px;height:42px;border-radius:12px;background:#f0f0f0;position:relative;overflow:hidden}.skeleton_body{flex:1;display:flex;flex-direction:column;gap:8px}.skeleton_meta{width:60px}.skeleton_line{height:10px;background:#f0f0f0;border-radius:6px;position:relative;overflow:hidden}.skeleton_line.wide{width:70%}.skeleton_line.medium{width:55%}.skeleton_line.short{width:50px}.shine:after{content:\"\";position:absolute;top:0;left:-150px;height:100%;width:120px;background:linear-gradient(90deg,#fff0,#fff9,#fff0);animation:shimmer 1.2s infinite}:host-context(.dark-mode) .skeleton_avatar,:host-context(.dark-mode) .skeleton_line{background:#1e2430}:host-context(.dark-mode) .shine:after{background:linear-gradient(90deg,#0f111500,#555f6e73,#0f111500)}@keyframes shimmer{0%{transform:translate(0)}to{transform:translate(260px)}}.container_recent_item:hover .calling_btn{display:block;position:absolute;text-align:right;right:0;width:78px;height:38px;background:var(--sd-background-color)}.container_recent_item_image{display:flex;align-items:center}.container_recent_item_image_inner{margin:0 auto;padding:0;width:50px;height:50px;position:relative;border-radius:50%;display:flex;align-items:center;justify-content:center;font-family:var(--sd-text-font-family);font-size:26px;color:var(--sd-text-color-inverse);font-weight:400;background:#2a7b9b}.grd1{background:#718ede}.container_recent_item_left{display:flex;flex-basis:auto;flex-direction:column;flex-grow:1;justify-content:center;min-width:0;position:relative;border-top:1px solid #e9edef}.container_recent_item_left_inner{display:flex;flex-basis:1;flex-direction:column;padding:0 0 0 10px}.container_recent_item_left .contact_field{font-size:13px;color:var(--sd-text-color-dark);margin-bottom:2px}.container_recent_item_left .missed_call_color{color:#e0261f}.container_recent_item_left .recent_time_back{font-size:12px;color:var(--sd-text-color-medium)}.history_group_label{width:100%;padding:8px 15px 6px;font-size:11px;letter-spacing:.6px;color:var(--sd-text-color-medium);text-transform:uppercase;box-sizing:border-box;text-align:center;position:sticky;top:0;z-index:2;background:#f7f7f7eb;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}.container_recent_item_left .caller_drop{color:#e0261f}.disconnect_badge{display:inline-flex;align-items:center;margin-left:6px;padding:2px 6px;border-radius:8px;background:#e0261f1f;color:#e0261f;font-size:10px;font-weight:600;letter-spacing:.2px}.container_recent_item_right{display:flex;flex-direction:row;position:absolute;right:0}.container_recent_item_right .right_field{display:flex;flex-basis:auto;justify-content:right}.container_recent_item_right .right_field_content{display:inline-block;border-radius:26px;border:1px solid #e5e5e5;padding:5px 8px;font-size:11px;color:var(--sd-text-color)}.calling_btn_inner{position:relative;width:100%;margin:0;padding:0;display:flex;justify-content:right}.button_recent_call{width:38px;height:38px;display:flex;flex-basis:auto;flex-direction:column;align-items:center;justify-content:center;line-height:normal;border-radius:26px;outline:none;border:none;font-size:22px;font-weight:700;color:#6c0;background:#f1f1f1;border:1px solid #f1f1f1}.container_call_history_not_found{position:absolute;width:100%;height:100%;display:flex;flex-basis:auto;flex-direction:column;flex-grow:1;align-items:center;background:#f8f8f8}.container_call_history_not_found h2{font-size:18px;font-weight:700;letter-spacing:-.65px;color:var(--sd-text-color-dark);text-align:center;padding-top:26px}.container_call_history_not_found p{font-size:12px;line-height:normal;color:var(--sd-text-color);font-weight:600;white-space:normal;text-align:center;padding-top:10px}.icon_round_area_call_history{width:165px;height:75px;background:var(--sd-background-color) url(data:image/gif;base64,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) center no-repeat;border-radius:38px;display:flex;grid-row:1}:host-context(.dark-mode) .container_recent_search input{background:#1c222c;border-color:#2a2f3a;color:#f2f4f8}:host-context(.dark-mode) .container_recent_search input::placeholder{color:#aab0bb}:host-context(.dark-mode) .search_icon{color:#aab0bb}:host-context(.dark-mode) .history_name{color:#f2f4f8}:host-context(.dark-mode) .history_time,:host-context(.dark-mode) .history_meta,:host-context(.dark-mode) .history_meta .direction_text{color:#aab0bb}:host-context(.dark-mode) .history_avatar{background:#222833;color:#f2f4f8}:host-context(.dark-mode) .container_call_history_not_found{background:#12161e}:host-context(.dark-mode) .container_call_history_not_found h2,:host-context(.dark-mode) .container_call_history_not_found p{color:#aab0bb}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2$1.NativeElementInjectorDirective, selector: "[ngModel], [formControl], [formControlName]" }, { kind: "component", type: CallDetailsComponent, selector: "app-call-details", inputs: ["call"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
|
|
1849
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: CallHistoryComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1$1.AppSyncHelperService }, { token: i1$1.SnugdeskAuthenticationService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1850
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: CallHistoryComponent, isStandalone: false, selector: "app-call-history", inputs: { mode: "mode", tenantId: "tenantId", agentId: "agentId" }, outputs: { makeCallEv: "makeCallEv", transferEv: "transferEv" }, ngImport: i0, template: "<div class=\"avaya-ipo-recent_container_outer\">\n @if (selectedCall) {\n <div class=\"avaya-ipo-history_details_panel\">\n <button class=\"avaya-ipo-back_btn\" type=\"button\" (click)=\"closeDetails()\">\u2190 Back</button>\n <app-call-details [call]=\"selectedCall\"></app-call-details>\n </div>\n } @else {\n @if (recentCallactiveTab === 'recentCall') {\n <div class=\"avaya-ipo-recent_tab_container\">\n <div class=\"avaya-ipo-container_recent_list\">\n @if (!selectedCall) {\n <div class=\"avaya-ipo-recent_options_header\">\n <div class=\"avaya-ipo-recent_inner\">\n <button class=\"avaya-ipo-recent_btn\" (click)=\"recentSelectTab('recentCall')\"\n [class.avaya-ipo-active]=\"$any(recentCallactiveTab) === 'recentCall'\">\n <span class=\"avaya-ipo-tab_icon\">\n <svg viewBox=\"0 0 512 512\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </span>\n <span>Recent</span>\n </button>\n <button class=\"avaya-ipo-recent_btn\" (click)=\"recentSelectTab('missedCall')\"\n [class.avaya-ipo-active]=\"$any(recentCallactiveTab) === 'missedCall'\">\n <span class=\"avaya-ipo-tab_icon\">\n <svg viewBox=\"0 0 512 512\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M504.971 75.029l-68-68C430.182.241 423.6-1.547 417.6.758 411.7 3.067 408 8.798 408 15v72H248C111.033 87 0 198.033 0 335v48c0 13.255 10.745 24 24 24h64c13.255 0 24-10.745 24-24v-48c0-74.991 61.009-136 136-136h160v72c0 6.202 3.7 11.933 9.6 14.242 6 2.305 12.582.517 16.629-3.758l68-68c9.373-9.373 9.373-24.569 0-33.941z\" />\n </svg>\n </span>\n <span>Missed Call</span>\n </button>\n </div>\n </div>\n <div class=\"avaya-ipo-container_recent_search\">\n <div class=\"avaya-ipo-search_wrap\">\n <svg class=\"avaya-ipo-search_icon\" viewBox=\"0 0 512 512\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M208 48C111 48 32 127 32 224s79 176 176 176c43.2 0 82.7-15.3 113.7-40.6l81.4 81.4c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-81.4-81.4C416.7 306.7 432 267.2 432 224 432 127 353 48 256 48zm-128 176c0-70.7 57.3-128 128-128s128 57.3 128 128-57.3 128-128 128S80 294.7 80 224z\"/>\n </svg>\n <input\n type=\"search\"\n placeholder=\"Search numbers or names\"\n [(ngModel)]=\"searchTerm\"\n />\n </div>\n </div>\n }\n <div class=\"avaya-ipo-container_recent_list_inner\">\n <div class=\"avaya-ipo-scrollbox\">\n @if (showHistoryLoader) {\n <div class=\"avaya-ipo-history_skeleton\">\n @for (item of [1,2,3,4]; track item) {\n <div class=\"avaya-ipo-skeleton_row\">\n <div class=\"avaya-ipo-skeleton_avatar avaya-ipo-shine\"></div>\n <div class=\"avaya-ipo-skeleton_body\">\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-wide avaya-ipo-shine\"></div>\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-medium avaya-ipo-shine\"></div>\n </div>\n <div class=\"avaya-ipo-skeleton_meta\">\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-short avaya-ipo-shine\"></div>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"avaya-ipo-scrollbox-content\">\n @for (group of groupedRecent; track $index) {\n @if (group.label) {\n <div class=\"avaya-ipo-history_group_label\">{{ group.label }}</div>\n }\n @for (call of group.items; track $index) {\n <div class=\"avaya-ipo-outer_container_recent\">\n <div class=\"avaya-ipo-history_item\" (click)=\"onSelectCall(call)\">\n <div class=\"avaya-ipo-history_avatar avaya-ipo-grd1\">\n {{ getPhoneBadge(call) }}\n </div>\n <div class=\"avaya-ipo-history_body\">\n <div class=\"avaya-ipo-history_row\">\n <div class=\"avaya-ipo-history_name\" [class.avaya-ipo-history_name_missed]=\"call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0\">\n {{ getPhoneDisplay(call) }}\n </div>\n <div class=\"avaya-ipo-history_time\">{{ call.timestamp | date : \"hh:mm a\" }}</div>\n </div>\n <div class=\"avaya-ipo-history_meta\" [ngClass]=\"{\n 'avaya-ipo-missed': call.status === 'MISSED',\n 'avaya-ipo-caller_drop': call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0\n }\">\n <span class=\"avaya-ipo-meta_label\" [ngClass]=\"{\n 'avaya-ipo-inbound': call.direction?.toLowerCase() === 'inbound',\n 'avaya-ipo-outbound': call.direction?.toLowerCase() === 'outbound',\n 'avaya-ipo-missed': call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0\n }\">\n @if (call.direction?.toLowerCase() === 'inbound') {\n @if (call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0) {\n <svg viewBox=\"0 0 640 512\" width=\"12px\" aria-hidden=\"true\" style=\"fill: currentColor;\">\n <path d=\"M232 0c9.7 0 18.5 5.8 22.2 14.8s1.7 19.3-5.2 26.2l-39 39 58.7 58.7C282.3 152.4 300.8 160 320 160s37.7-7.6 51.3-21.3L503 7c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9L405.3 172.7C382.6 195.3 352 208 320 208s-62.6-12.7-85.3-35.3L176 113.9l-39 39c-6.9 6.9-17.2 8.9-26.2 5.2s-14.8-12.5-14.8-22.2L96 24c0-13.3 10.7-24 24-24L232 0zM51.4 489.9l-35.4-62c-9.7-16.9-8.3-38.1 5.5-51.7C72.6 325.9 178.1 256 320 256s247.4 69.9 298.5 120.2c13.9 13.6 15.2 34.8 5.5 51.7l-35.4 62c-7.4 12.9-22.7 19.1-37 14.8L438.8 470.8c-13.5-4.1-22.8-16.5-22.8-30.6l0-56.2c-62.3-20.8-129.7-20.8-192 0l0 56.2c0 14.1-9.3 26.6-22.8 30.6L88.4 504.7c-14.3 4.3-29.6-1.8-37-14.8z\" />\n </svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M17 7L7 17M7 17H17M7 17V7\" />\n </svg>\n }\n <span class=\"avaya-ipo-direction_text\">\n @if (call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0) {\n Missed call\n } @else {\n Incoming\n }\n </span>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M7 17L17 7M17 7H7M17 7V17\" />\n </svg>\n <span class=\"avaya-ipo-direction_text\">Outgoing</span>\n }\n </span>\n </div>\n </div>\n <div class=\"avaya-ipo-history_actions\">\n @if (mode === 'transfer') {\n <button class=\"avaya-ipo-button_recent_call\" (click)=\"transferEv.emit(call); $event.stopPropagation()\">\n <svg viewBox=\"0 0 512 512\" height=\"18px\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n } @else {\n <button class=\"avaya-ipo-button_recent_call\" (click)=\"\n makeCall(call.phoneNumber?.normalizedPhoneNumber, call.phoneNumber?.name || call.lookupPhoneNumber?.name); $event.stopPropagation()\n \">\n <svg viewBox=\"0 0 512 512\" height=\"18px\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n }\n </div>\n </div>\n </div>\n }\n }\n @if (callHistory.length === 0) {\n <div class=\"avaya-ipo-container_call_history_not_found\">\n <h2>No Call History</h2>\n <p>Your call history is empty</p>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n } @if (recentCallactiveTab === 'missedCall') {\n <div class=\"avaya-ipo-recent_tab_container\">\n <div class=\"avaya-ipo-container_recent_list\">\n @if (!selectedCall) {\n <div class=\"avaya-ipo-recent_options_header\">\n <div class=\"avaya-ipo-recent_inner\">\n <button class=\"avaya-ipo-recent_btn\" (click)=\"recentSelectTab('recentCall')\"\n [class.avaya-ipo-active]=\"$any(recentCallactiveTab) === 'recentCall'\">\n <span class=\"avaya-ipo-tab_icon\">\n <svg viewBox=\"0 0 512 512\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </span>\n <span>Recent</span>\n </button>\n <button class=\"avaya-ipo-recent_btn\" (click)=\"recentSelectTab('missedCall')\"\n [class.avaya-ipo-active]=\"$any(recentCallactiveTab) === 'missedCall'\">\n <span class=\"avaya-ipo-tab_icon\">\n <svg viewBox=\"0 0 512 512\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M504.971 75.029l-68-68C430.182.241 423.6-1.547 417.6.758 411.7 3.067 408 8.798 408 15v72H248C111.033 87 0 198.033 0 335v48c0 13.255 10.745 24 24 24h64c13.255 0 24-10.745 24-24v-48c0-74.991 61.009-136 136-136h160v72c0 6.202 3.7 11.933 9.6 14.242 6 2.305 12.582.517 16.629-3.758l68-68c9.373-9.373 9.373-24.569 0-33.941z\" />\n </svg>\n </span>\n <span>Missed Call</span>\n </button>\n </div>\n </div>\n <div class=\"avaya-ipo-container_recent_search\">\n <div class=\"avaya-ipo-search_wrap\">\n <svg class=\"avaya-ipo-search_icon\" viewBox=\"0 0 512 512\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M208 48C111 48 32 127 32 224s79 176 176 176c43.2 0 82.7-15.3 113.7-40.6l81.4 81.4c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-81.4-81.4C416.7 306.7 432 267.2 432 224 432 127 353 48 256 48zm-128 176c0-70.7 57.3-128 128-128s128 57.3 128 128-57.3 128-128 128S80 294.7 80 224z\"/>\n </svg>\n <input\n type=\"search\"\n placeholder=\"Search numbers or names\"\n [(ngModel)]=\"searchTerm\"\n />\n </div>\n </div>\n }\n <div class=\"avaya-ipo-container_recent_list_inner\">\n <div class=\"avaya-ipo-scrollbox\">\n @if (showHistoryLoader) {\n <div class=\"avaya-ipo-history_skeleton\">\n @for (item of [1,2,3,4]; track item) {\n <div class=\"avaya-ipo-skeleton_row\">\n <div class=\"avaya-ipo-skeleton_avatar avaya-ipo-shine\"></div>\n <div class=\"avaya-ipo-skeleton_body\">\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-wide avaya-ipo-shine\"></div>\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-medium avaya-ipo-shine\"></div>\n </div>\n <div class=\"avaya-ipo-skeleton_meta\">\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-short avaya-ipo-shine\"></div>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"avaya-ipo-scrollbox-content\">\n @for (group of groupedMissed; track $index) {\n @if (group.label) {\n <div class=\"avaya-ipo-history_group_label\">{{ group.label }}</div>\n }\n @for (call of group.items; track $index) {\n <div class=\"avaya-ipo-outer_container_recent\">\n <div class=\"avaya-ipo-history_item\" (click)=\"onSelectCall(call)\">\n <div class=\"avaya-ipo-history_avatar avaya-ipo-grd1\">\n {{ getPhoneBadge(call) }}\n </div>\n <div class=\"avaya-ipo-history_body\">\n <div class=\"avaya-ipo-history_row\">\n <div class=\"avaya-ipo-history_name avaya-ipo-history_name_missed\">\n {{ getPhoneDisplay(call) }}\n </div>\n <div class=\"avaya-ipo-history_time\">{{ call.timestamp | date : \"hh:mm a\" }}</div>\n </div>\n <div class=\"avaya-ipo-history_meta avaya-ipo-caller_drop\">\n <span class=\"avaya-ipo-meta_label avaya-ipo-missed\">\n <svg viewBox=\"0 0 640 512\" width=\"12px\" aria-hidden=\"true\" style=\"fill: currentColor;\">\n <path d=\"M232 0c9.7 0 18.5 5.8 22.2 14.8s1.7 19.3-5.2 26.2l-39 39 58.7 58.7C282.3 152.4 300.8 160 320 160s37.7-7.6 51.3-21.3L503 7c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9L405.3 172.7C382.6 195.3 352 208 320 208s-62.6-12.7-85.3-35.3L176 113.9l-39 39c-6.9 6.9-17.2 8.9-26.2 5.2s-14.8-12.5-14.8-22.2L96 24c0-13.3 10.7-24 24-24L232 0zM51.4 489.9l-35.4-62c-9.7-16.9-8.3-38.1 5.5-51.7C72.6 325.9 178.1 256 320 256s247.4 69.9 298.5 120.2c13.9 13.6 15.2 34.8 5.5 51.7l-35.4 62c-7.4 12.9-22.7 19.1-37 14.8L438.8 470.8c-13.5-4.1-22.8-16.5-22.8-30.6l0-56.2c-62.3-20.8-129.7-20.8-192 0l0 56.2c0 14.1-9.3 26.6-22.8 30.6L88.4 504.7c-14.3 4.3-29.6-1.8-37-14.8z\" />\n </svg>\n <span class=\"avaya-ipo-direction_text\">Missed call</span>\n </span>\n </div>\n </div>\n <div class=\"avaya-ipo-history_actions\">\n <button class=\"avaya-ipo-button_recent_call\" (click)=\"selectFromHistory(call); $event.stopPropagation()\">\n <svg viewBox=\"0 0 512 512\" height=\"15px\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n }\n }\n @if (callerDropped.length === 0) {\n <div class=\"avaya-ipo-container_call_history_not_found\">\n <h2>No missed calls</h2>\n <p>No inbound calls ended by caller.</p>\n </div>\n }\n </div>\n }\n <!-- /.scrollbox-content -->\n </div>\n <!-- /.scrollbox -->\n </div>\n <!-- /.container_recent_list_inner -->\n </div>\n <!-- /.container_recent_list -->\n </div>\n <!-- /.recent_tab_container -->\n }\n }\n</div>\n", styles: [":host{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;overflow-x:hidden}.avaya-ipo-recent_container_outer{margin:0;padding:0;width:100%;position:relative;display:flex;flex-direction:column;flex:1 1 auto;min-height:0;overflow:hidden}.avaya-ipo-recent_options_header{margin:0;padding:12px 15px 8px;text-align:center;position:sticky;top:0;z-index:6;background:var(--sd-surface, #fff)}.avaya-ipo-recent_inner{margin:0;padding:4px;background:var(--sd-surface-muted, #f7f7f7);border-radius:var(--sd-radius, 10px);display:flex;align-items:center;justify-content:center;gap:6px}.avaya-ipo-recent_btn{margin:0;padding:0 10px;width:50%;display:flex;align-items:center;justify-content:center;border:none;outline:none;background:transparent;height:32px;border-radius:var(--sd-radius-sm, 8px);color:var(--sd-text-muted, #5f6368);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;gap:6px;font-weight:600;font-size:13px}.avaya-ipo-recent_btn:hover{background:var(--sd-surface-sunken, #e8e8e8);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.avaya-ipo-recent_btn.avaya-ipo-active{color:var(--sd-text, #333);background:var(--sd-surface, #fff);font-weight:700;box-shadow:var(--sd-shadow-sm, 0 1px 2px rgba(16, 24, 40, .06))}.avaya-ipo-tab_icon{display:flex;align-items:center;justify-content:center;color:inherit}.avaya-ipo-recent_heading{font-family:var(--sd-text-font-family);font-size:20px;color:var(--sd-text-color-dark);font-weight:700;letter-spacing:-.65px;padding:0 0 15px 15px;line-height:normal;margin:0;width:100%;max-width:100%;box-sizing:border-box;overflow:hidden}.avaya-ipo-container_recent_search{margin:0 0 15px;padding:0 15px;width:100%;max-width:100%;box-sizing:border-box;position:sticky;top:56px;z-index:5;background:var(--sd-surface, #fff)}.avaya-ipo-container_recent_search input{padding:0 42px;width:100%;outline:none;display:block;border:1px solid var(--sd-input-border, #c9c9c9);color:var(--sd-text, #333);font-size:13px;letter-spacing:-.15px;font-family:var(--sd-text-font-family);background:var(--sd-input, #fff);font-style:normal;font-weight:600;position:relative;border-radius:var(--sd-radius-sm, 8px);height:42px;box-shadow:var(--sd-shadow-sm, 0 1px 2px rgba(16, 24, 40, .06));transition:border-color .15s ease,box-shadow .15s ease}.avaya-ipo-container_recent_search input::placeholder{color:var(--sd-text-subtle, #9ca3af)}.avaya-ipo-container_recent_search input:focus{border-color:var(--sd-accent, #ff6633);box-shadow:var(--sd-focus-ring, 0 0 0 3px rgba(255, 102, 51, .22))}.avaya-ipo-search_wrap{position:relative}.avaya-ipo-search_icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);color:var(--sd-text-subtle, #9ca3af)}.avaya-ipo-recent_tab_container{margin:0;padding:0;width:100%;flex:1 1 auto;min-height:0;position:relative;display:flex;flex-direction:column}.avaya-ipo-container_recent_list{width:100%;margin:0;padding:0;position:relative;flex:1 1 auto;min-height:0;max-width:100%;overflow-x:hidden;box-sizing:border-box;display:flex;flex-direction:column}.avaya-ipo-container_recent_list_inner{width:100%;position:relative;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:flex;flex-direction:column;flex:1 1 auto;min-height:0}.avaya-ipo-scrollbox{height:auto;overflow-y:auto;overflow-x:hidden;visibility:visible;padding:0 0 calc(var(--sd-tabs-height, 60px) + 12px) 0;position:relative;scroll-behavior:smooth;scrollbar-width:thin;width:100%;flex:1 1 auto;min-height:0;max-height:100%}.avaya-ipo-outer_container_recent{width:100%;max-width:100%;margin:0;padding:0 15px;box-sizing:border-box;overflow:hidden}.avaya-ipo-container_recent_item{width:100%;position:relative;display:flex;flex-direction:row;height:auto;pointer-events:all;border-radius:var(--sd-radius-sm, 8px);overflow:hidden;cursor:pointer}.avaya-ipo-calling_btn{display:none}.avaya-ipo-history_item{display:flex;align-items:center;gap:12px;padding:12px 0;border-bottom:1px solid var(--sd-border, #e3e3e3);background:transparent;box-shadow:none}.avaya-ipo-history_item:hover{background:var(--sd-surface-muted, #f7f7f7)}.avaya-ipo-history_avatar{width:44px;height:44px;border-radius:var(--sd-radius, 10px);display:flex;align-items:center;justify-content:center;background:var(--sd-avatar, #eceff3);font-weight:700;color:var(--sd-text, #333)}.avaya-ipo-history_body{flex:1;display:flex;flex-direction:column;gap:6px}.avaya-ipo-history_row{display:flex;align-items:center;justify-content:space-between;gap:10px}.avaya-ipo-history_name{font-weight:700;color:var(--sd-text, #333)}.avaya-ipo-history_name_missed{color:var(--sd-call-end, #e5484d)}.avaya-ipo-history_time{font-size:12px;color:var(--sd-text-muted, #5f6368)}.avaya-ipo-history_meta{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--sd-text-muted, #5f6368)}.avaya-ipo-history_meta .avaya-ipo-meta_label{display:inline-flex;align-items:center;gap:6px}.avaya-ipo-history_meta .avaya-ipo-meta_label svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round}.avaya-ipo-history_meta .avaya-ipo-direction_text{font-size:12px;font-weight:500}.avaya-ipo-history_meta.avaya-ipo-missed,.avaya-ipo-history_meta.avaya-ipo-caller_drop{color:var(--sd-call-end, #e5484d)}.avaya-ipo-history_meta .avaya-ipo-meta_label.avaya-ipo-inbound{color:var(--sd-call-accept, #1aa251)}.avaya-ipo-history_meta .avaya-ipo-meta_label.avaya-ipo-outbound{color:var(--sd-text-muted, #5f6368)}.avaya-ipo-history_meta .avaya-ipo-meta_label.avaya-ipo-missed{color:var(--sd-call-end, #e5484d)}.avaya-ipo-history_actions{display:flex;align-items:center;justify-content:center}.avaya-ipo-history_details_panel{padding:0 15px 12px;display:flex;flex-direction:column;gap:12px;height:100%;box-sizing:border-box;overflow-y:auto}.avaya-ipo-back_btn{width:80px;border:1px solid var(--sd-border, #e3e3e3);background:var(--sd-surface, #fff);color:var(--sd-text, #333);border-radius:var(--sd-radius-sm, 8px);padding:8px;cursor:pointer;font-weight:600}.avaya-ipo-back_btn:hover{background:var(--sd-surface-muted, #f7f7f7)}.avaya-ipo-history_skeleton{padding:12px 15px;display:flex;flex-direction:column;gap:12px}.avaya-ipo-skeleton_row{display:flex;align-items:center;gap:12px}.avaya-ipo-skeleton_avatar{width:42px;height:42px;border-radius:var(--sd-radius, 10px);background:var(--sd-surface-sunken, #e8e8e8);position:relative;overflow:hidden}.avaya-ipo-skeleton_body{flex:1;display:flex;flex-direction:column;gap:8px}.avaya-ipo-skeleton_meta{width:60px}.avaya-ipo-skeleton_line{height:10px;background:var(--sd-surface-sunken, #e8e8e8);border-radius:var(--sd-radius-sm, 8px);position:relative;overflow:hidden}.avaya-ipo-skeleton_line.avaya-ipo-wide{width:70%}.avaya-ipo-skeleton_line.avaya-ipo-medium{width:55%}.avaya-ipo-skeleton_line.avaya-ipo-short{width:50px}.avaya-ipo-shine:after{content:\"\";position:absolute;top:0;left:-150px;height:100%;width:120px;background:linear-gradient(90deg,#fff0,#fff9,#fff0);animation:shimmer 1.2s infinite}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-skeleton_avatar,:host-context(.avaya-ipo-dark-mode) .avaya-ipo-skeleton_line{background:var(--sd-surface-sunken, #1c222c)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-shine:after{background:linear-gradient(90deg,#0f111500,#555f6e73,#0f111500)}@keyframes shimmer{0%{transform:translate(0)}to{transform:translate(260px)}}.avaya-ipo-container_recent_item:hover .avaya-ipo-calling_btn{display:block;position:absolute;text-align:right;right:0;width:78px;height:38px;background:var(--sd-background-color)}.avaya-ipo-container_recent_item_image{display:flex;align-items:center}.avaya-ipo-container_recent_item_image_inner{margin:0 auto;padding:0;width:50px;height:50px;position:relative;border-radius:50%;display:flex;align-items:center;justify-content:center;font-family:var(--sd-text-font-family);font-size:26px;color:var(--sd-text-color-inverse);font-weight:400;background:#2a7b9b}.avaya-ipo-grd1{background:#718ede}.avaya-ipo-container_recent_item_left{display:flex;flex-basis:auto;flex-direction:column;flex-grow:1;justify-content:center;min-width:0;position:relative;border-top:1px solid var(--sd-border, #e3e3e3)}.avaya-ipo-container_recent_item_left_inner{display:flex;flex-basis:1;flex-direction:column;padding:0 0 0 10px}.avaya-ipo-container_recent_item_left .avaya-ipo-contact_field{font-size:13px;color:var(--sd-text-color-dark);margin-bottom:2px}.avaya-ipo-container_recent_item_left .avaya-ipo-missed_call_color{color:var(--sd-call-end, #e5484d)}.avaya-ipo-container_recent_item_left .avaya-ipo-recent_time_back{font-size:12px;color:var(--sd-text-color-medium)}.avaya-ipo-history_group_label{width:100%;padding:8px 15px 6px;font-size:11px;letter-spacing:.6px;color:var(--sd-text-muted, #5f6368);text-transform:uppercase;box-sizing:border-box;text-align:center;position:sticky;top:0;z-index:2;background:var(--sd-surface-muted, #f7f7f7);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}.avaya-ipo-container_recent_item_left .avaya-ipo-caller_drop{color:var(--sd-call-end, #e5484d)}.avaya-ipo-disconnect_badge{display:inline-flex;align-items:center;margin-left:6px;padding:2px 6px;border-radius:var(--sd-radius-sm, 8px);background:var(--sd-accent-soft, #fff1ea);color:var(--sd-call-end, #e5484d);font-size:10px;font-weight:600;letter-spacing:.2px}.avaya-ipo-container_recent_item_right{display:flex;flex-direction:row;position:absolute;right:0}.avaya-ipo-container_recent_item_right .avaya-ipo-right_field{display:flex;flex-basis:auto;justify-content:right}.avaya-ipo-container_recent_item_right .avaya-ipo-right_field_content{display:inline-block;border-radius:var(--sd-radius-pill, 999px);border:1px solid var(--sd-border, #e3e3e3);padding:5px 8px;font-size:11px;color:var(--sd-text-muted, #5f6368)}.avaya-ipo-calling_btn_inner{position:relative;width:100%;margin:0;padding:0;display:flex;justify-content:right}.avaya-ipo-button_recent_call{width:38px;height:38px;display:flex;flex-basis:auto;flex-direction:column;align-items:center;justify-content:center;line-height:normal;border-radius:var(--sd-radius-pill, 999px);outline:none;border:none;font-size:22px;font-weight:700;color:var(--sd-call-accept, #1aa251);background:var(--sd-surface-muted, #f7f7f7);border:1px solid var(--sd-border, #e3e3e3)}.avaya-ipo-container_call_history_not_found{position:absolute;width:100%;height:100%;display:flex;flex-basis:auto;flex-direction:column;flex-grow:1;align-items:center;background:var(--sd-surface, #fff)}.avaya-ipo-container_call_history_not_found h2{font-size:18px;font-weight:700;letter-spacing:-.65px;color:var(--sd-text, #333);text-align:center;padding-top:26px}.avaya-ipo-container_call_history_not_found p{font-size:12px;line-height:normal;color:var(--sd-text-muted, #5f6368);font-weight:600;white-space:normal;text-align:center;padding-top:10px}.avaya-ipo-icon_round_area_call_history{width:165px;height:75px;background:var(--sd-background-color) url(data:image/gif;base64,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) center no-repeat;border-radius:38px;display:flex;grid-row:1}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-container_recent_search input{background:var(--sd-input, #1c222c);border-color:var(--sd-input-border, #2a2f3a);color:var(--sd-text, #f2f4f8)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-container_recent_search input::placeholder{color:var(--sd-text-subtle, #7e8794)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-search_icon{color:var(--sd-text-subtle, #7e8794)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-history_name{color:var(--sd-text, #f2f4f8)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-history_time,:host-context(.avaya-ipo-dark-mode) .avaya-ipo-history_meta,:host-context(.avaya-ipo-dark-mode) .avaya-ipo-history_meta .avaya-ipo-direction_text{color:var(--sd-text-muted, #aab0bb)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-history_avatar{background:var(--sd-avatar, #222833);color:var(--sd-text, #f2f4f8)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-container_call_history_not_found{background:var(--sd-surface, #0f1115)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-container_call_history_not_found h2{color:var(--sd-text, #f2f4f8)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-container_call_history_not_found p{color:var(--sd-text-muted, #aab0bb)}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2$1.NativeElementInjectorDirective, selector: "[ngModel], [formControl], [formControlName]" }, { kind: "component", type: CallDetailsComponent, selector: "app-call-details", inputs: ["call"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
|
|
1658
1851
|
}
|
|
1659
1852
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: CallHistoryComponent, decorators: [{
|
|
1660
1853
|
type: Component,
|
|
1661
|
-
args: [{ selector: 'app-call-history', standalone: false, template: "<div class=\"recent_container_outer\">\n @if (showHistoryLoader) {\n <div class=\"history_skeleton\">\n @for (item of [1,2,3,4]; track item) {\n <div class=\"skeleton_row\">\n <div class=\"skeleton_avatar shine\"></div>\n <div class=\"skeleton_body\">\n <div class=\"skeleton_line wide shine\"></div>\n <div class=\"skeleton_line medium shine\"></div>\n </div>\n <div class=\"skeleton_meta\">\n <div class=\"skeleton_line short shine\"></div>\n </div>\n </div>\n }\n </div>\n } @else if (selectedCall) {\n <div class=\"history_details_panel\">\n <button class=\"back_btn\" type=\"button\" (click)=\"closeDetails()\">\u2190 Back</button>\n <app-call-details [call]=\"selectedCall\"></app-call-details>\n </div>\n } @else {\n @if (recentCallactiveTab === 'recentCall') {\n <div class=\"recent_tab_container\">\n <div class=\"container_recent_list\">\n @if (!selectedCall) {\n <div class=\"recent_options_header\">\n <div class=\"recent_inner\">\n <button class=\"recent_btn\" (click)=\"recentSelectTab('recentCall')\"\n [class.active]=\"$any(recentCallactiveTab) === 'recentCall'\">\n <span class=\"tab_icon\">\n <svg viewBox=\"0 0 512 512\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </span>\n <span>Recent</span>\n </button>\n <button class=\"recent_btn\" (click)=\"recentSelectTab('missedCall')\"\n [class.active]=\"$any(recentCallactiveTab) === 'missedCall'\">\n <span class=\"tab_icon\">\n <svg viewBox=\"0 0 512 512\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M504.971 75.029l-68-68C430.182.241 423.6-1.547 417.6.758 411.7 3.067 408 8.798 408 15v72H248C111.033 87 0 198.033 0 335v48c0 13.255 10.745 24 24 24h64c13.255 0 24-10.745 24-24v-48c0-74.991 61.009-136 136-136h160v72c0 6.202 3.7 11.933 9.6 14.242 6 2.305 12.582.517 16.629-3.758l68-68c9.373-9.373 9.373-24.569 0-33.941z\" />\n </svg>\n </span>\n <span>Missed Call</span>\n </button>\n </div>\n </div>\n <div class=\"container_recent_search\">\n <div class=\"search_wrap\">\n <svg class=\"search_icon\" viewBox=\"0 0 512 512\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M208 48C111 48 32 127 32 224s79 176 176 176c43.2 0 82.7-15.3 113.7-40.6l81.4 81.4c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-81.4-81.4C416.7 306.7 432 267.2 432 224 432 127 353 48 256 48zm-128 176c0-70.7 57.3-128 128-128s128 57.3 128 128-57.3 128-128 128S80 294.7 80 224z\"/>\n </svg>\n <input\n type=\"search\"\n placeholder=\"Search numbers or names\"\n [(ngModel)]=\"searchTerm\"\n />\n </div>\n </div>\n }\n <div class=\"container_recent_list_inner\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n @for (group of groupedRecent; track $index) {\n @if (group.label) {\n <div class=\"history_group_label\">{{ group.label }}</div>\n }\n @for (call of group.items; track $index) {\n <div class=\"outer_container_recent\">\n <div class=\"history_item\" (click)=\"onSelectCall(call)\">\n <div class=\"history_avatar grd1\">\n {{ getPhoneBadge(call) }}\n </div>\n <div class=\"history_body\">\n <div class=\"history_row\">\n <div class=\"history_name\" [class.history_name_missed]=\"call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0\">\n {{ getPhoneDisplay(call) }}\n </div>\n <div class=\"history_time\">{{ call.timestamp | date : \"hh:mm a\" }}</div>\n </div>\n <div class=\"history_meta\" [ngClass]=\"{\n missed: call.status === 'MISSED',\n caller_drop: call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0\n }\">\n <span class=\"meta_label\" [ngClass]=\"{\n inbound: call.direction?.toLowerCase() === 'inbound',\n outbound: call.direction?.toLowerCase() === 'outbound',\n missed: call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0\n }\">\n @if (call.direction?.toLowerCase() === 'inbound') {\n @if (call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0) {\n <svg viewBox=\"0 0 640 512\" width=\"12px\" aria-hidden=\"true\" style=\"fill: currentColor;\">\n <path d=\"M232 0c9.7 0 18.5 5.8 22.2 14.8s1.7 19.3-5.2 26.2l-39 39 58.7 58.7C282.3 152.4 300.8 160 320 160s37.7-7.6 51.3-21.3L503 7c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9L405.3 172.7C382.6 195.3 352 208 320 208s-62.6-12.7-85.3-35.3L176 113.9l-39 39c-6.9 6.9-17.2 8.9-26.2 5.2s-14.8-12.5-14.8-22.2L96 24c0-13.3 10.7-24 24-24L232 0zM51.4 489.9l-35.4-62c-9.7-16.9-8.3-38.1 5.5-51.7C72.6 325.9 178.1 256 320 256s247.4 69.9 298.5 120.2c13.9 13.6 15.2 34.8 5.5 51.7l-35.4 62c-7.4 12.9-22.7 19.1-37 14.8L438.8 470.8c-13.5-4.1-22.8-16.5-22.8-30.6l0-56.2c-62.3-20.8-129.7-20.8-192 0l0 56.2c0 14.1-9.3 26.6-22.8 30.6L88.4 504.7c-14.3 4.3-29.6-1.8-37-14.8z\" />\n </svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M17 7L7 17M7 17H17M7 17V7\" />\n </svg>\n }\n <span class=\"direction_text\">\n @if (call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0) {\n Missed call\n } @else {\n Incoming\n }\n </span>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M7 17L17 7M17 7H7M17 7V17\" />\n </svg>\n <span class=\"direction_text\">Outgoing</span>\n }\n </span>\n </div>\n </div>\n <div class=\"history_actions\">\n @if (mode === 'transfer') {\n <button class=\"button_recent_call\" (click)=\"transferEv.emit(call); $event.stopPropagation()\">\n <svg viewBox=\"0 0 512 512\" height=\"18px\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n } @else {\n <button class=\"button_recent_call\" (click)=\"\n makeCall(call.phoneNumber?.normalizedPhoneNumber, call.phoneNumber?.name || call.lookupPhoneNumber?.name); $event.stopPropagation()\n \">\n <svg viewBox=\"0 0 512 512\" height=\"18px\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n }\n </div>\n </div>\n </div>\n }\n }\n @if (callHistory.length === 0) {\n <div class=\"container_call_history_not_found\">\n <h2>No Call History</h2>\n <p>Your call history is empty</p>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n } @if (recentCallactiveTab === 'missedCall') {\n <div class=\"recent_tab_container\">\n <div class=\"container_recent_list\">\n @if (!selectedCall) {\n <div class=\"recent_options_header\">\n <div class=\"recent_inner\">\n <button class=\"recent_btn\" (click)=\"recentSelectTab('recentCall')\"\n [class.active]=\"$any(recentCallactiveTab) === 'recentCall'\">\n <span class=\"tab_icon\">\n <svg viewBox=\"0 0 512 512\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </span>\n <span>Recent</span>\n </button>\n <button class=\"recent_btn\" (click)=\"recentSelectTab('missedCall')\"\n [class.active]=\"$any(recentCallactiveTab) === 'missedCall'\">\n <span class=\"tab_icon\">\n <svg viewBox=\"0 0 512 512\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M504.971 75.029l-68-68C430.182.241 423.6-1.547 417.6.758 411.7 3.067 408 8.798 408 15v72H248C111.033 87 0 198.033 0 335v48c0 13.255 10.745 24 24 24h64c13.255 0 24-10.745 24-24v-48c0-74.991 61.009-136 136-136h160v72c0 6.202 3.7 11.933 9.6 14.242 6 2.305 12.582.517 16.629-3.758l68-68c9.373-9.373 9.373-24.569 0-33.941z\" />\n </svg>\n </span>\n <span>Missed Call</span>\n </button>\n </div>\n </div>\n <div class=\"container_recent_search\">\n <div class=\"search_wrap\">\n <svg class=\"search_icon\" viewBox=\"0 0 512 512\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M208 48C111 48 32 127 32 224s79 176 176 176c43.2 0 82.7-15.3 113.7-40.6l81.4 81.4c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-81.4-81.4C416.7 306.7 432 267.2 432 224 432 127 353 48 256 48zm-128 176c0-70.7 57.3-128 128-128s128 57.3 128 128-57.3 128-128 128S80 294.7 80 224z\"/>\n </svg>\n <input\n type=\"search\"\n placeholder=\"Search numbers or names\"\n [(ngModel)]=\"searchTerm\"\n />\n </div>\n </div>\n }\n <div class=\"container_recent_list_inner\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n @for (group of groupedMissed; track $index) {\n @if (group.label) {\n <div class=\"history_group_label\">{{ group.label }}</div>\n }\n @for (call of group.items; track $index) {\n <div class=\"outer_container_recent\">\n <div class=\"history_item\" (click)=\"onSelectCall(call)\">\n <div class=\"history_avatar grd1\">\n {{ getPhoneBadge(call) }}\n </div>\n <div class=\"history_body\">\n <div class=\"history_row\">\n <div class=\"history_name history_name_missed\">\n {{ getPhoneDisplay(call) }}\n </div>\n <div class=\"history_time\">{{ call.timestamp | date : \"hh:mm a\" }}</div>\n </div>\n <div class=\"history_meta caller_drop\">\n <span class=\"meta_label missed\">\n <svg viewBox=\"0 0 640 512\" width=\"12px\" aria-hidden=\"true\" style=\"fill: currentColor;\">\n <path d=\"M232 0c9.7 0 18.5 5.8 22.2 14.8s1.7 19.3-5.2 26.2l-39 39 58.7 58.7C282.3 152.4 300.8 160 320 160s37.7-7.6 51.3-21.3L503 7c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9L405.3 172.7C382.6 195.3 352 208 320 208s-62.6-12.7-85.3-35.3L176 113.9l-39 39c-6.9 6.9-17.2 8.9-26.2 5.2s-14.8-12.5-14.8-22.2L96 24c0-13.3 10.7-24 24-24L232 0zM51.4 489.9l-35.4-62c-9.7-16.9-8.3-38.1 5.5-51.7C72.6 325.9 178.1 256 320 256s247.4 69.9 298.5 120.2c13.9 13.6 15.2 34.8 5.5 51.7l-35.4 62c-7.4 12.9-22.7 19.1-37 14.8L438.8 470.8c-13.5-4.1-22.8-16.5-22.8-30.6l0-56.2c-62.3-20.8-129.7-20.8-192 0l0 56.2c0 14.1-9.3 26.6-22.8 30.6L88.4 504.7c-14.3 4.3-29.6-1.8-37-14.8z\" />\n </svg>\n <span class=\"direction_text\">Missed call</span>\n </span>\n </div>\n </div>\n <div class=\"history_actions\">\n <button class=\"button_recent_call\" (click)=\"selectFromHistory(call); $event.stopPropagation()\">\n <svg viewBox=\"0 0 512 512\" height=\"15px\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n }\n }\n @if (callerDropped.length === 0) {\n <div class=\"container_call_history_not_found\">\n <h2>No missed calls</h2>\n <p>No inbound calls ended by caller.</p>\n </div>\n }\n </div>\n <!-- /.scrollbox-content -->\n </div>\n <!-- /.scrollbox -->\n </div>\n <!-- /.container_recent_list_inner -->\n </div>\n <!-- /.container_recent_list -->\n </div>\n <!-- /.recent_tab_container -->\n }\n }\n</div>\n", styles: [":host{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}.recent_container_outer{margin:0;padding:0;width:100%;position:relative;display:flex;flex-direction:column;flex:1 1 auto;min-height:0;overflow-y:auto;padding-bottom:var(--sd-tabs-height, 60px)}.recent_options_header{margin:0;padding:12px 15px 8px;width:100%;text-align:center;position:sticky;top:0;z-index:6;background:var(--sd-surface, #fff)}.recent_inner{margin:0;padding:4px;width:100%;height:40px;background:#f2f3f7;border-radius:12px;display:flex;align-items:center;justify-content:center;gap:6px}.recent_btn{margin:0;padding:0 10px;width:50%;display:flex;align-items:center;justify-content:center;border:none;outline:none;background:transparent;height:32px;border-radius:10px;color:#6b6b6b;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;gap:6px;font-weight:600;font-size:13px}.recent_btn:hover{background:#e8e8ee;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.recent_btn.active{color:#1f1f1f;background:#fff;font-weight:700;box-shadow:0 2px 6px #0000000d}.tab_icon{display:flex;align-items:center;justify-content:center;color:inherit}.recent_heading{font-family:var(--sd-text-font-family);font-size:20px;color:var(--sd-text-color-dark);font-weight:700;letter-spacing:-.65px;padding:0 0 15px 15px;line-height:normal;margin:0;width:100%;max-width:100%;box-sizing:border-box;overflow:hidden}.container_recent_search{margin:0 0 15px;padding:0 15px;width:100%;max-width:100%;box-sizing:border-box;position:sticky;top:56px;z-index:5;background:var(--sd-surface, #fff)}.container_recent_search input{padding:0 42px;width:100%;outline:none;display:block;border:1px solid #e0e0e0;color:#1f1f1f;font-size:13px;letter-spacing:-.15px;font-family:var(--sd-text-font-family);background:#fafafa;font-style:normal;font-weight:600;position:relative;border-radius:12px;height:42px;box-shadow:inset 0 1px 2px #0000000f}.search_wrap{position:relative}.search_icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);color:#888}.recent_tab_container{margin:0;padding:0;width:100%;flex:1 1 auto;min-height:0;position:relative}.container_recent_list{width:100%;margin:0;padding:0;position:relative;flex:1 1 auto;min-height:0}.container_recent_list_inner{width:100%;position:relative;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:flex;flex-direction:column;flex:1 1 auto;min-height:0}.scrollbox{height:auto;overflow-y:visible;overflow-x:hidden;visibility:visible;padding:0 0 12px;position:relative;scroll-behavior:smooth;scrollbar-width:thin;width:100%;flex:1 1 auto;min-height:0}.outer_container_recent{width:100%;max-width:100%;margin:0;padding:0 15px;box-sizing:border-box;overflow:hidden}.container_recent_item{width:100%;position:relative;display:flex;flex-direction:row;height:auto;pointer-events:all;border-radius:8px;overflow:hidden;cursor:pointer}.calling_btn{display:none}.history_item{display:flex;align-items:center;gap:12px;padding:12px 0;border-bottom:1px solid #ededed;background:transparent;box-shadow:none}.history_item:hover{background:#f7f7f7}.history_avatar{width:44px;height:44px;border-radius:12px;display:flex;align-items:center;justify-content:center;background:#f0f0f0;font-weight:700;color:#333}.history_body{flex:1;display:flex;flex-direction:column;gap:6px}.history_row{display:flex;align-items:center;justify-content:space-between;gap:10px}.history_name{font-weight:700;color:#1f1f1f}.history_name_missed{color:#d14343}.history_time{font-size:12px;color:#666}.history_meta{display:flex;align-items:center;gap:8px;font-size:12px;color:#555}.history_meta .meta_label{display:inline-flex;align-items:center;gap:6px}.history_meta .meta_label svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round}.history_meta .direction_text{font-size:12px;font-weight:500}.history_meta.missed,.history_meta.caller_drop{color:#d14343}.history_meta .meta_label.inbound{color:#2b8a3e}.history_meta .meta_label.outbound{color:#1f6fb2}.history_meta .meta_label.missed{color:#d14343}.history_actions{display:flex;align-items:center;justify-content:center}.history_details_panel{padding:0 15px 12px;display:flex;flex-direction:column;gap:12px;height:100%;box-sizing:border-box;overflow-y:auto}.back_btn{width:80px;border:1px solid #e0e0e0;background:#fff;color:#333;border-radius:8px;padding:8px;cursor:pointer;font-weight:600}.history_skeleton{padding:12px 15px;display:flex;flex-direction:column;gap:12px}.skeleton_row{display:flex;align-items:center;gap:12px}.skeleton_avatar{width:42px;height:42px;border-radius:12px;background:#f0f0f0;position:relative;overflow:hidden}.skeleton_body{flex:1;display:flex;flex-direction:column;gap:8px}.skeleton_meta{width:60px}.skeleton_line{height:10px;background:#f0f0f0;border-radius:6px;position:relative;overflow:hidden}.skeleton_line.wide{width:70%}.skeleton_line.medium{width:55%}.skeleton_line.short{width:50px}.shine:after{content:\"\";position:absolute;top:0;left:-150px;height:100%;width:120px;background:linear-gradient(90deg,#fff0,#fff9,#fff0);animation:shimmer 1.2s infinite}:host-context(.dark-mode) .skeleton_avatar,:host-context(.dark-mode) .skeleton_line{background:#1e2430}:host-context(.dark-mode) .shine:after{background:linear-gradient(90deg,#0f111500,#555f6e73,#0f111500)}@keyframes shimmer{0%{transform:translate(0)}to{transform:translate(260px)}}.container_recent_item:hover .calling_btn{display:block;position:absolute;text-align:right;right:0;width:78px;height:38px;background:var(--sd-background-color)}.container_recent_item_image{display:flex;align-items:center}.container_recent_item_image_inner{margin:0 auto;padding:0;width:50px;height:50px;position:relative;border-radius:50%;display:flex;align-items:center;justify-content:center;font-family:var(--sd-text-font-family);font-size:26px;color:var(--sd-text-color-inverse);font-weight:400;background:#2a7b9b}.grd1{background:#718ede}.container_recent_item_left{display:flex;flex-basis:auto;flex-direction:column;flex-grow:1;justify-content:center;min-width:0;position:relative;border-top:1px solid #e9edef}.container_recent_item_left_inner{display:flex;flex-basis:1;flex-direction:column;padding:0 0 0 10px}.container_recent_item_left .contact_field{font-size:13px;color:var(--sd-text-color-dark);margin-bottom:2px}.container_recent_item_left .missed_call_color{color:#e0261f}.container_recent_item_left .recent_time_back{font-size:12px;color:var(--sd-text-color-medium)}.history_group_label{width:100%;padding:8px 15px 6px;font-size:11px;letter-spacing:.6px;color:var(--sd-text-color-medium);text-transform:uppercase;box-sizing:border-box;text-align:center;position:sticky;top:0;z-index:2;background:#f7f7f7eb;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}.container_recent_item_left .caller_drop{color:#e0261f}.disconnect_badge{display:inline-flex;align-items:center;margin-left:6px;padding:2px 6px;border-radius:8px;background:#e0261f1f;color:#e0261f;font-size:10px;font-weight:600;letter-spacing:.2px}.container_recent_item_right{display:flex;flex-direction:row;position:absolute;right:0}.container_recent_item_right .right_field{display:flex;flex-basis:auto;justify-content:right}.container_recent_item_right .right_field_content{display:inline-block;border-radius:26px;border:1px solid #e5e5e5;padding:5px 8px;font-size:11px;color:var(--sd-text-color)}.calling_btn_inner{position:relative;width:100%;margin:0;padding:0;display:flex;justify-content:right}.button_recent_call{width:38px;height:38px;display:flex;flex-basis:auto;flex-direction:column;align-items:center;justify-content:center;line-height:normal;border-radius:26px;outline:none;border:none;font-size:22px;font-weight:700;color:#6c0;background:#f1f1f1;border:1px solid #f1f1f1}.container_call_history_not_found{position:absolute;width:100%;height:100%;display:flex;flex-basis:auto;flex-direction:column;flex-grow:1;align-items:center;background:#f8f8f8}.container_call_history_not_found h2{font-size:18px;font-weight:700;letter-spacing:-.65px;color:var(--sd-text-color-dark);text-align:center;padding-top:26px}.container_call_history_not_found p{font-size:12px;line-height:normal;color:var(--sd-text-color);font-weight:600;white-space:normal;text-align:center;padding-top:10px}.icon_round_area_call_history{width:165px;height:75px;background:var(--sd-background-color) url(data:image/gif;base64,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) center no-repeat;border-radius:38px;display:flex;grid-row:1}:host-context(.dark-mode) .container_recent_search input{background:#1c222c;border-color:#2a2f3a;color:#f2f4f8}:host-context(.dark-mode) .container_recent_search input::placeholder{color:#aab0bb}:host-context(.dark-mode) .search_icon{color:#aab0bb}:host-context(.dark-mode) .history_name{color:#f2f4f8}:host-context(.dark-mode) .history_time,:host-context(.dark-mode) .history_meta,:host-context(.dark-mode) .history_meta .direction_text{color:#aab0bb}:host-context(.dark-mode) .history_avatar{background:#222833;color:#f2f4f8}:host-context(.dark-mode) .container_call_history_not_found{background:#12161e}:host-context(.dark-mode) .container_call_history_not_found h2,:host-context(.dark-mode) .container_call_history_not_found p{color:#aab0bb}\n"] }]
|
|
1662
|
-
}], ctorParameters: () => [{ type: i1.
|
|
1854
|
+
args: [{ selector: 'app-call-history', standalone: false, template: "<div class=\"avaya-ipo-recent_container_outer\">\n @if (selectedCall) {\n <div class=\"avaya-ipo-history_details_panel\">\n <button class=\"avaya-ipo-back_btn\" type=\"button\" (click)=\"closeDetails()\">\u2190 Back</button>\n <app-call-details [call]=\"selectedCall\"></app-call-details>\n </div>\n } @else {\n @if (recentCallactiveTab === 'recentCall') {\n <div class=\"avaya-ipo-recent_tab_container\">\n <div class=\"avaya-ipo-container_recent_list\">\n @if (!selectedCall) {\n <div class=\"avaya-ipo-recent_options_header\">\n <div class=\"avaya-ipo-recent_inner\">\n <button class=\"avaya-ipo-recent_btn\" (click)=\"recentSelectTab('recentCall')\"\n [class.avaya-ipo-active]=\"$any(recentCallactiveTab) === 'recentCall'\">\n <span class=\"avaya-ipo-tab_icon\">\n <svg viewBox=\"0 0 512 512\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </span>\n <span>Recent</span>\n </button>\n <button class=\"avaya-ipo-recent_btn\" (click)=\"recentSelectTab('missedCall')\"\n [class.avaya-ipo-active]=\"$any(recentCallactiveTab) === 'missedCall'\">\n <span class=\"avaya-ipo-tab_icon\">\n <svg viewBox=\"0 0 512 512\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M504.971 75.029l-68-68C430.182.241 423.6-1.547 417.6.758 411.7 3.067 408 8.798 408 15v72H248C111.033 87 0 198.033 0 335v48c0 13.255 10.745 24 24 24h64c13.255 0 24-10.745 24-24v-48c0-74.991 61.009-136 136-136h160v72c0 6.202 3.7 11.933 9.6 14.242 6 2.305 12.582.517 16.629-3.758l68-68c9.373-9.373 9.373-24.569 0-33.941z\" />\n </svg>\n </span>\n <span>Missed Call</span>\n </button>\n </div>\n </div>\n <div class=\"avaya-ipo-container_recent_search\">\n <div class=\"avaya-ipo-search_wrap\">\n <svg class=\"avaya-ipo-search_icon\" viewBox=\"0 0 512 512\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M208 48C111 48 32 127 32 224s79 176 176 176c43.2 0 82.7-15.3 113.7-40.6l81.4 81.4c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-81.4-81.4C416.7 306.7 432 267.2 432 224 432 127 353 48 256 48zm-128 176c0-70.7 57.3-128 128-128s128 57.3 128 128-57.3 128-128 128S80 294.7 80 224z\"/>\n </svg>\n <input\n type=\"search\"\n placeholder=\"Search numbers or names\"\n [(ngModel)]=\"searchTerm\"\n />\n </div>\n </div>\n }\n <div class=\"avaya-ipo-container_recent_list_inner\">\n <div class=\"avaya-ipo-scrollbox\">\n @if (showHistoryLoader) {\n <div class=\"avaya-ipo-history_skeleton\">\n @for (item of [1,2,3,4]; track item) {\n <div class=\"avaya-ipo-skeleton_row\">\n <div class=\"avaya-ipo-skeleton_avatar avaya-ipo-shine\"></div>\n <div class=\"avaya-ipo-skeleton_body\">\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-wide avaya-ipo-shine\"></div>\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-medium avaya-ipo-shine\"></div>\n </div>\n <div class=\"avaya-ipo-skeleton_meta\">\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-short avaya-ipo-shine\"></div>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"avaya-ipo-scrollbox-content\">\n @for (group of groupedRecent; track $index) {\n @if (group.label) {\n <div class=\"avaya-ipo-history_group_label\">{{ group.label }}</div>\n }\n @for (call of group.items; track $index) {\n <div class=\"avaya-ipo-outer_container_recent\">\n <div class=\"avaya-ipo-history_item\" (click)=\"onSelectCall(call)\">\n <div class=\"avaya-ipo-history_avatar avaya-ipo-grd1\">\n {{ getPhoneBadge(call) }}\n </div>\n <div class=\"avaya-ipo-history_body\">\n <div class=\"avaya-ipo-history_row\">\n <div class=\"avaya-ipo-history_name\" [class.avaya-ipo-history_name_missed]=\"call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0\">\n {{ getPhoneDisplay(call) }}\n </div>\n <div class=\"avaya-ipo-history_time\">{{ call.timestamp | date : \"hh:mm a\" }}</div>\n </div>\n <div class=\"avaya-ipo-history_meta\" [ngClass]=\"{\n 'avaya-ipo-missed': call.status === 'MISSED',\n 'avaya-ipo-caller_drop': call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0\n }\">\n <span class=\"avaya-ipo-meta_label\" [ngClass]=\"{\n 'avaya-ipo-inbound': call.direction?.toLowerCase() === 'inbound',\n 'avaya-ipo-outbound': call.direction?.toLowerCase() === 'outbound',\n 'avaya-ipo-missed': call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0\n }\">\n @if (call.direction?.toLowerCase() === 'inbound') {\n @if (call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0) {\n <svg viewBox=\"0 0 640 512\" width=\"12px\" aria-hidden=\"true\" style=\"fill: currentColor;\">\n <path d=\"M232 0c9.7 0 18.5 5.8 22.2 14.8s1.7 19.3-5.2 26.2l-39 39 58.7 58.7C282.3 152.4 300.8 160 320 160s37.7-7.6 51.3-21.3L503 7c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9L405.3 172.7C382.6 195.3 352 208 320 208s-62.6-12.7-85.3-35.3L176 113.9l-39 39c-6.9 6.9-17.2 8.9-26.2 5.2s-14.8-12.5-14.8-22.2L96 24c0-13.3 10.7-24 24-24L232 0zM51.4 489.9l-35.4-62c-9.7-16.9-8.3-38.1 5.5-51.7C72.6 325.9 178.1 256 320 256s247.4 69.9 298.5 120.2c13.9 13.6 15.2 34.8 5.5 51.7l-35.4 62c-7.4 12.9-22.7 19.1-37 14.8L438.8 470.8c-13.5-4.1-22.8-16.5-22.8-30.6l0-56.2c-62.3-20.8-129.7-20.8-192 0l0 56.2c0 14.1-9.3 26.6-22.8 30.6L88.4 504.7c-14.3 4.3-29.6-1.8-37-14.8z\" />\n </svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M17 7L7 17M7 17H17M7 17V7\" />\n </svg>\n }\n <span class=\"avaya-ipo-direction_text\">\n @if (call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0) {\n Missed call\n } @else {\n Incoming\n }\n </span>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M7 17L17 7M17 7H7M17 7V17\" />\n </svg>\n <span class=\"avaya-ipo-direction_text\">Outgoing</span>\n }\n </span>\n </div>\n </div>\n <div class=\"avaya-ipo-history_actions\">\n @if (mode === 'transfer') {\n <button class=\"avaya-ipo-button_recent_call\" (click)=\"transferEv.emit(call); $event.stopPropagation()\">\n <svg viewBox=\"0 0 512 512\" height=\"18px\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n } @else {\n <button class=\"avaya-ipo-button_recent_call\" (click)=\"\n makeCall(call.phoneNumber?.normalizedPhoneNumber, call.phoneNumber?.name || call.lookupPhoneNumber?.name); $event.stopPropagation()\n \">\n <svg viewBox=\"0 0 512 512\" height=\"18px\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n }\n </div>\n </div>\n </div>\n }\n }\n @if (callHistory.length === 0) {\n <div class=\"avaya-ipo-container_call_history_not_found\">\n <h2>No Call History</h2>\n <p>Your call history is empty</p>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n } @if (recentCallactiveTab === 'missedCall') {\n <div class=\"avaya-ipo-recent_tab_container\">\n <div class=\"avaya-ipo-container_recent_list\">\n @if (!selectedCall) {\n <div class=\"avaya-ipo-recent_options_header\">\n <div class=\"avaya-ipo-recent_inner\">\n <button class=\"avaya-ipo-recent_btn\" (click)=\"recentSelectTab('recentCall')\"\n [class.avaya-ipo-active]=\"$any(recentCallactiveTab) === 'recentCall'\">\n <span class=\"avaya-ipo-tab_icon\">\n <svg viewBox=\"0 0 512 512\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </span>\n <span>Recent</span>\n </button>\n <button class=\"avaya-ipo-recent_btn\" (click)=\"recentSelectTab('missedCall')\"\n [class.avaya-ipo-active]=\"$any(recentCallactiveTab) === 'missedCall'\">\n <span class=\"avaya-ipo-tab_icon\">\n <svg viewBox=\"0 0 512 512\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M504.971 75.029l-68-68C430.182.241 423.6-1.547 417.6.758 411.7 3.067 408 8.798 408 15v72H248C111.033 87 0 198.033 0 335v48c0 13.255 10.745 24 24 24h64c13.255 0 24-10.745 24-24v-48c0-74.991 61.009-136 136-136h160v72c0 6.202 3.7 11.933 9.6 14.242 6 2.305 12.582.517 16.629-3.758l68-68c9.373-9.373 9.373-24.569 0-33.941z\" />\n </svg>\n </span>\n <span>Missed Call</span>\n </button>\n </div>\n </div>\n <div class=\"avaya-ipo-container_recent_search\">\n <div class=\"avaya-ipo-search_wrap\">\n <svg class=\"avaya-ipo-search_icon\" viewBox=\"0 0 512 512\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M208 48C111 48 32 127 32 224s79 176 176 176c43.2 0 82.7-15.3 113.7-40.6l81.4 81.4c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-81.4-81.4C416.7 306.7 432 267.2 432 224 432 127 353 48 256 48zm-128 176c0-70.7 57.3-128 128-128s128 57.3 128 128-57.3 128-128 128S80 294.7 80 224z\"/>\n </svg>\n <input\n type=\"search\"\n placeholder=\"Search numbers or names\"\n [(ngModel)]=\"searchTerm\"\n />\n </div>\n </div>\n }\n <div class=\"avaya-ipo-container_recent_list_inner\">\n <div class=\"avaya-ipo-scrollbox\">\n @if (showHistoryLoader) {\n <div class=\"avaya-ipo-history_skeleton\">\n @for (item of [1,2,3,4]; track item) {\n <div class=\"avaya-ipo-skeleton_row\">\n <div class=\"avaya-ipo-skeleton_avatar avaya-ipo-shine\"></div>\n <div class=\"avaya-ipo-skeleton_body\">\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-wide avaya-ipo-shine\"></div>\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-medium avaya-ipo-shine\"></div>\n </div>\n <div class=\"avaya-ipo-skeleton_meta\">\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-short avaya-ipo-shine\"></div>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"avaya-ipo-scrollbox-content\">\n @for (group of groupedMissed; track $index) {\n @if (group.label) {\n <div class=\"avaya-ipo-history_group_label\">{{ group.label }}</div>\n }\n @for (call of group.items; track $index) {\n <div class=\"avaya-ipo-outer_container_recent\">\n <div class=\"avaya-ipo-history_item\" (click)=\"onSelectCall(call)\">\n <div class=\"avaya-ipo-history_avatar avaya-ipo-grd1\">\n {{ getPhoneBadge(call) }}\n </div>\n <div class=\"avaya-ipo-history_body\">\n <div class=\"avaya-ipo-history_row\">\n <div class=\"avaya-ipo-history_name avaya-ipo-history_name_missed\">\n {{ getPhoneDisplay(call) }}\n </div>\n <div class=\"avaya-ipo-history_time\">{{ call.timestamp | date : \"hh:mm a\" }}</div>\n </div>\n <div class=\"avaya-ipo-history_meta avaya-ipo-caller_drop\">\n <span class=\"avaya-ipo-meta_label avaya-ipo-missed\">\n <svg viewBox=\"0 0 640 512\" width=\"12px\" aria-hidden=\"true\" style=\"fill: currentColor;\">\n <path d=\"M232 0c9.7 0 18.5 5.8 22.2 14.8s1.7 19.3-5.2 26.2l-39 39 58.7 58.7C282.3 152.4 300.8 160 320 160s37.7-7.6 51.3-21.3L503 7c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9L405.3 172.7C382.6 195.3 352 208 320 208s-62.6-12.7-85.3-35.3L176 113.9l-39 39c-6.9 6.9-17.2 8.9-26.2 5.2s-14.8-12.5-14.8-22.2L96 24c0-13.3 10.7-24 24-24L232 0zM51.4 489.9l-35.4-62c-9.7-16.9-8.3-38.1 5.5-51.7C72.6 325.9 178.1 256 320 256s247.4 69.9 298.5 120.2c13.9 13.6 15.2 34.8 5.5 51.7l-35.4 62c-7.4 12.9-22.7 19.1-37 14.8L438.8 470.8c-13.5-4.1-22.8-16.5-22.8-30.6l0-56.2c-62.3-20.8-129.7-20.8-192 0l0 56.2c0 14.1-9.3 26.6-22.8 30.6L88.4 504.7c-14.3 4.3-29.6-1.8-37-14.8z\" />\n </svg>\n <span class=\"avaya-ipo-direction_text\">Missed call</span>\n </span>\n </div>\n </div>\n <div class=\"avaya-ipo-history_actions\">\n <button class=\"avaya-ipo-button_recent_call\" (click)=\"selectFromHistory(call); $event.stopPropagation()\">\n <svg viewBox=\"0 0 512 512\" height=\"15px\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n }\n }\n @if (callerDropped.length === 0) {\n <div class=\"avaya-ipo-container_call_history_not_found\">\n <h2>No missed calls</h2>\n <p>No inbound calls ended by caller.</p>\n </div>\n }\n </div>\n }\n <!-- /.scrollbox-content -->\n </div>\n <!-- /.scrollbox -->\n </div>\n <!-- /.container_recent_list_inner -->\n </div>\n <!-- /.container_recent_list -->\n </div>\n <!-- /.recent_tab_container -->\n }\n }\n</div>\n", styles: [":host{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;overflow-x:hidden}.avaya-ipo-recent_container_outer{margin:0;padding:0;width:100%;position:relative;display:flex;flex-direction:column;flex:1 1 auto;min-height:0;overflow:hidden}.avaya-ipo-recent_options_header{margin:0;padding:12px 15px 8px;text-align:center;position:sticky;top:0;z-index:6;background:var(--sd-surface, #fff)}.avaya-ipo-recent_inner{margin:0;padding:4px;background:var(--sd-surface-muted, #f7f7f7);border-radius:var(--sd-radius, 10px);display:flex;align-items:center;justify-content:center;gap:6px}.avaya-ipo-recent_btn{margin:0;padding:0 10px;width:50%;display:flex;align-items:center;justify-content:center;border:none;outline:none;background:transparent;height:32px;border-radius:var(--sd-radius-sm, 8px);color:var(--sd-text-muted, #5f6368);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;gap:6px;font-weight:600;font-size:13px}.avaya-ipo-recent_btn:hover{background:var(--sd-surface-sunken, #e8e8e8);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.avaya-ipo-recent_btn.avaya-ipo-active{color:var(--sd-text, #333);background:var(--sd-surface, #fff);font-weight:700;box-shadow:var(--sd-shadow-sm, 0 1px 2px rgba(16, 24, 40, .06))}.avaya-ipo-tab_icon{display:flex;align-items:center;justify-content:center;color:inherit}.avaya-ipo-recent_heading{font-family:var(--sd-text-font-family);font-size:20px;color:var(--sd-text-color-dark);font-weight:700;letter-spacing:-.65px;padding:0 0 15px 15px;line-height:normal;margin:0;width:100%;max-width:100%;box-sizing:border-box;overflow:hidden}.avaya-ipo-container_recent_search{margin:0 0 15px;padding:0 15px;width:100%;max-width:100%;box-sizing:border-box;position:sticky;top:56px;z-index:5;background:var(--sd-surface, #fff)}.avaya-ipo-container_recent_search input{padding:0 42px;width:100%;outline:none;display:block;border:1px solid var(--sd-input-border, #c9c9c9);color:var(--sd-text, #333);font-size:13px;letter-spacing:-.15px;font-family:var(--sd-text-font-family);background:var(--sd-input, #fff);font-style:normal;font-weight:600;position:relative;border-radius:var(--sd-radius-sm, 8px);height:42px;box-shadow:var(--sd-shadow-sm, 0 1px 2px rgba(16, 24, 40, .06));transition:border-color .15s ease,box-shadow .15s ease}.avaya-ipo-container_recent_search input::placeholder{color:var(--sd-text-subtle, #9ca3af)}.avaya-ipo-container_recent_search input:focus{border-color:var(--sd-accent, #ff6633);box-shadow:var(--sd-focus-ring, 0 0 0 3px rgba(255, 102, 51, .22))}.avaya-ipo-search_wrap{position:relative}.avaya-ipo-search_icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);color:var(--sd-text-subtle, #9ca3af)}.avaya-ipo-recent_tab_container{margin:0;padding:0;width:100%;flex:1 1 auto;min-height:0;position:relative;display:flex;flex-direction:column}.avaya-ipo-container_recent_list{width:100%;margin:0;padding:0;position:relative;flex:1 1 auto;min-height:0;max-width:100%;overflow-x:hidden;box-sizing:border-box;display:flex;flex-direction:column}.avaya-ipo-container_recent_list_inner{width:100%;position:relative;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:flex;flex-direction:column;flex:1 1 auto;min-height:0}.avaya-ipo-scrollbox{height:auto;overflow-y:auto;overflow-x:hidden;visibility:visible;padding:0 0 calc(var(--sd-tabs-height, 60px) + 12px) 0;position:relative;scroll-behavior:smooth;scrollbar-width:thin;width:100%;flex:1 1 auto;min-height:0;max-height:100%}.avaya-ipo-outer_container_recent{width:100%;max-width:100%;margin:0;padding:0 15px;box-sizing:border-box;overflow:hidden}.avaya-ipo-container_recent_item{width:100%;position:relative;display:flex;flex-direction:row;height:auto;pointer-events:all;border-radius:var(--sd-radius-sm, 8px);overflow:hidden;cursor:pointer}.avaya-ipo-calling_btn{display:none}.avaya-ipo-history_item{display:flex;align-items:center;gap:12px;padding:12px 0;border-bottom:1px solid var(--sd-border, #e3e3e3);background:transparent;box-shadow:none}.avaya-ipo-history_item:hover{background:var(--sd-surface-muted, #f7f7f7)}.avaya-ipo-history_avatar{width:44px;height:44px;border-radius:var(--sd-radius, 10px);display:flex;align-items:center;justify-content:center;background:var(--sd-avatar, #eceff3);font-weight:700;color:var(--sd-text, #333)}.avaya-ipo-history_body{flex:1;display:flex;flex-direction:column;gap:6px}.avaya-ipo-history_row{display:flex;align-items:center;justify-content:space-between;gap:10px}.avaya-ipo-history_name{font-weight:700;color:var(--sd-text, #333)}.avaya-ipo-history_name_missed{color:var(--sd-call-end, #e5484d)}.avaya-ipo-history_time{font-size:12px;color:var(--sd-text-muted, #5f6368)}.avaya-ipo-history_meta{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--sd-text-muted, #5f6368)}.avaya-ipo-history_meta .avaya-ipo-meta_label{display:inline-flex;align-items:center;gap:6px}.avaya-ipo-history_meta .avaya-ipo-meta_label svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round}.avaya-ipo-history_meta .avaya-ipo-direction_text{font-size:12px;font-weight:500}.avaya-ipo-history_meta.avaya-ipo-missed,.avaya-ipo-history_meta.avaya-ipo-caller_drop{color:var(--sd-call-end, #e5484d)}.avaya-ipo-history_meta .avaya-ipo-meta_label.avaya-ipo-inbound{color:var(--sd-call-accept, #1aa251)}.avaya-ipo-history_meta .avaya-ipo-meta_label.avaya-ipo-outbound{color:var(--sd-text-muted, #5f6368)}.avaya-ipo-history_meta .avaya-ipo-meta_label.avaya-ipo-missed{color:var(--sd-call-end, #e5484d)}.avaya-ipo-history_actions{display:flex;align-items:center;justify-content:center}.avaya-ipo-history_details_panel{padding:0 15px 12px;display:flex;flex-direction:column;gap:12px;height:100%;box-sizing:border-box;overflow-y:auto}.avaya-ipo-back_btn{width:80px;border:1px solid var(--sd-border, #e3e3e3);background:var(--sd-surface, #fff);color:var(--sd-text, #333);border-radius:var(--sd-radius-sm, 8px);padding:8px;cursor:pointer;font-weight:600}.avaya-ipo-back_btn:hover{background:var(--sd-surface-muted, #f7f7f7)}.avaya-ipo-history_skeleton{padding:12px 15px;display:flex;flex-direction:column;gap:12px}.avaya-ipo-skeleton_row{display:flex;align-items:center;gap:12px}.avaya-ipo-skeleton_avatar{width:42px;height:42px;border-radius:var(--sd-radius, 10px);background:var(--sd-surface-sunken, #e8e8e8);position:relative;overflow:hidden}.avaya-ipo-skeleton_body{flex:1;display:flex;flex-direction:column;gap:8px}.avaya-ipo-skeleton_meta{width:60px}.avaya-ipo-skeleton_line{height:10px;background:var(--sd-surface-sunken, #e8e8e8);border-radius:var(--sd-radius-sm, 8px);position:relative;overflow:hidden}.avaya-ipo-skeleton_line.avaya-ipo-wide{width:70%}.avaya-ipo-skeleton_line.avaya-ipo-medium{width:55%}.avaya-ipo-skeleton_line.avaya-ipo-short{width:50px}.avaya-ipo-shine:after{content:\"\";position:absolute;top:0;left:-150px;height:100%;width:120px;background:linear-gradient(90deg,#fff0,#fff9,#fff0);animation:shimmer 1.2s infinite}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-skeleton_avatar,:host-context(.avaya-ipo-dark-mode) .avaya-ipo-skeleton_line{background:var(--sd-surface-sunken, #1c222c)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-shine:after{background:linear-gradient(90deg,#0f111500,#555f6e73,#0f111500)}@keyframes shimmer{0%{transform:translate(0)}to{transform:translate(260px)}}.avaya-ipo-container_recent_item:hover .avaya-ipo-calling_btn{display:block;position:absolute;text-align:right;right:0;width:78px;height:38px;background:var(--sd-background-color)}.avaya-ipo-container_recent_item_image{display:flex;align-items:center}.avaya-ipo-container_recent_item_image_inner{margin:0 auto;padding:0;width:50px;height:50px;position:relative;border-radius:50%;display:flex;align-items:center;justify-content:center;font-family:var(--sd-text-font-family);font-size:26px;color:var(--sd-text-color-inverse);font-weight:400;background:#2a7b9b}.avaya-ipo-grd1{background:#718ede}.avaya-ipo-container_recent_item_left{display:flex;flex-basis:auto;flex-direction:column;flex-grow:1;justify-content:center;min-width:0;position:relative;border-top:1px solid var(--sd-border, #e3e3e3)}.avaya-ipo-container_recent_item_left_inner{display:flex;flex-basis:1;flex-direction:column;padding:0 0 0 10px}.avaya-ipo-container_recent_item_left .avaya-ipo-contact_field{font-size:13px;color:var(--sd-text-color-dark);margin-bottom:2px}.avaya-ipo-container_recent_item_left .avaya-ipo-missed_call_color{color:var(--sd-call-end, #e5484d)}.avaya-ipo-container_recent_item_left .avaya-ipo-recent_time_back{font-size:12px;color:var(--sd-text-color-medium)}.avaya-ipo-history_group_label{width:100%;padding:8px 15px 6px;font-size:11px;letter-spacing:.6px;color:var(--sd-text-muted, #5f6368);text-transform:uppercase;box-sizing:border-box;text-align:center;position:sticky;top:0;z-index:2;background:var(--sd-surface-muted, #f7f7f7);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}.avaya-ipo-container_recent_item_left .avaya-ipo-caller_drop{color:var(--sd-call-end, #e5484d)}.avaya-ipo-disconnect_badge{display:inline-flex;align-items:center;margin-left:6px;padding:2px 6px;border-radius:var(--sd-radius-sm, 8px);background:var(--sd-accent-soft, #fff1ea);color:var(--sd-call-end, #e5484d);font-size:10px;font-weight:600;letter-spacing:.2px}.avaya-ipo-container_recent_item_right{display:flex;flex-direction:row;position:absolute;right:0}.avaya-ipo-container_recent_item_right .avaya-ipo-right_field{display:flex;flex-basis:auto;justify-content:right}.avaya-ipo-container_recent_item_right .avaya-ipo-right_field_content{display:inline-block;border-radius:var(--sd-radius-pill, 999px);border:1px solid var(--sd-border, #e3e3e3);padding:5px 8px;font-size:11px;color:var(--sd-text-muted, #5f6368)}.avaya-ipo-calling_btn_inner{position:relative;width:100%;margin:0;padding:0;display:flex;justify-content:right}.avaya-ipo-button_recent_call{width:38px;height:38px;display:flex;flex-basis:auto;flex-direction:column;align-items:center;justify-content:center;line-height:normal;border-radius:var(--sd-radius-pill, 999px);outline:none;border:none;font-size:22px;font-weight:700;color:var(--sd-call-accept, #1aa251);background:var(--sd-surface-muted, #f7f7f7);border:1px solid var(--sd-border, #e3e3e3)}.avaya-ipo-container_call_history_not_found{position:absolute;width:100%;height:100%;display:flex;flex-basis:auto;flex-direction:column;flex-grow:1;align-items:center;background:var(--sd-surface, #fff)}.avaya-ipo-container_call_history_not_found h2{font-size:18px;font-weight:700;letter-spacing:-.65px;color:var(--sd-text, #333);text-align:center;padding-top:26px}.avaya-ipo-container_call_history_not_found p{font-size:12px;line-height:normal;color:var(--sd-text-muted, #5f6368);font-weight:600;white-space:normal;text-align:center;padding-top:10px}.avaya-ipo-icon_round_area_call_history{width:165px;height:75px;background:var(--sd-background-color) url(data:image/gif;base64,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) center no-repeat;border-radius:38px;display:flex;grid-row:1}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-container_recent_search input{background:var(--sd-input, #1c222c);border-color:var(--sd-input-border, #2a2f3a);color:var(--sd-text, #f2f4f8)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-container_recent_search input::placeholder{color:var(--sd-text-subtle, #7e8794)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-search_icon{color:var(--sd-text-subtle, #7e8794)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-history_name{color:var(--sd-text, #f2f4f8)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-history_time,:host-context(.avaya-ipo-dark-mode) .avaya-ipo-history_meta,:host-context(.avaya-ipo-dark-mode) .avaya-ipo-history_meta .avaya-ipo-direction_text{color:var(--sd-text-muted, #aab0bb)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-history_avatar{background:var(--sd-avatar, #222833);color:var(--sd-text, #f2f4f8)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-container_call_history_not_found{background:var(--sd-surface, #0f1115)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-container_call_history_not_found h2{color:var(--sd-text, #f2f4f8)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-container_call_history_not_found p{color:var(--sd-text-muted, #aab0bb)}\n"] }]
|
|
1855
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1$1.AppSyncHelperService }, { type: i1$1.SnugdeskAuthenticationService }], propDecorators: { mode: [{
|
|
1663
1856
|
type: Input
|
|
1664
1857
|
}], tenantId: [{
|
|
1665
1858
|
type: Input
|
|
@@ -1690,11 +1883,11 @@ class ContactCardComponent {
|
|
|
1690
1883
|
this.call.emit(ev);
|
|
1691
1884
|
}
|
|
1692
1885
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: ContactCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1693
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.9", type: ContactCardComponent, isStandalone: false, selector: "app-contact-card", inputs: { name: "name", phone: "phone" }, outputs: { call: "call" }, ngImport: i0, template: "<div class=\"contact-card\">\n <div class=\"contact-avatar grd1\">{{ initials }}</div>\n <div class=\"contact-body\">\n <div class=\"contact-name\">{{ name }}</div>\n <div class=\"contact-phone\">{{ phone }}</div>\n </div>\n <button type=\"button\" class=\"contact-call-btn\" (click)=\"onCall($event)\">\n <svg viewBox=\"0 0 512 512\" height=\"18\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n</div>\n", styles: [".contact-card{display:flex;align-items:center;gap:12px;padding:12px 0;border-bottom:1px solid
|
|
1886
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.9", type: ContactCardComponent, isStandalone: false, selector: "app-contact-card", inputs: { name: "name", phone: "phone" }, outputs: { call: "call" }, ngImport: i0, template: "<div class=\"avaya-ipo-contact-card\">\n <div class=\"avaya-ipo-contact-avatar avaya-ipo-grd1\">{{ initials }}</div>\n <div class=\"avaya-ipo-contact-body\">\n <div class=\"avaya-ipo-contact-name\">{{ name }}</div>\n <div class=\"avaya-ipo-contact-phone\">{{ phone }}</div>\n </div>\n <button type=\"button\" class=\"avaya-ipo-contact-call-btn\" (click)=\"onCall($event)\">\n <svg viewBox=\"0 0 512 512\" height=\"18\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n</div>\n", styles: [".avaya-ipo-contact-card{display:flex;align-items:center;gap:12px;padding:12px 0;border-bottom:1px solid var(--sd-border);background:transparent}.avaya-ipo-contact-avatar{width:44px;height:44px;border-radius:var(--sd-radius-lg);display:flex;align-items:center;justify-content:center;font-weight:700;color:var(--sd-text);background:var(--sd-avatar)}.avaya-ipo-contact-body{flex:1;display:flex;flex-direction:column;gap:6px}.avaya-ipo-contact-call-btn{width:38px;height:38px;border-radius:var(--sd-radius-pill);border:1px solid var(--sd-border);background:var(--sd-surface-muted);color:var(--sd-call-accept);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:background .15s ease,border-color .15s ease}.avaya-ipo-contact-call-btn:hover{background:var(--sd-surface-sunken)}.avaya-ipo-contact-call-btn:focus-visible{outline:none;box-shadow:var(--sd-focus-ring)}.avaya-ipo-contact-name{font-weight:700;color:var(--sd-text)}.avaya-ipo-contact-phone{font-size:12px;color:var(--sd-text-muted);font-weight:500}.avaya-ipo-grd1{background:var(--sd-avatar)}\n"] });
|
|
1694
1887
|
}
|
|
1695
1888
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: ContactCardComponent, decorators: [{
|
|
1696
1889
|
type: Component,
|
|
1697
|
-
args: [{ selector: 'app-contact-card', standalone: false, template: "<div class=\"contact-card\">\n <div class=\"contact-avatar grd1\">{{ initials }}</div>\n <div class=\"contact-body\">\n <div class=\"contact-name\">{{ name }}</div>\n <div class=\"contact-phone\">{{ phone }}</div>\n </div>\n <button type=\"button\" class=\"contact-call-btn\" (click)=\"onCall($event)\">\n <svg viewBox=\"0 0 512 512\" height=\"18\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n</div>\n", styles: [".contact-card{display:flex;align-items:center;gap:12px;padding:12px 0;border-bottom:1px solid
|
|
1890
|
+
args: [{ selector: 'app-contact-card', standalone: false, template: "<div class=\"avaya-ipo-contact-card\">\n <div class=\"avaya-ipo-contact-avatar avaya-ipo-grd1\">{{ initials }}</div>\n <div class=\"avaya-ipo-contact-body\">\n <div class=\"avaya-ipo-contact-name\">{{ name }}</div>\n <div class=\"avaya-ipo-contact-phone\">{{ phone }}</div>\n </div>\n <button type=\"button\" class=\"avaya-ipo-contact-call-btn\" (click)=\"onCall($event)\">\n <svg viewBox=\"0 0 512 512\" height=\"18\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n</div>\n", styles: [".avaya-ipo-contact-card{display:flex;align-items:center;gap:12px;padding:12px 0;border-bottom:1px solid var(--sd-border);background:transparent}.avaya-ipo-contact-avatar{width:44px;height:44px;border-radius:var(--sd-radius-lg);display:flex;align-items:center;justify-content:center;font-weight:700;color:var(--sd-text);background:var(--sd-avatar)}.avaya-ipo-contact-body{flex:1;display:flex;flex-direction:column;gap:6px}.avaya-ipo-contact-call-btn{width:38px;height:38px;border-radius:var(--sd-radius-pill);border:1px solid var(--sd-border);background:var(--sd-surface-muted);color:var(--sd-call-accept);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:background .15s ease,border-color .15s ease}.avaya-ipo-contact-call-btn:hover{background:var(--sd-surface-sunken)}.avaya-ipo-contact-call-btn:focus-visible{outline:none;box-shadow:var(--sd-focus-ring)}.avaya-ipo-contact-name{font-weight:700;color:var(--sd-text)}.avaya-ipo-contact-phone{font-size:12px;color:var(--sd-text-muted);font-weight:500}.avaya-ipo-grd1{background:var(--sd-avatar)}\n"] }]
|
|
1698
1891
|
}], propDecorators: { name: [{
|
|
1699
1892
|
type: Input
|
|
1700
1893
|
}], phone: [{
|
|
@@ -1738,11 +1931,11 @@ class ContactDetailsComponent {
|
|
|
1738
1931
|
return `${parts[0][0]}${parts[parts.length - 1][0]}`.toUpperCase();
|
|
1739
1932
|
}
|
|
1740
1933
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: ContactDetailsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1741
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: ContactDetailsComponent, isStandalone: false, selector: "app-contact-details", inputs: { contact: "contact" }, ngImport: i0, template: "<div class=\"call-profile\">\n <div class=\"profile-header\">\n <div class=\"avatar\">{{ getInitials() }}</div>\n <div class=\"profile-info\">\n <div class=\"primary-number\">{{ getDisplayName() }}</div>\n <div class=\"secondary-info\">{{ getPrimaryPhone() }}</div>\n <div class=\"meta-line\">\n @if (contact?.is_organization) {\n <span class=\"dir outbound\">Organization</span>\n } @else {\n <span class=\"dir inbound\">Individual</span>\n }\n <span class=\"divider\">|</span>\n <span>{{ contact?.is_blocked ? 'Blocked' : 'Active' }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"detail-card\">\n <div class=\"detail-row\">\n <div class=\"label\">Phones</div>\n <div class=\"value\">\n @if (getPhoneNumbers().length) {\n {{ getPhoneNumbers().join(', ') }}\n } @else {\n N/A\n }\n </div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Emails</div>\n <div class=\"value\">\n @if (getEmails().length) {\n {{ getEmails().join(', ') }}\n } @else {\n N/A\n }\n </div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Allow Call</div>\n <div class=\"value\">{{ contact?.allow_call ? 'Yes' : 'No' }}</div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Allow Email</div>\n <div class=\"value\">{{ contact?.allow_email ? 'Yes' : 'No' }}</div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Allow SMS</div>\n <div class=\"value\">{{ contact?.allow_sms ? 'Yes' : 'No' }}</div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Allow WhatsApp</div>\n <div class=\"value\">{{ contact?.allow_whatsapp ? 'Yes' : 'No' }}</div>\n </div>\n </div>\n\n <div class=\"detail-card\">\n <div class=\"detail-row\">\n <div class=\"label\">Created</div>\n <div class=\"value\">{{ contact?.created_at ? (contact.created_at * 1000 | date : 'medium') : 'N/A' }}</div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Updated</div>\n <div class=\"value\">{{ contact?.updated_at ? (contact.updated_at * 1000 | date : 'medium') : 'N/A' }}</div>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;width:100%;box-sizing:border-box}.call-profile{display:flex;flex-direction:column;gap:14px;font-family:Open Sans,Helvetica Neue,Arial,sans-serif;color
|
|
1934
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: ContactDetailsComponent, isStandalone: false, selector: "app-contact-details", inputs: { contact: "contact" }, ngImport: i0, template: "<div class=\"avaya-ipo-call-profile\">\n <div class=\"avaya-ipo-profile-header\">\n <div class=\"avaya-ipo-avatar\">{{ getInitials() }}</div>\n <div class=\"avaya-ipo-profile-info\">\n <div class=\"avaya-ipo-primary-number\">{{ getDisplayName() }}</div>\n <div class=\"avaya-ipo-secondary-info\">{{ getPrimaryPhone() }}</div>\n <div class=\"avaya-ipo-meta-line\">\n @if (contact?.is_organization) {\n <span class=\"avaya-ipo-dir avaya-ipo-outbound\">Organization</span>\n } @else {\n <span class=\"avaya-ipo-dir avaya-ipo-inbound\">Individual</span>\n }\n <span class=\"avaya-ipo-divider\">|</span>\n <span>{{ contact?.is_blocked ? 'Blocked' : 'Active' }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"avaya-ipo-detail-card\">\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Phones</div>\n <div class=\"avaya-ipo-value\">\n @if (getPhoneNumbers().length) {\n {{ getPhoneNumbers().join(', ') }}\n } @else {\n N/A\n }\n </div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Emails</div>\n <div class=\"avaya-ipo-value\">\n @if (getEmails().length) {\n {{ getEmails().join(', ') }}\n } @else {\n N/A\n }\n </div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Allow Call</div>\n <div class=\"avaya-ipo-value\">{{ contact?.allow_call ? 'Yes' : 'No' }}</div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Allow Email</div>\n <div class=\"avaya-ipo-value\">{{ contact?.allow_email ? 'Yes' : 'No' }}</div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Allow SMS</div>\n <div class=\"avaya-ipo-value\">{{ contact?.allow_sms ? 'Yes' : 'No' }}</div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Allow WhatsApp</div>\n <div class=\"avaya-ipo-value\">{{ contact?.allow_whatsapp ? 'Yes' : 'No' }}</div>\n </div>\n </div>\n\n <div class=\"avaya-ipo-detail-card\">\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Created</div>\n <div class=\"avaya-ipo-value\">{{ contact?.created_at ? (contact.created_at * 1000 | date : 'medium') : 'N/A' }}</div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Updated</div>\n <div class=\"avaya-ipo-value\">{{ contact?.updated_at ? (contact.updated_at * 1000 | date : 'medium') : 'N/A' }}</div>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;width:100%;box-sizing:border-box}.avaya-ipo-call-profile{display:flex;flex-direction:column;gap:14px;font-family:Open Sans,Helvetica Neue,Arial,sans-serif;color:var(--sd-text)}.avaya-ipo-profile-header{display:flex;gap:12px;align-items:center;padding:12px;border-radius:var(--sd-radius-lg);background:var(--sd-surface-muted)}.avaya-ipo-avatar{width:52px;height:52px;border-radius:var(--sd-radius-lg);background:var(--sd-avatar);display:flex;align-items:center;justify-content:center;font-weight:800;font-size:14px;color:var(--sd-text)}.avaya-ipo-profile-info{display:flex;flex-direction:column;gap:6px}.avaya-ipo-primary-number{font-size:16px;font-weight:800;color:var(--sd-text)}.avaya-ipo-secondary-info{font-size:12px;color:var(--sd-text-muted)}.avaya-ipo-meta-line{display:flex;gap:6px;align-items:center;font-size:12px;color:var(--sd-text-muted);flex-wrap:wrap}.avaya-ipo-meta-line .avaya-ipo-divider{color:var(--sd-text-subtle)}.avaya-ipo-meta-line .avaya-ipo-dir.avaya-ipo-inbound{color:var(--sd-call-accept)}.avaya-ipo-meta-line .avaya-ipo-dir.avaya-ipo-outbound{color:var(--sd-accent)}.avaya-ipo-detail-card{display:flex;flex-direction:column;gap:10px;padding:12px;border-radius:var(--sd-radius-lg);background:var(--sd-card);border:1px solid var(--sd-border)}.avaya-ipo-detail-row{display:flex;justify-content:space-between;align-items:center;gap:12px}.avaya-ipo-label{font-weight:700;color:var(--sd-text-muted);font-size:13px}.avaya-ipo-value{color:var(--sd-text);text-align:right;font-weight:600;font-size:13px}\n"], dependencies: [{ kind: "pipe", type: i2.DatePipe, name: "date" }] });
|
|
1742
1935
|
}
|
|
1743
1936
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: ContactDetailsComponent, decorators: [{
|
|
1744
1937
|
type: Component,
|
|
1745
|
-
args: [{ selector: 'app-contact-details', standalone: false, template: "<div class=\"call-profile\">\n <div class=\"profile-header\">\n <div class=\"avatar\">{{ getInitials() }}</div>\n <div class=\"profile-info\">\n <div class=\"primary-number\">{{ getDisplayName() }}</div>\n <div class=\"secondary-info\">{{ getPrimaryPhone() }}</div>\n <div class=\"meta-line\">\n @if (contact?.is_organization) {\n <span class=\"dir outbound\">Organization</span>\n } @else {\n <span class=\"dir inbound\">Individual</span>\n }\n <span class=\"divider\">|</span>\n <span>{{ contact?.is_blocked ? 'Blocked' : 'Active' }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"detail-card\">\n <div class=\"detail-row\">\n <div class=\"label\">Phones</div>\n <div class=\"value\">\n @if (getPhoneNumbers().length) {\n {{ getPhoneNumbers().join(', ') }}\n } @else {\n N/A\n }\n </div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Emails</div>\n <div class=\"value\">\n @if (getEmails().length) {\n {{ getEmails().join(', ') }}\n } @else {\n N/A\n }\n </div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Allow Call</div>\n <div class=\"value\">{{ contact?.allow_call ? 'Yes' : 'No' }}</div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Allow Email</div>\n <div class=\"value\">{{ contact?.allow_email ? 'Yes' : 'No' }}</div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Allow SMS</div>\n <div class=\"value\">{{ contact?.allow_sms ? 'Yes' : 'No' }}</div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Allow WhatsApp</div>\n <div class=\"value\">{{ contact?.allow_whatsapp ? 'Yes' : 'No' }}</div>\n </div>\n </div>\n\n <div class=\"detail-card\">\n <div class=\"detail-row\">\n <div class=\"label\">Created</div>\n <div class=\"value\">{{ contact?.created_at ? (contact.created_at * 1000 | date : 'medium') : 'N/A' }}</div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Updated</div>\n <div class=\"value\">{{ contact?.updated_at ? (contact.updated_at * 1000 | date : 'medium') : 'N/A' }}</div>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;width:100%;box-sizing:border-box}.call-profile{display:flex;flex-direction:column;gap:14px;font-family:Open Sans,Helvetica Neue,Arial,sans-serif;color
|
|
1938
|
+
args: [{ selector: 'app-contact-details', standalone: false, template: "<div class=\"avaya-ipo-call-profile\">\n <div class=\"avaya-ipo-profile-header\">\n <div class=\"avaya-ipo-avatar\">{{ getInitials() }}</div>\n <div class=\"avaya-ipo-profile-info\">\n <div class=\"avaya-ipo-primary-number\">{{ getDisplayName() }}</div>\n <div class=\"avaya-ipo-secondary-info\">{{ getPrimaryPhone() }}</div>\n <div class=\"avaya-ipo-meta-line\">\n @if (contact?.is_organization) {\n <span class=\"avaya-ipo-dir avaya-ipo-outbound\">Organization</span>\n } @else {\n <span class=\"avaya-ipo-dir avaya-ipo-inbound\">Individual</span>\n }\n <span class=\"avaya-ipo-divider\">|</span>\n <span>{{ contact?.is_blocked ? 'Blocked' : 'Active' }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"avaya-ipo-detail-card\">\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Phones</div>\n <div class=\"avaya-ipo-value\">\n @if (getPhoneNumbers().length) {\n {{ getPhoneNumbers().join(', ') }}\n } @else {\n N/A\n }\n </div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Emails</div>\n <div class=\"avaya-ipo-value\">\n @if (getEmails().length) {\n {{ getEmails().join(', ') }}\n } @else {\n N/A\n }\n </div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Allow Call</div>\n <div class=\"avaya-ipo-value\">{{ contact?.allow_call ? 'Yes' : 'No' }}</div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Allow Email</div>\n <div class=\"avaya-ipo-value\">{{ contact?.allow_email ? 'Yes' : 'No' }}</div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Allow SMS</div>\n <div class=\"avaya-ipo-value\">{{ contact?.allow_sms ? 'Yes' : 'No' }}</div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Allow WhatsApp</div>\n <div class=\"avaya-ipo-value\">{{ contact?.allow_whatsapp ? 'Yes' : 'No' }}</div>\n </div>\n </div>\n\n <div class=\"avaya-ipo-detail-card\">\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Created</div>\n <div class=\"avaya-ipo-value\">{{ contact?.created_at ? (contact.created_at * 1000 | date : 'medium') : 'N/A' }}</div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Updated</div>\n <div class=\"avaya-ipo-value\">{{ contact?.updated_at ? (contact.updated_at * 1000 | date : 'medium') : 'N/A' }}</div>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;width:100%;box-sizing:border-box}.avaya-ipo-call-profile{display:flex;flex-direction:column;gap:14px;font-family:Open Sans,Helvetica Neue,Arial,sans-serif;color:var(--sd-text)}.avaya-ipo-profile-header{display:flex;gap:12px;align-items:center;padding:12px;border-radius:var(--sd-radius-lg);background:var(--sd-surface-muted)}.avaya-ipo-avatar{width:52px;height:52px;border-radius:var(--sd-radius-lg);background:var(--sd-avatar);display:flex;align-items:center;justify-content:center;font-weight:800;font-size:14px;color:var(--sd-text)}.avaya-ipo-profile-info{display:flex;flex-direction:column;gap:6px}.avaya-ipo-primary-number{font-size:16px;font-weight:800;color:var(--sd-text)}.avaya-ipo-secondary-info{font-size:12px;color:var(--sd-text-muted)}.avaya-ipo-meta-line{display:flex;gap:6px;align-items:center;font-size:12px;color:var(--sd-text-muted);flex-wrap:wrap}.avaya-ipo-meta-line .avaya-ipo-divider{color:var(--sd-text-subtle)}.avaya-ipo-meta-line .avaya-ipo-dir.avaya-ipo-inbound{color:var(--sd-call-accept)}.avaya-ipo-meta-line .avaya-ipo-dir.avaya-ipo-outbound{color:var(--sd-accent)}.avaya-ipo-detail-card{display:flex;flex-direction:column;gap:10px;padding:12px;border-radius:var(--sd-radius-lg);background:var(--sd-card);border:1px solid var(--sd-border)}.avaya-ipo-detail-row{display:flex;justify-content:space-between;align-items:center;gap:12px}.avaya-ipo-label{font-weight:700;color:var(--sd-text-muted);font-size:13px}.avaya-ipo-value{color:var(--sd-text);text-align:right;font-weight:600;font-size:13px}\n"] }]
|
|
1746
1939
|
}], propDecorators: { contact: [{
|
|
1747
1940
|
type: Input
|
|
1748
1941
|
}] } });
|
|
@@ -1971,7 +2164,9 @@ class ContactsComponent {
|
|
|
1971
2164
|
if (!el || this.isLoading || this.isLoadingMore || !this.hasMore) {
|
|
1972
2165
|
return;
|
|
1973
2166
|
}
|
|
1974
|
-
|
|
2167
|
+
// Only auto-fill when the container is actually bounded (clientHeight > 0); guards against an
|
|
2168
|
+
// unbounded layout looping loadNextPage forever.
|
|
2169
|
+
if (el.clientHeight > 0 && el.scrollHeight <= el.clientHeight + 4) {
|
|
1975
2170
|
this.loadNextPage();
|
|
1976
2171
|
}
|
|
1977
2172
|
}, 0);
|
|
@@ -1981,18 +2176,22 @@ class ContactsComponent {
|
|
|
1981
2176
|
return letter >= 'A' && letter <= 'Z' ? letter : '#';
|
|
1982
2177
|
}
|
|
1983
2178
|
getPageSize() {
|
|
1984
|
-
|
|
1985
|
-
|
|
2179
|
+
// Size pages to the ACTUAL scroll container, not the window — so a small popup box doesn't
|
|
2180
|
+
// over-fetch and a large/standalone layout doesn't loop. Fall back to window math, then a default.
|
|
2181
|
+
const el = this.listEl?.nativeElement;
|
|
2182
|
+
const available = el && el.clientHeight > 0
|
|
2183
|
+
? el.clientHeight
|
|
2184
|
+
: Math.max(280, (typeof window !== 'undefined' ? window.innerHeight : 800) - 260);
|
|
1986
2185
|
const rowHeight = 64;
|
|
1987
2186
|
const rows = Math.ceil(available / rowHeight);
|
|
1988
2187
|
return Math.max(10, rows);
|
|
1989
2188
|
}
|
|
1990
2189
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: ContactsComponent, deps: [{ token: EntitiesSearchService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1991
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: ContactsComponent, isStandalone: false, selector: "app-contacts", inputs: { tenantId: "tenantId" }, outputs: { makeCallEv: "makeCallEv" }, viewQueries: [{ propertyName: "listEl", first: true, predicate: ["listEl"], descendants: true }], ngImport: i0, template: "<div class=\"contacts-panel\">\n @if (!selectedContact) {\n <div class=\"contacts-search\">\n <span class=\"contacts-search-icon\">\uD83D\uDD0D</span>\n <input\n type=\"text\"\n placeholder=\"Search contacts\"\n [value]=\"searchTerm\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n </div>\n }\n @if (isLoading) {\n <div class=\"history_skeleton\">\n @for (item of [1,2,3,4]; track item) {\n <div class=\"skeleton_row\">\n <div class=\"skeleton_avatar shine\"></div>\n <div class=\"skeleton_body\">\n <div class=\"skeleton_line wide shine\"></div>\n <div class=\"skeleton_line medium shine\"></div>\n </div>\n <div class=\"skeleton_meta\">\n <div class=\"skeleton_line short shine\"></div>\n </div>\n </div>\n }\n </div>\n } @else if (error) {\n <div class=\"contacts-state error\">{{ error }}</div>\n } @else if (selectedContact) {\n <div class=\"contact-details\">\n <div class=\"contact-details-actions\">\n <button type=\"button\" class=\"contact-back\" (click)=\"closeContact()\">\u2190 Back</button>\n <button type=\"button\" class=\"contact-call\" (click)=\"onCallContact(selectedContact)\">Call</button>\n </div>\n <app-contact-details [contact]=\"selectedContact.entity\"></app-contact-details>\n </div>\n } @else if (contacts.length === 0) {\n <div class=\"contacts-state\">No contacts found.</div>\n } @else {\n <div class=\"contacts-list\" (scroll)=\"onListScroll($event)\" #listEl>\n @for (group of groupedContacts; track group.label) {\n <div class=\"history_group_label\">{{ group.label }}</div>\n @for (contact of group.items; track contact.id) {\n <button type=\"button\" class=\"contact-item-btn\" (click)=\"openContact(contact)\">\n <app-contact-card [name]=\"contact.name\" [phone]=\"contact.phone\" (call)=\"onCallContact(contact, $event)\"></app-contact-card>\n </button>\n }\n }\n @if (isLoadingMore) {\n <div class=\"contacts-load-more\">\n <div class=\"contacts-spinner\" aria-hidden=\"true\"></div>\n </div>\n }\n </div>\n }\n</div>\n", styles: [".contacts-panel{padding:0 15px 20px;display:flex;flex-direction:column;gap:12px;overflow:hidden;flex:1 1 auto;min-height:0}:host{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}.contacts-search{position:relative;width:100%;box-sizing:border-box}.contacts-search input{padding:0 42px;width:100%;max-width:100%;box-sizing:border-box;outline:none;display:block;border:1px solid
|
|
2190
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: ContactsComponent, isStandalone: false, selector: "app-contacts", inputs: { tenantId: "tenantId" }, outputs: { makeCallEv: "makeCallEv" }, viewQueries: [{ propertyName: "listEl", first: true, predicate: ["listEl"], descendants: true }], ngImport: i0, template: "<div class=\"avaya-ipo-contacts-panel\">\n @if (!selectedContact) {\n <div class=\"avaya-ipo-contacts-search\">\n <span class=\"avaya-ipo-contacts-search-icon\">\uD83D\uDD0D</span>\n <input\n type=\"text\"\n placeholder=\"Search contacts\"\n [value]=\"searchTerm\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n </div>\n }\n @if (isLoading) {\n <div class=\"avaya-ipo-history_skeleton\">\n @for (item of [1,2,3,4]; track item) {\n <div class=\"avaya-ipo-skeleton_row\">\n <div class=\"avaya-ipo-skeleton_avatar avaya-ipo-shine\"></div>\n <div class=\"avaya-ipo-skeleton_body\">\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-wide avaya-ipo-shine\"></div>\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-medium avaya-ipo-shine\"></div>\n </div>\n <div class=\"avaya-ipo-skeleton_meta\">\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-short avaya-ipo-shine\"></div>\n </div>\n </div>\n }\n </div>\n } @else if (error) {\n <div class=\"avaya-ipo-contacts-state avaya-ipo-error\">{{ error }}</div>\n } @else if (selectedContact) {\n <div class=\"avaya-ipo-contact-details\">\n <div class=\"avaya-ipo-contact-details-actions\">\n <button type=\"button\" class=\"avaya-ipo-contact-back\" (click)=\"closeContact()\">\u2190 Back</button>\n <button type=\"button\" class=\"avaya-ipo-contact-call\" (click)=\"onCallContact(selectedContact)\">Call</button>\n </div>\n <app-contact-details [contact]=\"selectedContact.entity\"></app-contact-details>\n </div>\n } @else if (contacts.length === 0) {\n <div class=\"avaya-ipo-contacts-state\">No contacts found.</div>\n } @else {\n <div class=\"avaya-ipo-contacts-list\" (scroll)=\"onListScroll($event)\" #listEl>\n @for (group of groupedContacts; track group.label) {\n <div class=\"avaya-ipo-history_group_label\">{{ group.label }}</div>\n @for (contact of group.items; track contact.id) {\n <button type=\"button\" class=\"avaya-ipo-contact-item-btn\" (click)=\"openContact(contact)\">\n <app-contact-card [name]=\"contact.name\" [phone]=\"contact.phone\" (call)=\"onCallContact(contact, $event)\"></app-contact-card>\n </button>\n }\n }\n @if (isLoadingMore) {\n <div class=\"avaya-ipo-contacts-load-more\">\n <div class=\"avaya-ipo-contacts-spinner\" aria-hidden=\"true\"></div>\n </div>\n }\n </div>\n }\n</div>\n", styles: [".avaya-ipo-contacts-panel{padding:0 15px 20px;display:flex;flex-direction:column;gap:12px;overflow:hidden;flex:1 1 auto;min-height:0}:host{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}.avaya-ipo-contacts-search{position:relative;width:100%;box-sizing:border-box}.avaya-ipo-contacts-search input{padding:0 42px;width:100%;max-width:100%;box-sizing:border-box;outline:none;display:block;border:1px solid var(--sd-input-border);color:var(--sd-text);font-size:13px;letter-spacing:-.15px;background:var(--sd-input);font-weight:600;border-radius:var(--sd-radius-sm);height:42px;transition:border-color .15s ease,box-shadow .15s ease}.avaya-ipo-contacts-search input::placeholder{color:var(--sd-text-subtle)}.avaya-ipo-contacts-search input:focus{border-color:var(--sd-accent);box-shadow:var(--sd-focus-ring)}.avaya-ipo-contacts-search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);font-size:14px;color:var(--sd-text-subtle)}.avaya-ipo-contacts-list{display:flex;flex-direction:column;overflow-y:auto;padding-bottom:calc(var(--sd-tabs-height, 60px) + 12px);flex:1 1 auto;min-height:0;max-height:none}.avaya-ipo-contact-item-btn{width:100%;padding:0;border:none;background:transparent;text-align:left;cursor:pointer}.avaya-ipo-contact-item-btn:hover .avaya-ipo-contact-card{background:var(--sd-surface-muted)}.avaya-ipo-contact-details{padding:0 0 12px;display:flex;flex-direction:column;gap:12px}.avaya-ipo-contact-details-actions{display:flex;align-items:center;justify-content:space-between;gap:12px}.avaya-ipo-contact-call{border:none;background:var(--sd-call-accept);color:var(--sd-accent-contrast);padding:8px 14px;border-radius:var(--sd-radius-sm);font-weight:700;cursor:pointer;transition:filter .15s ease}.avaya-ipo-contact-call:hover{filter:brightness(.94)}.avaya-ipo-contact-call:focus-visible{outline:none;box-shadow:var(--sd-focus-ring)}.avaya-ipo-contact-back{width:90px;border:1px solid var(--sd-border);background:var(--sd-surface-muted);color:var(--sd-text);border-radius:var(--sd-radius-sm);padding:8px;cursor:pointer;font-weight:600;transition:background .15s ease}.avaya-ipo-contact-back:hover{background:var(--sd-surface-sunken)}.avaya-ipo-contact-back:focus-visible{outline:none;box-shadow:var(--sd-focus-ring)}.avaya-ipo-history_group_label{font-size:12px;font-weight:700;color:var(--sd-text-muted);text-transform:uppercase;letter-spacing:.08em;padding:6px 0;position:sticky;top:0;z-index:2;background:var(--sd-surface);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}.avaya-ipo-history_skeleton{padding:12px 0;display:flex;flex-direction:column;gap:12px}.avaya-ipo-skeleton_row{display:flex;align-items:center;gap:12px}.avaya-ipo-skeleton_avatar{width:42px;height:42px;border-radius:var(--sd-radius-lg);background:var(--sd-surface-sunken);position:relative;overflow:hidden}.avaya-ipo-skeleton_body{flex:1;display:flex;flex-direction:column;gap:8px}.avaya-ipo-skeleton_meta{width:60px}.avaya-ipo-skeleton_line{height:10px;background:var(--sd-surface-sunken);border-radius:6px;position:relative;overflow:hidden}.avaya-ipo-skeleton_line.avaya-ipo-wide{width:70%}.avaya-ipo-skeleton_line.avaya-ipo-medium{width:55%}.avaya-ipo-skeleton_line.avaya-ipo-short{width:50px}.avaya-ipo-shine:after{content:\"\";position:absolute;top:0;left:-150px;height:100%;width:120px;background:linear-gradient(90deg,#fff0,#fff9,#fff0);animation:shimmer 1.2s infinite}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-skeleton_avatar,:host-context(.avaya-ipo-dark-mode) .avaya-ipo-skeleton_line{background:var(--sd-surface-sunken)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-shine:after{background:linear-gradient(90deg,#0f111500,#555f6e73,#0f111500)}@keyframes shimmer{0%{transform:translate(0)}to{transform:translate(260px)}}.avaya-ipo-contacts-state{padding:16px;font-size:13px;color:var(--sd-text-muted);text-align:center}.avaya-ipo-contacts-state.avaya-ipo-error{color:var(--sd-call-end);background:var(--sd-surface-muted);border-radius:var(--sd-radius)}.avaya-ipo-contacts-load-more{padding:12px 0 18px;display:flex;justify-content:center}.avaya-ipo-contacts-spinner{width:22px;height:22px;border-radius:50%;border:2px solid var(--sd-border);border-top-color:var(--sd-accent);animation:contacts-spin .8s linear infinite}@keyframes contacts-spin{to{transform:rotate(360deg)}}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-history_group_label{color:var(--sd-text-muted);background:var(--sd-surface)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-contact-phone,:host-context(.avaya-ipo-dark-mode) .avaya-ipo-contacts-state{color:var(--sd-text-muted)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-contacts-search input{background:var(--sd-input);border-color:var(--sd-input-border);color:var(--sd-text)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-contacts-search input::placeholder{color:var(--sd-text-subtle)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-contacts-search-icon{color:var(--sd-text-subtle)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-contact-call{background:var(--sd-call-accept);color:var(--sd-accent-contrast)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-contact-back{background:var(--sd-surface-muted);border-color:var(--sd-border);color:var(--sd-text)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-contact-item-btn:hover .avaya-ipo-contact-card{background:var(--sd-surface-muted)}\n"], dependencies: [{ kind: "component", type: ContactCardComponent, selector: "app-contact-card", inputs: ["name", "phone"], outputs: ["call"] }, { kind: "component", type: ContactDetailsComponent, selector: "app-contact-details", inputs: ["contact"] }] });
|
|
1992
2191
|
}
|
|
1993
2192
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: ContactsComponent, decorators: [{
|
|
1994
2193
|
type: Component,
|
|
1995
|
-
args: [{ selector: 'app-contacts', standalone: false, template: "<div class=\"contacts-panel\">\n @if (!selectedContact) {\n <div class=\"contacts-search\">\n <span class=\"contacts-search-icon\">\uD83D\uDD0D</span>\n <input\n type=\"text\"\n placeholder=\"Search contacts\"\n [value]=\"searchTerm\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n </div>\n }\n @if (isLoading) {\n <div class=\"history_skeleton\">\n @for (item of [1,2,3,4]; track item) {\n <div class=\"skeleton_row\">\n <div class=\"skeleton_avatar shine\"></div>\n <div class=\"skeleton_body\">\n <div class=\"skeleton_line wide shine\"></div>\n <div class=\"skeleton_line medium shine\"></div>\n </div>\n <div class=\"skeleton_meta\">\n <div class=\"skeleton_line short shine\"></div>\n </div>\n </div>\n }\n </div>\n } @else if (error) {\n <div class=\"contacts-state error\">{{ error }}</div>\n } @else if (selectedContact) {\n <div class=\"contact-details\">\n <div class=\"contact-details-actions\">\n <button type=\"button\" class=\"contact-back\" (click)=\"closeContact()\">\u2190 Back</button>\n <button type=\"button\" class=\"contact-call\" (click)=\"onCallContact(selectedContact)\">Call</button>\n </div>\n <app-contact-details [contact]=\"selectedContact.entity\"></app-contact-details>\n </div>\n } @else if (contacts.length === 0) {\n <div class=\"contacts-state\">No contacts found.</div>\n } @else {\n <div class=\"contacts-list\" (scroll)=\"onListScroll($event)\" #listEl>\n @for (group of groupedContacts; track group.label) {\n <div class=\"history_group_label\">{{ group.label }}</div>\n @for (contact of group.items; track contact.id) {\n <button type=\"button\" class=\"contact-item-btn\" (click)=\"openContact(contact)\">\n <app-contact-card [name]=\"contact.name\" [phone]=\"contact.phone\" (call)=\"onCallContact(contact, $event)\"></app-contact-card>\n </button>\n }\n }\n @if (isLoadingMore) {\n <div class=\"contacts-load-more\">\n <div class=\"contacts-spinner\" aria-hidden=\"true\"></div>\n </div>\n }\n </div>\n }\n</div>\n", styles: [".contacts-panel{padding:0 15px 20px;display:flex;flex-direction:column;gap:12px;overflow:hidden;flex:1 1 auto;min-height:0}:host{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}.contacts-search{position:relative;width:100%;box-sizing:border-box}.contacts-search input{padding:0 42px;width:100%;max-width:100%;box-sizing:border-box;outline:none;display:block;border:1px solid
|
|
2194
|
+
args: [{ selector: 'app-contacts', standalone: false, template: "<div class=\"avaya-ipo-contacts-panel\">\n @if (!selectedContact) {\n <div class=\"avaya-ipo-contacts-search\">\n <span class=\"avaya-ipo-contacts-search-icon\">\uD83D\uDD0D</span>\n <input\n type=\"text\"\n placeholder=\"Search contacts\"\n [value]=\"searchTerm\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n </div>\n }\n @if (isLoading) {\n <div class=\"avaya-ipo-history_skeleton\">\n @for (item of [1,2,3,4]; track item) {\n <div class=\"avaya-ipo-skeleton_row\">\n <div class=\"avaya-ipo-skeleton_avatar avaya-ipo-shine\"></div>\n <div class=\"avaya-ipo-skeleton_body\">\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-wide avaya-ipo-shine\"></div>\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-medium avaya-ipo-shine\"></div>\n </div>\n <div class=\"avaya-ipo-skeleton_meta\">\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-short avaya-ipo-shine\"></div>\n </div>\n </div>\n }\n </div>\n } @else if (error) {\n <div class=\"avaya-ipo-contacts-state avaya-ipo-error\">{{ error }}</div>\n } @else if (selectedContact) {\n <div class=\"avaya-ipo-contact-details\">\n <div class=\"avaya-ipo-contact-details-actions\">\n <button type=\"button\" class=\"avaya-ipo-contact-back\" (click)=\"closeContact()\">\u2190 Back</button>\n <button type=\"button\" class=\"avaya-ipo-contact-call\" (click)=\"onCallContact(selectedContact)\">Call</button>\n </div>\n <app-contact-details [contact]=\"selectedContact.entity\"></app-contact-details>\n </div>\n } @else if (contacts.length === 0) {\n <div class=\"avaya-ipo-contacts-state\">No contacts found.</div>\n } @else {\n <div class=\"avaya-ipo-contacts-list\" (scroll)=\"onListScroll($event)\" #listEl>\n @for (group of groupedContacts; track group.label) {\n <div class=\"avaya-ipo-history_group_label\">{{ group.label }}</div>\n @for (contact of group.items; track contact.id) {\n <button type=\"button\" class=\"avaya-ipo-contact-item-btn\" (click)=\"openContact(contact)\">\n <app-contact-card [name]=\"contact.name\" [phone]=\"contact.phone\" (call)=\"onCallContact(contact, $event)\"></app-contact-card>\n </button>\n }\n }\n @if (isLoadingMore) {\n <div class=\"avaya-ipo-contacts-load-more\">\n <div class=\"avaya-ipo-contacts-spinner\" aria-hidden=\"true\"></div>\n </div>\n }\n </div>\n }\n</div>\n", styles: [".avaya-ipo-contacts-panel{padding:0 15px 20px;display:flex;flex-direction:column;gap:12px;overflow:hidden;flex:1 1 auto;min-height:0}:host{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}.avaya-ipo-contacts-search{position:relative;width:100%;box-sizing:border-box}.avaya-ipo-contacts-search input{padding:0 42px;width:100%;max-width:100%;box-sizing:border-box;outline:none;display:block;border:1px solid var(--sd-input-border);color:var(--sd-text);font-size:13px;letter-spacing:-.15px;background:var(--sd-input);font-weight:600;border-radius:var(--sd-radius-sm);height:42px;transition:border-color .15s ease,box-shadow .15s ease}.avaya-ipo-contacts-search input::placeholder{color:var(--sd-text-subtle)}.avaya-ipo-contacts-search input:focus{border-color:var(--sd-accent);box-shadow:var(--sd-focus-ring)}.avaya-ipo-contacts-search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);font-size:14px;color:var(--sd-text-subtle)}.avaya-ipo-contacts-list{display:flex;flex-direction:column;overflow-y:auto;padding-bottom:calc(var(--sd-tabs-height, 60px) + 12px);flex:1 1 auto;min-height:0;max-height:none}.avaya-ipo-contact-item-btn{width:100%;padding:0;border:none;background:transparent;text-align:left;cursor:pointer}.avaya-ipo-contact-item-btn:hover .avaya-ipo-contact-card{background:var(--sd-surface-muted)}.avaya-ipo-contact-details{padding:0 0 12px;display:flex;flex-direction:column;gap:12px}.avaya-ipo-contact-details-actions{display:flex;align-items:center;justify-content:space-between;gap:12px}.avaya-ipo-contact-call{border:none;background:var(--sd-call-accept);color:var(--sd-accent-contrast);padding:8px 14px;border-radius:var(--sd-radius-sm);font-weight:700;cursor:pointer;transition:filter .15s ease}.avaya-ipo-contact-call:hover{filter:brightness(.94)}.avaya-ipo-contact-call:focus-visible{outline:none;box-shadow:var(--sd-focus-ring)}.avaya-ipo-contact-back{width:90px;border:1px solid var(--sd-border);background:var(--sd-surface-muted);color:var(--sd-text);border-radius:var(--sd-radius-sm);padding:8px;cursor:pointer;font-weight:600;transition:background .15s ease}.avaya-ipo-contact-back:hover{background:var(--sd-surface-sunken)}.avaya-ipo-contact-back:focus-visible{outline:none;box-shadow:var(--sd-focus-ring)}.avaya-ipo-history_group_label{font-size:12px;font-weight:700;color:var(--sd-text-muted);text-transform:uppercase;letter-spacing:.08em;padding:6px 0;position:sticky;top:0;z-index:2;background:var(--sd-surface);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}.avaya-ipo-history_skeleton{padding:12px 0;display:flex;flex-direction:column;gap:12px}.avaya-ipo-skeleton_row{display:flex;align-items:center;gap:12px}.avaya-ipo-skeleton_avatar{width:42px;height:42px;border-radius:var(--sd-radius-lg);background:var(--sd-surface-sunken);position:relative;overflow:hidden}.avaya-ipo-skeleton_body{flex:1;display:flex;flex-direction:column;gap:8px}.avaya-ipo-skeleton_meta{width:60px}.avaya-ipo-skeleton_line{height:10px;background:var(--sd-surface-sunken);border-radius:6px;position:relative;overflow:hidden}.avaya-ipo-skeleton_line.avaya-ipo-wide{width:70%}.avaya-ipo-skeleton_line.avaya-ipo-medium{width:55%}.avaya-ipo-skeleton_line.avaya-ipo-short{width:50px}.avaya-ipo-shine:after{content:\"\";position:absolute;top:0;left:-150px;height:100%;width:120px;background:linear-gradient(90deg,#fff0,#fff9,#fff0);animation:shimmer 1.2s infinite}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-skeleton_avatar,:host-context(.avaya-ipo-dark-mode) .avaya-ipo-skeleton_line{background:var(--sd-surface-sunken)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-shine:after{background:linear-gradient(90deg,#0f111500,#555f6e73,#0f111500)}@keyframes shimmer{0%{transform:translate(0)}to{transform:translate(260px)}}.avaya-ipo-contacts-state{padding:16px;font-size:13px;color:var(--sd-text-muted);text-align:center}.avaya-ipo-contacts-state.avaya-ipo-error{color:var(--sd-call-end);background:var(--sd-surface-muted);border-radius:var(--sd-radius)}.avaya-ipo-contacts-load-more{padding:12px 0 18px;display:flex;justify-content:center}.avaya-ipo-contacts-spinner{width:22px;height:22px;border-radius:50%;border:2px solid var(--sd-border);border-top-color:var(--sd-accent);animation:contacts-spin .8s linear infinite}@keyframes contacts-spin{to{transform:rotate(360deg)}}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-history_group_label{color:var(--sd-text-muted);background:var(--sd-surface)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-contact-phone,:host-context(.avaya-ipo-dark-mode) .avaya-ipo-contacts-state{color:var(--sd-text-muted)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-contacts-search input{background:var(--sd-input);border-color:var(--sd-input-border);color:var(--sd-text)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-contacts-search input::placeholder{color:var(--sd-text-subtle)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-contacts-search-icon{color:var(--sd-text-subtle)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-contact-call{background:var(--sd-call-accept);color:var(--sd-accent-contrast)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-contact-back{background:var(--sd-surface-muted);border-color:var(--sd-border);color:var(--sd-text)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-contact-item-btn:hover .avaya-ipo-contact-card{background:var(--sd-surface-muted)}\n"] }]
|
|
1996
2195
|
}], ctorParameters: () => [{ type: EntitiesSearchService }], propDecorators: { tenantId: [{
|
|
1997
2196
|
type: Input
|
|
1998
2197
|
}], listEl: [{
|
|
@@ -2012,6 +2211,7 @@ class SettingsComponent {
|
|
|
2012
2211
|
logout = new EventEmitter();
|
|
2013
2212
|
audioInputs = [];
|
|
2014
2213
|
audioOutputs = [];
|
|
2214
|
+
widgetVersion = APP_CONFIG.WIDGET_VERSION;
|
|
2015
2215
|
ngOnInit() {
|
|
2016
2216
|
if (navigator?.mediaDevices) {
|
|
2017
2217
|
navigator.mediaDevices.addEventListener('devicechange', this.handleDeviceChange);
|
|
@@ -2066,11 +2266,11 @@ class SettingsComponent {
|
|
|
2066
2266
|
return device.deviceId;
|
|
2067
2267
|
}
|
|
2068
2268
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: SettingsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2069
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: SettingsComponent, isStandalone: false, selector: "app-settings", inputs: { selectedAudioInputId: "selectedAudioInputId", selectedAudioOutputId: "selectedAudioOutputId", extensionId: "extensionId", darkMode: "darkMode" }, outputs: { change: "change", darkModeChange: "darkModeChange", logout: "logout" }, ngImport: i0, template: "<div class=\"settings-wrapper\">\n <div class=\"settings-card\">\n <div class=\"settings-header\">\n <div>\n <div class=\"settings-title\">Account</div>\n <div class=\"settings-subtitle\">Extension ID: {{ extensionId || 'N/A' }}</div>\n </div>\n <button type=\"button\" class=\"logout-chip\" (click)=\"onLogout()\">\n Logout\n </button>\n </div>\n\n <div class=\"settings-section\">\n <div class=\"section-heading\">Audio Devices</div>\n\n <div class=\"device-item\">\n <div class=\"device-icon\">\n <i class=\"fa-solid fa-microphone\"></i>\n </div>\n <div class=\"device-body\">\n <div class=\"device-title\">Microphone</div>\n <div class=\"device-subtitle\">Choose your input device</div>\n <select\n id=\"audioInputSelect\"\n [(ngModel)]=\"selectedAudioInputId\"\n (change)=\"onMicChange(selectedAudioInputId)\"\n >\n @for (mic of audioInputs; track mic.deviceId; let i = $index) {\n <option [value]=\"mic.deviceId\">\n {{ mic.label || ('Microphone ' + (i + 1)) }}\n </option>\n } @empty {\n <option disabled>No microphones found</option>\n }\n </select>\n </div>\n </div>\n\n <div class=\"device-item\">\n <div class=\"device-icon\">\n <i class=\"fa-solid fa-volume-high\"></i>\n </div>\n <div class=\"device-body\">\n <div class=\"device-title\">Speakers</div>\n <div class=\"device-subtitle\">Choose your output device</div>\n <select\n id=\"audioOutputSelect\"\n [(ngModel)]=\"selectedAudioOutputId\"\n (change)=\"onSpeakerChange(selectedAudioOutputId)\"\n >\n @for (spk of audioOutputs; track spk.deviceId; let i = $index) {\n <option [value]=\"spk.deviceId\">\n {{ spk.label || ('Speaker ' + (i + 1)) }}\n </option>\n } @empty {\n <option disabled>No speakers found</option>\n }\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"settings-section\">\n <div class=\"section-heading\">Appearance</div>\n <button type=\"button\" class=\"theme-toggle\" (click)=\"onToggleDarkMode()\">\n <span class=\"theme-label\">Dark Mode</span>\n <span class=\"theme-pill\" [class.is-on]=\"darkMode\">\n <span class=\"theme-knob\"></span>\n </span>\n </button>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;width:100%;box-sizing:border-box;font-family:Open Sans,Helvetica Neue,Arial,sans-serif}.settings-wrapper{width:100%;padding:8px 12px 12px;box-sizing:border-box}.settings-card{background:transparent;border-radius:
|
|
2269
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: SettingsComponent, isStandalone: false, selector: "app-settings", inputs: { selectedAudioInputId: "selectedAudioInputId", selectedAudioOutputId: "selectedAudioOutputId", extensionId: "extensionId", darkMode: "darkMode" }, outputs: { change: "change", darkModeChange: "darkModeChange", logout: "logout" }, ngImport: i0, template: "<div class=\"avaya-ipo-settings-wrapper\">\n <div class=\"avaya-ipo-settings-card\">\n <div class=\"avaya-ipo-settings-header\">\n <div>\n <div class=\"avaya-ipo-settings-title\">Account</div>\n <div class=\"avaya-ipo-settings-subtitle\">Extension ID: {{ extensionId || 'N/A' }}</div>\n </div>\n <button type=\"button\" class=\"avaya-ipo-logout-chip\" (click)=\"onLogout()\">\n Logout\n </button>\n </div>\n\n <div class=\"avaya-ipo-settings-section\">\n <div class=\"avaya-ipo-section-heading\">Audio Devices</div>\n\n <div class=\"avaya-ipo-device-item\">\n <div class=\"avaya-ipo-device-icon\">\n <i class=\"fa-solid fa-microphone\"></i>\n </div>\n <div class=\"avaya-ipo-device-body\">\n <div class=\"avaya-ipo-device-title\">Microphone</div>\n <div class=\"avaya-ipo-device-subtitle\">Choose your input device</div>\n <select\n id=\"audioInputSelect\"\n [(ngModel)]=\"selectedAudioInputId\"\n (change)=\"onMicChange(selectedAudioInputId)\"\n >\n @for (mic of audioInputs; track mic.deviceId; let i = $index) {\n <option [value]=\"mic.deviceId\">\n {{ mic.label || ('Microphone ' + (i + 1)) }}\n </option>\n } @empty {\n <option disabled>No microphones found</option>\n }\n </select>\n </div>\n </div>\n\n <div class=\"avaya-ipo-device-item\">\n <div class=\"avaya-ipo-device-icon\">\n <i class=\"fa-solid fa-volume-high\"></i>\n </div>\n <div class=\"avaya-ipo-device-body\">\n <div class=\"avaya-ipo-device-title\">Speakers</div>\n <div class=\"avaya-ipo-device-subtitle\">Choose your output device</div>\n <select\n id=\"audioOutputSelect\"\n [(ngModel)]=\"selectedAudioOutputId\"\n (change)=\"onSpeakerChange(selectedAudioOutputId)\"\n >\n @for (spk of audioOutputs; track spk.deviceId; let i = $index) {\n <option [value]=\"spk.deviceId\">\n {{ spk.label || ('Speaker ' + (i + 1)) }}\n </option>\n } @empty {\n <option disabled>No speakers found</option>\n }\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"avaya-ipo-settings-section\">\n <div class=\"avaya-ipo-section-heading\">Appearance</div>\n <button type=\"button\" class=\"avaya-ipo-theme-toggle\" (click)=\"onToggleDarkMode()\">\n <span class=\"avaya-ipo-theme-label\">Dark Mode</span>\n <span class=\"avaya-ipo-theme-pill\" [class.avaya-ipo-is-on]=\"darkMode\">\n <span class=\"avaya-ipo-theme-knob\"></span>\n </span>\n </button>\n </div>\n\n <div class=\"avaya-ipo-settings-section avaya-ipo-about-section\">\n <div class=\"avaya-ipo-section-heading\">About</div>\n <div class=\"avaya-ipo-about-row\">\n <span class=\"avaya-ipo-about-label\">Version</span>\n <span class=\"avaya-ipo-about-value\">v{{ widgetVersion }}</span>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;width:100%;box-sizing:border-box;font-family:Open Sans,Helvetica Neue,Arial,sans-serif}.avaya-ipo-settings-wrapper{width:100%;padding:8px 12px 12px;box-sizing:border-box}.avaya-ipo-settings-card{background:transparent;border-radius:var(--sd-radius-lg);box-shadow:none;padding:14px 14px 18px;display:flex;flex-direction:column;gap:14px}.avaya-ipo-settings-header{display:flex;align-items:center;justify-content:space-between;gap:10px;height:60px;padding:4px 0}.avaya-ipo-settings-title{font-size:18px;font-weight:800;color:var(--sd-text);padding:4px 0}.avaya-ipo-settings-subtitle{font-size:13px;color:var(--sd-text-muted)}.avaya-ipo-logout-chip{border:1px solid var(--sd-call-end);background:var(--sd-surface-muted);color:var(--sd-call-end);padding:8px 12px;border-radius:var(--sd-radius);font-weight:600;cursor:pointer;transition:background .16s ease,border-color .16s ease}.avaya-ipo-logout-chip:hover{background:var(--sd-call-end);border-color:var(--sd-call-end);color:var(--sd-accent-contrast)}.avaya-ipo-logout-chip:focus-visible{outline:none;box-shadow:var(--sd-focus-ring)}.avaya-ipo-settings-section{display:flex;flex-direction:column;gap:12px}.avaya-ipo-section-heading{font-size:18px;font-weight:700;color:var(--sd-text)}.avaya-ipo-device-item{display:flex;gap:12px;padding:12px;border:1px solid var(--sd-border);border-radius:var(--sd-radius-lg);background:var(--sd-card);box-shadow:none}.avaya-ipo-device-icon{width:36px;height:36px;border-radius:var(--sd-radius);background:var(--sd-surface-muted);display:flex;align-items:center;justify-content:center;color:var(--sd-text-muted);font-size:16px}.avaya-ipo-device-body{flex:1;display:flex;flex-direction:column;gap:6px}.avaya-ipo-device-title{font-size:14px;font-weight:700;color:var(--sd-text)}.avaya-ipo-device-subtitle{font-size:12px;color:var(--sd-text-muted)}select{width:100%;border:1px solid var(--sd-input-border);border-radius:var(--sd-radius-sm);padding:10px 8px;font-size:13px;color:var(--sd-text);background:var(--sd-input);outline:none;transition:border-color .16s ease,box-shadow .16s ease}select:focus,select:focus-visible{border-color:var(--sd-accent);box-shadow:var(--sd-focus-ring)}.avaya-ipo-theme-toggle{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px;border:1px solid var(--sd-border);border-radius:var(--sd-radius-lg);background:var(--sd-card);cursor:pointer;transition:background .16s ease,border-color .16s ease}.avaya-ipo-theme-toggle:hover{background:var(--sd-surface-muted)}.avaya-ipo-theme-toggle:focus-visible{outline:none;box-shadow:var(--sd-focus-ring)}.avaya-ipo-theme-label{font-size:14px;font-weight:700;color:var(--sd-text)}.avaya-ipo-theme-pill{width:44px;height:24px;border-radius:var(--sd-radius-pill);background:var(--sd-surface-sunken);position:relative;transition:background .16s ease}.avaya-ipo-theme-pill.avaya-ipo-is-on{background:var(--sd-accent)}.avaya-ipo-theme-knob{width:18px;height:18px;border-radius:50%;background:var(--sd-surface);position:absolute;top:3px;left:3px;transition:transform .16s ease;box-shadow:var(--sd-shadow-sm)}.avaya-ipo-theme-pill.avaya-ipo-is-on .avaya-ipo-theme-knob{transform:translate(20px)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-settings-title,:host-context(.avaya-ipo-dark-mode) .avaya-ipo-device-title,:host-context(.avaya-ipo-dark-mode) .avaya-ipo-theme-label,:host-context(.avaya-ipo-dark-mode) .avaya-ipo-section-heading{color:var(--sd-text)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-settings-subtitle,:host-context(.avaya-ipo-dark-mode) .avaya-ipo-device-subtitle{color:var(--sd-text-muted)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-device-item,:host-context(.avaya-ipo-dark-mode) .avaya-ipo-theme-toggle{border-color:var(--sd-border)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-device-icon{background:var(--sd-avatar);color:var(--sd-text-muted)}:host-context(.avaya-ipo-dark-mode) select{background:var(--sd-input);border-color:var(--sd-input-border);color:var(--sd-text)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-theme-pill{background:var(--sd-surface-sunken)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-theme-pill.avaya-ipo-is-on{background:var(--sd-accent)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-theme-pill.avaya-ipo-is-on .avaya-ipo-theme-knob{background:var(--sd-accent-contrast)}.avaya-ipo-about-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px;border:1px solid var(--sd-border);border-radius:var(--sd-radius-lg);background:var(--sd-card)}.avaya-ipo-about-label{font-size:14px;font-weight:700;color:var(--sd-text)}.avaya-ipo-about-value{font-size:13px;font-weight:600;color:var(--sd-text-muted);font-variant-numeric:tabular-nums;letter-spacing:.02em}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-about-row{border-color:var(--sd-border)}\n"], dependencies: [{ kind: "directive", type: i1$2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2$1.NativeElementInjectorDirective, selector: "[ngModel], [formControl], [formControlName]" }] });
|
|
2070
2270
|
}
|
|
2071
2271
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: SettingsComponent, decorators: [{
|
|
2072
2272
|
type: Component,
|
|
2073
|
-
args: [{ selector: 'app-settings', standalone: false, template: "<div class=\"settings-wrapper\">\n <div class=\"settings-card\">\n <div class=\"settings-header\">\n <div>\n <div class=\"settings-title\">Account</div>\n <div class=\"settings-subtitle\">Extension ID: {{ extensionId || 'N/A' }}</div>\n </div>\n <button type=\"button\" class=\"logout-chip\" (click)=\"onLogout()\">\n Logout\n </button>\n </div>\n\n <div class=\"settings-section\">\n <div class=\"section-heading\">Audio Devices</div>\n\n <div class=\"device-item\">\n <div class=\"device-icon\">\n <i class=\"fa-solid fa-microphone\"></i>\n </div>\n <div class=\"device-body\">\n <div class=\"device-title\">Microphone</div>\n <div class=\"device-subtitle\">Choose your input device</div>\n <select\n id=\"audioInputSelect\"\n [(ngModel)]=\"selectedAudioInputId\"\n (change)=\"onMicChange(selectedAudioInputId)\"\n >\n @for (mic of audioInputs; track mic.deviceId; let i = $index) {\n <option [value]=\"mic.deviceId\">\n {{ mic.label || ('Microphone ' + (i + 1)) }}\n </option>\n } @empty {\n <option disabled>No microphones found</option>\n }\n </select>\n </div>\n </div>\n\n <div class=\"device-item\">\n <div class=\"device-icon\">\n <i class=\"fa-solid fa-volume-high\"></i>\n </div>\n <div class=\"device-body\">\n <div class=\"device-title\">Speakers</div>\n <div class=\"device-subtitle\">Choose your output device</div>\n <select\n id=\"audioOutputSelect\"\n [(ngModel)]=\"selectedAudioOutputId\"\n (change)=\"onSpeakerChange(selectedAudioOutputId)\"\n >\n @for (spk of audioOutputs; track spk.deviceId; let i = $index) {\n <option [value]=\"spk.deviceId\">\n {{ spk.label || ('Speaker ' + (i + 1)) }}\n </option>\n } @empty {\n <option disabled>No speakers found</option>\n }\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"settings-section\">\n <div class=\"section-heading\">Appearance</div>\n <button type=\"button\" class=\"theme-toggle\" (click)=\"onToggleDarkMode()\">\n <span class=\"theme-label\">Dark Mode</span>\n <span class=\"theme-pill\" [class.is-on]=\"darkMode\">\n <span class=\"theme-knob\"></span>\n </span>\n </button>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;width:100%;box-sizing:border-box;font-family:Open Sans,Helvetica Neue,Arial,sans-serif}.settings-wrapper{width:100%;padding:8px 12px 12px;box-sizing:border-box}.settings-card{background:transparent;border-radius:
|
|
2273
|
+
args: [{ selector: 'app-settings', standalone: false, template: "<div class=\"avaya-ipo-settings-wrapper\">\n <div class=\"avaya-ipo-settings-card\">\n <div class=\"avaya-ipo-settings-header\">\n <div>\n <div class=\"avaya-ipo-settings-title\">Account</div>\n <div class=\"avaya-ipo-settings-subtitle\">Extension ID: {{ extensionId || 'N/A' }}</div>\n </div>\n <button type=\"button\" class=\"avaya-ipo-logout-chip\" (click)=\"onLogout()\">\n Logout\n </button>\n </div>\n\n <div class=\"avaya-ipo-settings-section\">\n <div class=\"avaya-ipo-section-heading\">Audio Devices</div>\n\n <div class=\"avaya-ipo-device-item\">\n <div class=\"avaya-ipo-device-icon\">\n <i class=\"fa-solid fa-microphone\"></i>\n </div>\n <div class=\"avaya-ipo-device-body\">\n <div class=\"avaya-ipo-device-title\">Microphone</div>\n <div class=\"avaya-ipo-device-subtitle\">Choose your input device</div>\n <select\n id=\"audioInputSelect\"\n [(ngModel)]=\"selectedAudioInputId\"\n (change)=\"onMicChange(selectedAudioInputId)\"\n >\n @for (mic of audioInputs; track mic.deviceId; let i = $index) {\n <option [value]=\"mic.deviceId\">\n {{ mic.label || ('Microphone ' + (i + 1)) }}\n </option>\n } @empty {\n <option disabled>No microphones found</option>\n }\n </select>\n </div>\n </div>\n\n <div class=\"avaya-ipo-device-item\">\n <div class=\"avaya-ipo-device-icon\">\n <i class=\"fa-solid fa-volume-high\"></i>\n </div>\n <div class=\"avaya-ipo-device-body\">\n <div class=\"avaya-ipo-device-title\">Speakers</div>\n <div class=\"avaya-ipo-device-subtitle\">Choose your output device</div>\n <select\n id=\"audioOutputSelect\"\n [(ngModel)]=\"selectedAudioOutputId\"\n (change)=\"onSpeakerChange(selectedAudioOutputId)\"\n >\n @for (spk of audioOutputs; track spk.deviceId; let i = $index) {\n <option [value]=\"spk.deviceId\">\n {{ spk.label || ('Speaker ' + (i + 1)) }}\n </option>\n } @empty {\n <option disabled>No speakers found</option>\n }\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"avaya-ipo-settings-section\">\n <div class=\"avaya-ipo-section-heading\">Appearance</div>\n <button type=\"button\" class=\"avaya-ipo-theme-toggle\" (click)=\"onToggleDarkMode()\">\n <span class=\"avaya-ipo-theme-label\">Dark Mode</span>\n <span class=\"avaya-ipo-theme-pill\" [class.avaya-ipo-is-on]=\"darkMode\">\n <span class=\"avaya-ipo-theme-knob\"></span>\n </span>\n </button>\n </div>\n\n <div class=\"avaya-ipo-settings-section avaya-ipo-about-section\">\n <div class=\"avaya-ipo-section-heading\">About</div>\n <div class=\"avaya-ipo-about-row\">\n <span class=\"avaya-ipo-about-label\">Version</span>\n <span class=\"avaya-ipo-about-value\">v{{ widgetVersion }}</span>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;width:100%;box-sizing:border-box;font-family:Open Sans,Helvetica Neue,Arial,sans-serif}.avaya-ipo-settings-wrapper{width:100%;padding:8px 12px 12px;box-sizing:border-box}.avaya-ipo-settings-card{background:transparent;border-radius:var(--sd-radius-lg);box-shadow:none;padding:14px 14px 18px;display:flex;flex-direction:column;gap:14px}.avaya-ipo-settings-header{display:flex;align-items:center;justify-content:space-between;gap:10px;height:60px;padding:4px 0}.avaya-ipo-settings-title{font-size:18px;font-weight:800;color:var(--sd-text);padding:4px 0}.avaya-ipo-settings-subtitle{font-size:13px;color:var(--sd-text-muted)}.avaya-ipo-logout-chip{border:1px solid var(--sd-call-end);background:var(--sd-surface-muted);color:var(--sd-call-end);padding:8px 12px;border-radius:var(--sd-radius);font-weight:600;cursor:pointer;transition:background .16s ease,border-color .16s ease}.avaya-ipo-logout-chip:hover{background:var(--sd-call-end);border-color:var(--sd-call-end);color:var(--sd-accent-contrast)}.avaya-ipo-logout-chip:focus-visible{outline:none;box-shadow:var(--sd-focus-ring)}.avaya-ipo-settings-section{display:flex;flex-direction:column;gap:12px}.avaya-ipo-section-heading{font-size:18px;font-weight:700;color:var(--sd-text)}.avaya-ipo-device-item{display:flex;gap:12px;padding:12px;border:1px solid var(--sd-border);border-radius:var(--sd-radius-lg);background:var(--sd-card);box-shadow:none}.avaya-ipo-device-icon{width:36px;height:36px;border-radius:var(--sd-radius);background:var(--sd-surface-muted);display:flex;align-items:center;justify-content:center;color:var(--sd-text-muted);font-size:16px}.avaya-ipo-device-body{flex:1;display:flex;flex-direction:column;gap:6px}.avaya-ipo-device-title{font-size:14px;font-weight:700;color:var(--sd-text)}.avaya-ipo-device-subtitle{font-size:12px;color:var(--sd-text-muted)}select{width:100%;border:1px solid var(--sd-input-border);border-radius:var(--sd-radius-sm);padding:10px 8px;font-size:13px;color:var(--sd-text);background:var(--sd-input);outline:none;transition:border-color .16s ease,box-shadow .16s ease}select:focus,select:focus-visible{border-color:var(--sd-accent);box-shadow:var(--sd-focus-ring)}.avaya-ipo-theme-toggle{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px;border:1px solid var(--sd-border);border-radius:var(--sd-radius-lg);background:var(--sd-card);cursor:pointer;transition:background .16s ease,border-color .16s ease}.avaya-ipo-theme-toggle:hover{background:var(--sd-surface-muted)}.avaya-ipo-theme-toggle:focus-visible{outline:none;box-shadow:var(--sd-focus-ring)}.avaya-ipo-theme-label{font-size:14px;font-weight:700;color:var(--sd-text)}.avaya-ipo-theme-pill{width:44px;height:24px;border-radius:var(--sd-radius-pill);background:var(--sd-surface-sunken);position:relative;transition:background .16s ease}.avaya-ipo-theme-pill.avaya-ipo-is-on{background:var(--sd-accent)}.avaya-ipo-theme-knob{width:18px;height:18px;border-radius:50%;background:var(--sd-surface);position:absolute;top:3px;left:3px;transition:transform .16s ease;box-shadow:var(--sd-shadow-sm)}.avaya-ipo-theme-pill.avaya-ipo-is-on .avaya-ipo-theme-knob{transform:translate(20px)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-settings-title,:host-context(.avaya-ipo-dark-mode) .avaya-ipo-device-title,:host-context(.avaya-ipo-dark-mode) .avaya-ipo-theme-label,:host-context(.avaya-ipo-dark-mode) .avaya-ipo-section-heading{color:var(--sd-text)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-settings-subtitle,:host-context(.avaya-ipo-dark-mode) .avaya-ipo-device-subtitle{color:var(--sd-text-muted)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-device-item,:host-context(.avaya-ipo-dark-mode) .avaya-ipo-theme-toggle{border-color:var(--sd-border)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-device-icon{background:var(--sd-avatar);color:var(--sd-text-muted)}:host-context(.avaya-ipo-dark-mode) select{background:var(--sd-input);border-color:var(--sd-input-border);color:var(--sd-text)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-theme-pill{background:var(--sd-surface-sunken)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-theme-pill.avaya-ipo-is-on{background:var(--sd-accent)}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-theme-pill.avaya-ipo-is-on .avaya-ipo-theme-knob{background:var(--sd-accent-contrast)}.avaya-ipo-about-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px;border:1px solid var(--sd-border);border-radius:var(--sd-radius-lg);background:var(--sd-card)}.avaya-ipo-about-label{font-size:14px;font-weight:700;color:var(--sd-text)}.avaya-ipo-about-value{font-size:13px;font-weight:600;color:var(--sd-text-muted);font-variant-numeric:tabular-nums;letter-spacing:.02em}:host-context(.avaya-ipo-dark-mode) .avaya-ipo-about-row{border-color:var(--sd-border)}\n"] }]
|
|
2074
2274
|
}], propDecorators: { selectedAudioInputId: [{
|
|
2075
2275
|
type: Input
|
|
2076
2276
|
}], selectedAudioOutputId: [{
|
|
@@ -2117,11 +2317,11 @@ class AvayaIpoLoginComponent {
|
|
|
2117
2317
|
return true;
|
|
2118
2318
|
}
|
|
2119
2319
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: AvayaIpoLoginComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2120
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: AvayaIpoLoginComponent, isStandalone: false, selector: "app-avaya-ipo-login", inputs: { loginForm: "loginForm", showLoginLoader: "showLoginLoader", hasAvayaSocketError: "hasAvayaSocketError", hasAvayaLoginError: "hasAvayaLoginError", hasAvayaLoginFailedGeneral: "hasAvayaLoginFailedGeneral", hasAvayaLoginConflictError: "hasAvayaLoginConflictError", hasAvayaDeviceError: "hasAvayaDeviceError" }, outputs: { login: "login" }, ngImport: i0, template: "<div class=\"login-background\">\n <div class=\"login-simple\">\n <div class=\"logo\">\n <div class=\"logo-img\"></div>\n <div class=\"logo-text\">IP Office<span>TM</span></div>\n </div>\n\n @if (hasAvayaSocketError || hasAvayaLoginError || hasAvayaLoginFailedGeneral || hasAvayaLoginConflictError || hasAvayaDeviceError) {\n <p class=\"alert error\">\n @if (hasAvayaSocketError) { Connection issue detected. }\n @if (hasAvayaLoginError) { Invalid extension or password. }\n @if (hasAvayaLoginFailedGeneral) { Something went wrong. Please try again. }\n @if (hasAvayaLoginConflictError) { Another user is logged in with this extension. }\n @if (hasAvayaDeviceError) { Device access error. }\n </p>\n }\n\n <form [formGroup]=\"loginForm\" (ngSubmit)=\"onLoginClick()\" class=\"form\" autocomplete=\"off\">\n <mat-form-field appearance=\"outline\" class=\"field\">\n <mat-label>Extension</mat-label>\n <input matInput formControlName=\"ipoExtensionNo\" autocomplete=\"off\" autocapitalize=\"off\" autocorrect=\"off\"\n spellcheck=\"false\" (keypress)=\"restrictNumeric($event)\" />\n <mat-icon matPrefix>call</mat-icon>\n @if (loginForm.controls['ipoExtensionNo'].invalid && loginForm.controls['ipoExtensionNo'].touched) {\n <mat-error>\n @if (loginForm.controls['ipoExtensionNo'].errors?.['required']) {\n <small>Extension is required.</small>\n }\n </mat-error>\n }\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"field\">\n <mat-label>Password</mat-label>\n <input matInput formControlName=\"ipoPassword\" autocomplete=\"off\" autocapitalize=\"off\" autocorrect=\"off\"\n spellcheck=\"false\"\n (keypress)=\"restrictNumeric($event)\" [type]=\"showLoginPassword ? 'text' : 'password'\" />\n <mat-icon matPrefix>lock</mat-icon>\n <button mat-icon-button matSuffix type=\"button\"\n (click)=\"showLoginPassword = !showLoginPassword && !hasAvayaSocketError\">\n <mat-icon>{{ showLoginPassword ? 'visibility_off' : 'visibility' }}</mat-icon>\n </button>\n @if (loginForm.controls['ipoPassword'].invalid && loginForm.controls['ipoPassword'].touched) {\n <mat-error>\n @if (loginForm.controls['ipoPassword'].errors?.['required']) {\n <small>Password is required.</small>\n }\n </mat-error>\n }\n </mat-form-field>\n\n <button type=\"submit\" class=\"btn\" [disabled]=\"showLoginLoader\">\n @if (showLoginLoader) { <span class=\"spinner\"></span> } @else { <span>Login</span> }\n </button>\n </form>\n\n</div>\n</div>\n", styles: [":host{display:block;width:100%;max-width:100%;margin:0;font-family:Open Sans,Helvetica Neue,Arial,sans-serif;--avaya-red: #e3000f;--avaya-red-soft: #f35661;--avaya-red-light: #ffe5e8;--text-dark: #2c2c2c;--text-muted: #6b6b6b}.login-simple{width:100%;padding:24px 18px 32px;background:transparent;border-radius:0;box-shadow:none;display:flex;flex-direction:column;gap:16px;box-sizing:border-box}.logo{display:flex;flex-direction:column;align-items:center;gap:6px;margin-bottom:4px}.logo-img{width:140px;height:40px;background:url(data:image/png;base64,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) center/140px no-repeat}.logo-text{font-size:18px;font-weight:700;color:var(--text-dark);letter-spacing:-.2px}.logo-text span{font-size:9px;margin-left:4px}.alert{margin:0;padding:10px 12px;border-radius:8px;font-size:13px;line-height:1.4}.error{background:var(--avaya-red-light);color:#b5000c;border:1px solid #f5b3b8}.form{display:flex;flex-direction:column;gap:12px}.field{width:100%;--mdc-outlined-text-field-outline-color: #e0e0e0;--mdc-outlined-text-field-focus-outline-color: var(--avaya-red);--mdc-outlined-text-field-hover-outline-color: var(--avaya-red);--mdc-outlined-text-field-container-fill-color: transparent;--mdc-outlined-text-field-input-text-color: var(--text-dark);--mdc-outlined-text-field-label-text-color: var(--text-muted);--mdc-outlined-text-field-input-text-placeholder-color: var(--text-muted)}.field .mdc-text-field__input{font-size:14px}.btn{width:100%;height:46px;border:none;border-radius:10px;background:var(--avaya-red);color:#fff;font-weight:700;font-size:15px;cursor:pointer;transition:transform .12s ease,box-shadow .12s ease;box-shadow:0 8px 18px #e3000f4d;display:inline-flex;align-items:center;justify-content:center}.btn:disabled{opacity:.7;cursor:default}.btn:active:not(:disabled){transform:translateY(1px)}.spinner{display:inline-block;width:16px;height:16px;border-radius:50%;border:3px solid #fff;border-top-color:#fff6;animation:spin 1s linear infinite}.footnote{font-size:13px;color:var(--text-muted);text-align:center}.footnote a{color:var(--avaya-red);font-weight:700;text-decoration:none;margin-left:4px}.login-background{background:transparent;padding:0;min-height:100vh;display:flex;align-items:center;justify-content:center}@keyframes spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i1$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i2$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2$2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2$2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i2$2.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i2$2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: i2$1.NativeElementInjectorDirective, selector: "[ngModel], [formControl], [formControlName]" }] });
|
|
2320
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: AvayaIpoLoginComponent, isStandalone: false, selector: "app-avaya-ipo-login", inputs: { loginForm: "loginForm", showLoginLoader: "showLoginLoader", hasAvayaSocketError: "hasAvayaSocketError", hasAvayaLoginError: "hasAvayaLoginError", hasAvayaLoginFailedGeneral: "hasAvayaLoginFailedGeneral", hasAvayaLoginConflictError: "hasAvayaLoginConflictError", hasAvayaDeviceError: "hasAvayaDeviceError" }, outputs: { login: "login" }, ngImport: i0, template: "<div class=\"avaya-ipo-login-background\">\n <div class=\"avaya-ipo-login-simple\">\n <div class=\"avaya-ipo-logo\">\n <div class=\"avaya-ipo-logo-img\"></div>\n <div class=\"avaya-ipo-logo-text\">IP Office<span>TM</span></div>\n </div>\n\n @if (hasAvayaSocketError || hasAvayaLoginError || hasAvayaLoginFailedGeneral || hasAvayaLoginConflictError || hasAvayaDeviceError) {\n <p class=\"avaya-ipo-alert avaya-ipo-error\">\n @if (hasAvayaSocketError) { Connection issue detected. }\n @if (hasAvayaLoginError) { Invalid extension or password. }\n @if (hasAvayaLoginFailedGeneral) { Something went wrong. Please try again. }\n @if (hasAvayaLoginConflictError) { Another user is logged in with this extension. }\n @if (hasAvayaDeviceError) { Device access error. }\n </p>\n }\n\n <form [formGroup]=\"loginForm\" (ngSubmit)=\"onLoginClick()\" class=\"avaya-ipo-form\" autocomplete=\"off\">\n <mat-form-field appearance=\"outline\" class=\"avaya-ipo-field\">\n <mat-label>Extension</mat-label>\n <input matInput formControlName=\"ipoExtensionNo\" autocomplete=\"off\" autocapitalize=\"off\" autocorrect=\"off\"\n spellcheck=\"false\" (keypress)=\"restrictNumeric($event)\" />\n <mat-icon matPrefix>call</mat-icon>\n @if (loginForm.controls['ipoExtensionNo'].invalid && loginForm.controls['ipoExtensionNo'].touched) {\n <mat-error>\n @if (loginForm.controls['ipoExtensionNo'].errors?.['required']) {\n <small>Extension is required.</small>\n }\n </mat-error>\n }\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"avaya-ipo-field\">\n <mat-label>Password</mat-label>\n <input matInput formControlName=\"ipoPassword\" autocomplete=\"off\" autocapitalize=\"off\" autocorrect=\"off\"\n spellcheck=\"false\"\n (keypress)=\"restrictNumeric($event)\" [type]=\"showLoginPassword ? 'text' : 'password'\" />\n <mat-icon matPrefix>lock</mat-icon>\n <button mat-icon-button matSuffix type=\"button\"\n (click)=\"showLoginPassword = !showLoginPassword && !hasAvayaSocketError\">\n <mat-icon>{{ showLoginPassword ? 'visibility_off' : 'visibility' }}</mat-icon>\n </button>\n @if (loginForm.controls['ipoPassword'].invalid && loginForm.controls['ipoPassword'].touched) {\n <mat-error>\n @if (loginForm.controls['ipoPassword'].errors?.['required']) {\n <small>Password is required.</small>\n }\n </mat-error>\n }\n </mat-form-field>\n\n <button type=\"submit\" class=\"avaya-ipo-btn\" [disabled]=\"showLoginLoader\">\n @if (showLoginLoader) { <span class=\"avaya-ipo-spinner\"></span> } @else { <span>Login</span> }\n </button>\n </form>\n\n</div>\n</div>\n", styles: [":host{display:block;width:100%;max-width:100%;margin:0;font-family:Open Sans,Helvetica Neue,Arial,sans-serif}.avaya-ipo-login-simple{width:100%;padding:24px 18px 32px;background:transparent;border-radius:0;box-shadow:none;display:flex;flex-direction:column;gap:16px;box-sizing:border-box}.avaya-ipo-logo{display:flex;flex-direction:column;align-items:center;gap:6px;margin-bottom:4px}.avaya-ipo-logo-img{width:140px;height:40px;background:url(data:image/png;base64,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) center/140px no-repeat}.avaya-ipo-logo-text{font-size:18px;font-weight:700;color:var(--sd-text);letter-spacing:-.2px}.avaya-ipo-logo-text span{font-size:9px;margin-left:4px}.avaya-ipo-alert{margin:0;padding:10px 12px;border-radius:var(--sd-radius-sm);font-size:13px;line-height:1.4}.avaya-ipo-error{background:var(--sd-accent-soft);color:var(--sd-call-end);border:1px solid var(--sd-call-end)}.avaya-ipo-form{display:flex;flex-direction:column;gap:12px}.avaya-ipo-field{width:100%;--mdc-outlined-text-field-outline-color: var(--sd-input-border);--mdc-outlined-text-field-focus-outline-color: var(--sd-accent);--mdc-outlined-text-field-hover-outline-color: var(--sd-accent);--mdc-outlined-text-field-container-fill-color: var(--sd-input);--mdc-outlined-text-field-input-text-color: var(--sd-text);--mdc-outlined-text-field-label-text-color: var(--sd-text-muted);--mdc-outlined-text-field-input-text-placeholder-color: var(--sd-text-subtle)}.avaya-ipo-field .mdc-text-field__input{font-size:14px}.avaya-ipo-btn{width:100%;height:46px;border:none;border-radius:var(--sd-radius);background:var(--sd-accent);color:var(--sd-accent-contrast);font-weight:600;font-size:15px;cursor:pointer;transition:transform .12s ease,box-shadow .12s ease,background .12s ease;box-shadow:var(--sd-shadow-md);display:inline-flex;align-items:center;justify-content:center}.avaya-ipo-btn:hover:not(:disabled){background:var(--sd-accent-strong)}.avaya-ipo-btn:focus-visible{outline:none;box-shadow:var(--sd-focus-ring)}.avaya-ipo-btn:disabled{opacity:.7;cursor:default}.avaya-ipo-btn:active:not(:disabled){transform:translateY(1px)}.avaya-ipo-spinner{display:inline-block;width:16px;height:16px;border-radius:50%;border:3px solid var(--sd-accent-contrast);border-top-color:#fff6;animation:spin 1s linear infinite}.avaya-ipo-footnote{font-size:13px;color:var(--sd-text-muted);text-align:center}.avaya-ipo-footnote a{color:var(--sd-accent);font-weight:600;text-decoration:none;margin-left:4px}.avaya-ipo-login-background{background:transparent;padding:0;min-height:100%;display:flex;align-items:center;justify-content:center}:host-context(.avaya-ipo-mode-standalone) .avaya-ipo-login-background{min-height:100dvh}@keyframes spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i1$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i2$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2$2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2$2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i2$2.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i2$2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: i2$1.NativeElementInjectorDirective, selector: "[ngModel], [formControl], [formControlName]" }] });
|
|
2121
2321
|
}
|
|
2122
2322
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: AvayaIpoLoginComponent, decorators: [{
|
|
2123
2323
|
type: Component,
|
|
2124
|
-
args: [{ selector: 'app-avaya-ipo-login', standalone: false, template: "<div class=\"login-background\">\n <div class=\"login-simple\">\n <div class=\"logo\">\n <div class=\"logo-img\"></div>\n <div class=\"logo-text\">IP Office<span>TM</span></div>\n </div>\n\n @if (hasAvayaSocketError || hasAvayaLoginError || hasAvayaLoginFailedGeneral || hasAvayaLoginConflictError || hasAvayaDeviceError) {\n <p class=\"alert error\">\n @if (hasAvayaSocketError) { Connection issue detected. }\n @if (hasAvayaLoginError) { Invalid extension or password. }\n @if (hasAvayaLoginFailedGeneral) { Something went wrong. Please try again. }\n @if (hasAvayaLoginConflictError) { Another user is logged in with this extension. }\n @if (hasAvayaDeviceError) { Device access error. }\n </p>\n }\n\n <form [formGroup]=\"loginForm\" (ngSubmit)=\"onLoginClick()\" class=\"form\" autocomplete=\"off\">\n <mat-form-field appearance=\"outline\" class=\"field\">\n <mat-label>Extension</mat-label>\n <input matInput formControlName=\"ipoExtensionNo\" autocomplete=\"off\" autocapitalize=\"off\" autocorrect=\"off\"\n spellcheck=\"false\" (keypress)=\"restrictNumeric($event)\" />\n <mat-icon matPrefix>call</mat-icon>\n @if (loginForm.controls['ipoExtensionNo'].invalid && loginForm.controls['ipoExtensionNo'].touched) {\n <mat-error>\n @if (loginForm.controls['ipoExtensionNo'].errors?.['required']) {\n <small>Extension is required.</small>\n }\n </mat-error>\n }\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"field\">\n <mat-label>Password</mat-label>\n <input matInput formControlName=\"ipoPassword\" autocomplete=\"off\" autocapitalize=\"off\" autocorrect=\"off\"\n spellcheck=\"false\"\n (keypress)=\"restrictNumeric($event)\" [type]=\"showLoginPassword ? 'text' : 'password'\" />\n <mat-icon matPrefix>lock</mat-icon>\n <button mat-icon-button matSuffix type=\"button\"\n (click)=\"showLoginPassword = !showLoginPassword && !hasAvayaSocketError\">\n <mat-icon>{{ showLoginPassword ? 'visibility_off' : 'visibility' }}</mat-icon>\n </button>\n @if (loginForm.controls['ipoPassword'].invalid && loginForm.controls['ipoPassword'].touched) {\n <mat-error>\n @if (loginForm.controls['ipoPassword'].errors?.['required']) {\n <small>Password is required.</small>\n }\n </mat-error>\n }\n </mat-form-field>\n\n <button type=\"submit\" class=\"btn\" [disabled]=\"showLoginLoader\">\n @if (showLoginLoader) { <span class=\"spinner\"></span> } @else { <span>Login</span> }\n </button>\n </form>\n\n</div>\n</div>\n", styles: [":host{display:block;width:100%;max-width:100%;margin:0;font-family:Open Sans,Helvetica Neue,Arial,sans-serif;--avaya-red: #e3000f;--avaya-red-soft: #f35661;--avaya-red-light: #ffe5e8;--text-dark: #2c2c2c;--text-muted: #6b6b6b}.login-simple{width:100%;padding:24px 18px 32px;background:transparent;border-radius:0;box-shadow:none;display:flex;flex-direction:column;gap:16px;box-sizing:border-box}.logo{display:flex;flex-direction:column;align-items:center;gap:6px;margin-bottom:4px}.logo-img{width:140px;height:40px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAB4AAAAIlCAYAAAA0S+U8AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAAB3RJTUUH6AcJEjIdaD/vYwAAgABJREFUeNrs/XuYXWVh8P1/10wmGQgJGJCgBZFEKgglkNkzyRt81DxStEWIgG+EIhgwHCVySEIC2N97XX1ETgEBAyLKQcRiUyuHorbWx6hgmszsGQyKKBhoPVREoZxJMpm9fn+s3RaVzL7X3nPY99rfzz+9Lqsw811r1rrX6b5BkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkgosMYFUvzL8FXBQEX+3CtzbA+vcyoXYT2cDCy3h/i9pTI+9hwP/2xLhhuCWOfCoJaLazzsS+P9SmFDE328zXPJ2eMEt3Vr64bQUZliiMQl8pwv+yRKS/uAY25XC/2uJxqTwQjdcYgn3/ybaJx/thlvcylJzmWACqT7rYBpwIzCliL9fe3bTusctHb9t8LMJcDqwizXCtMF8YI4lJNV58dvWD9cC+1kj2K92gv+fGaLb148HLi7q79cJvwWucku33H49CVhhiYY7HoEPgCX9scuAw8zQmDa4wgpRnhuvoKAvCScwWIZvleDnbmmpqc4XkuoxCZZQ0Ie/1UFJ9wC82y0dv7nwPPBZS+TS0wvzzCCpHgOwAB/+5h13XHUAbLVEVNssSWB5wX/NZWuh063dWjbDbWTjZzXmwH6YawZJrxojz0q9zzQip6oUrjFDXHqhm2LPENUBnOOWlpqLD4ClOmyEySmcXfTfcwgudGsXwzb4FPCKJXKdIJdZQVKdPH7k88yO8DkzxKU/e9HhwIL/mntMhRPd2q3l7fBCCl+0RONSWGwFSf+lAhfhcoQjcWy9uQS/tkRc2lrjHuvpZdjNrS011bFHUl5b4TRa4ISWwLt9a7sY5sJvgC9YIpcFZb/gk5RTH/SkziCQSwqfPgBetER048TlLbJ/rlgD7W7x1tIG12ebXw06bj1MNYOkvmxt9WMs0bDBCbDKDHGp3lta0AK/6mTgLLe41FTXNZJynrQ7Eji3VX7fSovc3GsFQ9laI9sskesc6fQ1knJJYKUVcnkpgdVmiG48PL+FXnSYOROOdau3li54JIVvW6JhkzvgODNIqr44NsESjUnhjkPg3ywRnZW0znOYcx6GndzkUnPwAbCUf7B1IvCmFhqkH90LB7jl4zcHngDWWCKXRethuhkkhah+2XCUJXKNM24qwe8sEZ2WWiYkhYtSp6xsxeOTL6eMDKeBllrcRtgd+LAlGlYBLjdDXHphL+D4FvqVp2323C81DR8ASzmk0JbA0hb7tRPXQi3UQf+S6kWDwnS2w5lmkBR0wsy+bHCq2HCDKVxjhrj0wsHAYS32a88agPe49VvL4/CPZC9QqrFr6O7qcUNSi9oGHwN2sETDvtINPzVDXNqya8SJLXbuX/pwi/3OUhMfgySFKmfrlbytBX/1EwZgb/eA+M2GHwNft0S4BJZszNYxkaTt2gC7ks0SonC3l+DnZohLO3ycFvwattJiXz0LFsIQcJMlRuS48RErSK1pI0xO4QxLjAi//o3zGvGUFvzV93wZPuQeII0/HwBL+axo0d+7owLnu/kL4xMmyGXaIJxkBkk1BtVL8GWRPCrVtekVkT54awpHt+LvnsA7+uBQ94KW83lgsxkak8KJZdjRElLrGYTTyR6CqTH3lWDADHGZAOe16jViAhetcXYsadz5AFgKVIbDEyi1cILFA/B694T4lWBDCt+zRC7LHLhK2p610Jn4ZUNe/zAHHjVDdFa08jVkAivdBVpu3Pw74MuWaNjOSTablqQWUoYO4BxLNC6Fy6wQlwdgSgpntXCCmfu06IujUjPxAbAUrtWnfduxkq3bomIc/C+1Qi4zZsICM0h6LVPgZGC6JcIlTmEXnfWwZwIntHiGI/rgEPeG1pLCdVZoXAVOtYLUcuO9E4A3WaJh3+6G75shLpPgTOB1LX4MuDhtwaVjpGbiA2ApQB/0AO+yBEvKsLMZ4tcF/4TTB+WStu4U8JKGPza04QtSef1zF/SbIS7tsBSY2OIZkiTroBbSDQ+m8K+WaPCPB97RD/tbQmqZMXKSwjJLNK4NPmmFuDwGkxK/fgc4uB/+3AzSuJ5DJAVcrF5kBSCbuus0MxRmv3btxXx6emGeGSS92kA2O8B+lgjnFHbxWQfTElhsCQCO64e3mKG1tMH1VmhcJZsxQ1ILKMORwAGWaFjvbPi/ZojLs7AIeKMlAJdQkcb7OkbScKpvKR9piUwK56+FTkvEbxN8BXjMErlOmr7BLOkPeVzIp7cbvmOGuEzMvmDYyRIAtKdwvhlaSyf8PfCkJRqTwMmPwSRLSC3x936BFUak4yesEJc10O6MMb9nvh9TSOPHB8BSbRf6t/J79pgKJ5khfgthKIErLZHLgrJf+kmq6oOe1IvZXFK4xApx2QiTgbMs8XtOKcMbzNA6DoCtwOcs0bDdnoX3mUEqtjLMAQ61RMN+PBu+Zoa47AMLgX0t8T/afCFEGs+/P0nb0wt7pXCcJX5fCivWwgRLxG8q3A78yhK5zpuu4yIJgMTprPJ6pAT3mSEug3AGsJslfs8kxwMtOQi8MfuTUIOcTl4quBQutsKIdPw/CVQsEd014nIr/JGj+uBAM0jjcg0jaZiT9gqgwxJ/ZMZO8AEzxG9f2AJ8yhK5LFoP080gtbY+mAEcZYlc46pPehMrLtWpWs+zxGs680HYxQytYzb8B3C3JRo+Fxw+AHtbQiqmMuyXwBGWaNimF7NluxTX/n8EcIgl/vj071fA0vjwAbC0HRth9wROscR2L9wvTCGxRPw6sq8ZfmeJYJ3tcKYZpJY/Dy4H2i0R7Ocp/J0Z4vJ8tuzHn1jiNU2tODV2y2mD1VZoPGPF62ypyFbi/eaGpfDJ+bDNElHu/3rtffr4B+HNlpDG/PpF0msZhHOBHSyxXQeV4S/MEL9Z8BJwgyXCJbCkuiaipBa0AXYFTrRELpeXnDo1KmugPXUKu2GlcE4ZdrRE65gN3wMeskTDTlnjS1RS4ayHPYHjLdGwX+wId5ghLv3wv4C3W2K7JmyDZWaQxpYPgKXXHrROxS/8akrgr61QDFvhWuBFSwSbNph9FSWpNQfQS/AlkDye2gq3miEuM7PlPva1xLB2T/2SsRWvga63QsP23AfeYwapWCZky0ZMtETDrjwAtpohOheaoOYY6iNleIMlpLHjA2DptQetZ+GaXiHmln27rRDmwTMpfN4SuSzzywWp9ayFzgTOsEQu18yDV8wQl9R1uoIkcEEZOizRUn8bdwDPWKLhv53FVpCK4yF4HXCqJRr2FHCzGeLSDwel8F5L1NSZwtlmkMaOD4ClP/AYTAI+Zolgrm9REENwFb5lmseMmbDADFJrmQInA9MtEez5dviMGeLSn93Amm2JIHulcJwZWkcJXgZus0TDjhyAN5pBKoYt2YcUUyzRsKur5xnF5UIgMUNtCZz9oB9dSWPGB8DSH3gum8bN6SjCHdEHh5ghfnPhlyl8yRLhUlhhBaml/ubb8CWxvG44BJ41Q1wqTmGXSwIXpl5bt9yxLftTUQMmVFxSRSqE6gw5ftXXuOeAG80Qlz6YkWZLpyjM1CE43QzS2PAiVXqV6nSu51sinwSWW6EwLsebWXn09MI8M0itYSD76n8/SwTbDFxnhriUYU4C77BELvuX4UgztI4SbAK+YYmGnZr6xZQUveoMOXtYomHXlrKHwIrLCmCCGXI5bx3sYAZp9PkAWHqVmdn0bW+xRG4LH4R9zRC/bvhpAndZIteJdJkVpJbh33s+t5Tg12aIzsdNkF8CF1mhtaRwvRUaNqMf3mUGKV5+SDFiXmqD1WaISy/skTibRT2mT4RFZpBGnw+Apf+5gE+czrVu7RVYaoZiGIJPZH8SCrSg7BeBUuH1QU/qF/85TydcbYa4DMDbgL+0RF16yjDfDK2jBP8EPGqJhi02gRSvmdnUt35I0bgbZ8NvzRCXtuxeaKcl6rJ8rV9OS2NxnJIEMADvA/7MEvVJYdEAvNES8euBHwDfskSuc+k5ZpCKLYGVVsg1LrizOkWqIlKBi71GbIhrJ7fWeSFNXatxJBxbht3MIEU75nNJsMZtafPFyeiUYWfgVEvUbZ+p8EEzSKPLi3vpfwatfv3bmElDcK4ZCuNSE+SyaD1MN4NUTH0wAzjKEnmGVVxuhrhsgH2AhZZoyJ8PQMkMrWMC3Aq8ZInGriOBE8wgRTlGPgzoskTDbpkN/2GG6HyM7CGw6r9ovDj1+ZQ0qvwDk4BeeCdwqCUak8AZD8HrLBG/EqxNYJ0lgnW2w5lmkAp7fltOtr6Zwnr9Yzf8yBJxaYcLcBq2hqXOFtBSDoFnE7jDEg1zGmgpQm1+SDEStg3BlWaISxl2BJZYomH7D8ARZpBG9Vwtqc3p2kbKlK3wUTMUQ+pFSC4JLNkIky0hFcsG2BU40RLhhvz6NzrVWSw+bIkRGT8dXV1LWa0zBrwu2/RqwIH9MNcMUjwGYFYK77ZEw/52DjxhhuicCrzeDCMydr7YCtLo8QGwHLTCLOBwS4yYc30IVgxdcA9+wZXHtEE4yQxS4QbLS/C8FiyB7/Y4g0R0JsB5wA6WGJnDRgpLzdA6ZsOPge9aojGpXwFLUanARdnQT41krMAVZohLGTrIxs4aGXMG4B1mkEbp4tQEctDqoHWE7ToIp5ghfgmkfgWc27I1ThMrFcZa6EzgDEvk4hrykVkPU4HTLTFyUjixDG+yREtt8+ut0LDjqscjSU2uD2YAx1iiYV/tgYfNEJckW7d+b0uMnCFn5pRGjQ+A1dLKMBM41hIjbvnDMNEMhRjY3gn8myWCzZgJC8wgFcMUOJlsalyF2TgbvmmGuHTA2cAulhjZrKlfhrSUF+Fu4JeWaMjkDjjODFIU9wmWAxMs0XDHy6wQlxSSFJZZYsT/Ft7bD12WkEaeD4DV6lbi13qjYa9X4HgzxK8EgylcZYlcFwQrrCAV4m+5DfiYJXK5JHEdzKishc40m+ZcIyyB0wZcG65lzIdtwGct0TCngZaa3EbYHfiwJRoeJ3yjC/otEZcBOBo4wBKjcv19gRWkkecDYLWsXtgD+JAlRs3K1GNMIbwInweetESwnl6YZwYp+ov7BcB+lgi26XH4qhnislP2sGUPS4yKHSvZ19VqEW3ZA+DNlqhfCt29cLAlpOa1LXtBcgdLNHy8+6QVotxuy60wao7dAH9qBmnEr1Gklt35lwOdlhg1+w04FW4hzIfNCXzaErmOL04JJMXPv+McUrh0IQxZIh5l6EhgqSVG1dkPwBQztIbZ8NsE/t4SjWmHj1hBak4bYXIKZ1iiMQl8twQPWCIufXAYMNcSozcEaPcBuzTifACslrQOpgGnWmLUXWiCYhiE1cCzlgi2oOyXg1LMF/c9qV/y5/GrHeGLZohLmi3X8WZLjKppnXCaGVrq7+p6KzTc8MQy7GgJqSnvC5wO7GqJho9zfv0bocR7nGPhw2V4kxmkkeMDYLWkSdlaZ76NP/qD2u4BeLcl4jcXnsd1zfKeX88xgxTtxf1KK+Q63191AGy1RFTbLEl8w36sLFvrrEMtowQbEuizREN2TuAYM0jNpQwdXuOOiAe74F/MEJde6Ab+tyVGnccZaYT5AFgtpzpljetxjZEh35ArjG3wKeAVSwRbtB6mm0GKSx/MAI6yRLBndoTPmSEu/dkyHQdaYkzsMRVONEPr8CvgxlWcrUtqOgmcgF/mjYS/SSA1Q1zavLc5lk4vw25mkEbs+CW1lq3ZNGyeSMbuIuHd/a6RUQhz4TfAFywRrLMdzjSDFN15aznQbokwKXz6AHjRElHu5xq7v5MVazyutIyd4cvAU5Zo6Bj1jn7Y3xJS05zHkhSWWaJhj3TBvWaIS3V5rwWWGDOTgbPMII0MHwCr1U7aHQmca4mxVfEmY2EMwRXANkuESWDJxmzwKikCG7I1zfxSL9xLSbZGvOIaD893jesxN3MmHGuG1rAvbAFutkTD15AnW0FqmrHDkcABlmjYJxKomCE6K/EZylg752HYyQxS4zx4qaWk2U1dp6wZYwkc3evFQiHMgSeANZYINm0QTjKDFM3AeAm+tJHn/H5TCX5nieg4hd34XIdclEJiidZQgc/gS5ONnmNOfgwmWUJqir/HC6zQsMdf8F5KdHphL+B4S4y5aZthsRmkxvkAWC0jhbYEllpifK4X2pwuqEgnjkvwrdU8ljnto9T81kJnAmdYIthgCteYIS69cDBwmCXGxawBeI8ZWkMP/CJ1ms9G7fYsvM8M0vgqwxzgUEs0JoHL5vtiUHTashkNJ1pi7KWw9GHbSyNxHJNaZtB6DPA2S4ybEwZgbzPEbzb8GPi6JYLNmOl6MVLTm5JNNTndEsFuL8HPzRCXdvg4foU6bip+fd1S2uB6KzTMr3+kcZbCxVZo2C+nwu1miEt1eaBTLDFu9nwZPmQGqeFrEqllrDDBuOqowPlmKIxPmCDXRbPHH6m5/0bbgI9ZIliluia8ItIHb03haEuMnwTe0edXVC2jC74N/NASDf3NHO5LxNL4KcN+CRxhiYatqq4Pr4hMgPNweaDxHgdc5Ix6UmN8AKxWGbQenkDJEuNu8QC83gzxK8GGFL5niWA9vTDPDFJzGsi+0t/PEsH+YQ48aoborPD6b/wlsNIKLeVGEzSkreLXV9J4WunYoWFP7wA3myEuD8CUFM6yxLibuY8vsEqNDaZNoBbhdGvNYceKX1gV6QRyqRVy9XIdbKl5+feZQwKXWyEu62HPBE6wRFM4og8OMUNr2CGb8vM5SzTkFL/+kcZn7AAcb4mGx81XHwAvWiIuk+BM4HWWaIq/oYtTl7CR6uYDYBVeH/QA77JE01hShp3NEL8u+CdgwBLBFvTD/maQmm+ckPqFfh7/3AX9ZohLOywFJlqiKSRJtj3UAqo3/W+zREP23AfeYwZpbFWnv3Xs0Jjn2+AGM8TlMZiUwDmWaBoH98Ofm0Gqjw+AVXgJXGSFprJzAqeZoTB/X64BmeOcm/oFvNSMxzGnY80hhcusEJd1MC2BxZZoKsf1w1vM0DLnmdVAxRINNfQYJo2hh7IvH0+1RMPHrk8fAs9aIi7PwiLgjZZoKl6zS3XyAbAKrfq13ZGWaC4pnL8WOi0Rv03wFeAxSwRbtB6mm0FqDn0wAzjKEsF6u+E7ZojLxOwLhp0s0VTaUzjfDK2hC34G/IslGnLkgDfjpTGzJVv7dIolGvJyAteaIS5roN2ZWprS/F5n7ZLq4gNgFd2F7udNaY+pcJIZ4rcQhhK40hLBOtuztWQkNYEEluO6gsFSuMQKcdkIk8lu4qr5nFKGN5ihZc4311uhIRMqXj9KY2ItdCZwtiUaPu5/djb81hJx2QcWAvtaovm0wQVWkOr625GKqRf2SuE4SzSnFFashQmWiN9UuB34lSWCLwSXVG/ISxpHG2BX4ERLBHukBPeZIS6DcAawmyWa0iRcX65lzIavAY9boiGnppCYQRpdU+BkYA9LNDYES+EaM8Sn+oKwmtNRfXCgGaR8fACsIp+0VwAdlmhaM3aCD5ghfvvCFuBTlgg2bdAvGKRmGAQvwZcx8oyrPpm4hmVUHsseMJ5niaZ25oOwixla4hhaAT5jicauH/vhXWaQRs+abGYclyhoUAq3luDnlohLGY4ADrFE8w6n/ApYys8HwCqkjbB7AqdYosnP3HChb3EXQwfcCPzOEsGWrXHaWWncVKe2O8MSwX6ewt+ZIS7PZy8b/YklmtrUilN0t4x2+DzwkiUastgE0uiZmb2k/xZLNGRoAqwyQ5RWmqC5pXD8g/BmS0jhfACsQhqEc4EdLNH0DirDX5ghfrOym1k3WCLYjJmwwAzS+KhObTfdEsEuL8GgGeKxBtpTp7CLQgrnlGFHSxTfIfAscKclGnJs2WntpdE8Jzl2aLzhnYfAY5aISz/8L+Dtlmh6E7bBMjNI4XwArMJZD1OBMy0RhwT+2grFsBWuBV60RPCF4QorSOPyt9cGfMwSwZ7aCreaIS7VL3j2tUQUdk+duahltMFqKzRkEnCCGaSR1weHAV2WaPRSg8vNEOWG8+vfSCTwkV7XKZfyXH9IxTIhm0ZtF0tEY27Zt+wKYR48A9xsiWA9vTDPDNLYGsi+vt/PEsGumQevmCEufsETlwQuKEOHJYpvNmwEHrBEQ5wGWhoFbb6gPBLu7oYfmSEu/XAQzk4Yk84ElphBCj6/S8XxWPZGsF/1xMc37QpiW7bWzVZLBJ+EnbpGGnv+3YV7vh0+Y4a49MN78Que2OyVwnFmaA0pXG+FhhzYD3PNII2cAZiVwrst0ZgKXGqFKF0IJGaIRwJnP+jHX1IQHwCrUJ7Lpk97gyWic0QfHGKG+M2FX6bwJUsEW9AP+5tBGht90JP65X0eN1TXrFREKtlNLEUmgQtTr89bZVv/A/ArS9Qv9StgaaTHDhfhA7BG/XMP9JkhuuvDGWm2dIriMnUITjeDVJsXmCqMNdAOnG+JOCVOVVgkl2fXkAo5D6fOWiCN5bnGGSfCbQauM0NcyjAngXdYIkr7l+FIMxRfCQYT+JwlGnLcephqBqlxfTADOMYSDV7YwyetEKUVwAQzROm8dbCDGaSa5yepGGZm06a9xRLRWvgg7GuG+HXDTxO4yxLBFq2H6WaQRlf15tZRlgh2Swl+bYbofNwE8UqyL7DUAobgs7hsSiMmd8AHzSCNyLlnOT4Aa0gK/zobvmeJuPTCHgmcZIloTZ8Ii8wgDc8HwCrKYCtJs7e2FK/2Ciw1QzEMwSeyP00F6GyHM80gja7qza12S4QexrnaDHEZgLcBf2mJqPWUYb4ZWmBDw5NkU0GrfqeaQGrMRtgd+LAlGtMGf2OFKLfbUqDTElFbvtYXWKRaxzopfgPwPuDPLBG3FBYNwBstEb8e+AHwLUuESWDJRphsCWl0bIBdgRMtEXw+vrMEmywRlwpc7PVdIbiGc+sca6+3QkP9unvhYEtI9duWLUfkFKqN+cFs+GczxKUMO+OLREWwz1RnBJGG5Q0CFeXiz69/i2HSEJxrhsK41ATBpg069ZA0mgPeJfiSRY5hFZebIS4bYB9goSUK4c8HoGSG4uuG7wP9lqhfO3zEClJ9NsLkFM6wRMMD508kzn4Wo4+RPQRW/H+DF6c+45K2yz8ORa8X3gkcaoliSOCMh+B1lohfCdam8K+WCLZsjdPTSiNuLXQm3tzKcx7+x274kSXi0u76fYVS8eXWlpHCDVZoqN+JZdjRElJ+g3A62Sw5qt9PSnCXGeJSPW8ssURh7D8AR5hBem0+AFYRdmKnSSuWKVvho2YohgSusEKwGTNhgRmkET6pwMnAdEuEqXjcjs76bP9eZIlCOaa6prMKbhDuBJ62RN12TuAYM0j5lKEDOMcSjUnhkwlULBGdxcDrzVCov8WLrSC9Nh8AK2oDMAs43BKFc67roRZDF9yDX5LlGbT6xY80sn9TbWTTeylAAt+tTkmqiEyA83D9vsJdp6ew1AzFNw9eSeBmSzRksQmk3GO+E4A3WaIhT7yYvcSjiFRffjjfEoUzZwDeYQbpNS4sTaCYVeCibOyqgtl1EE4xQyEuLNMUrrREsJ5emGcGaWQMZF/V72eJYK7dHpn1MJVsCkcVTHVqW2/Ot8Z4+QZgyBJ1/628sx/2t4QU/DeTpLDMEg13vHw+bLNEdOfcE4C9LVE8Q84QKr0mHwArWmWYCRxricJa/jBMNEMhBth3Av9mieATsxfj0sjx7yncxtnwTTPEpQPOBnaxRDE3b5p93a2Cmw3/nsDXLFG/Srbcg6QAZTgSOMASDXnyRfiCGeLiyw/FlsB7+6HLEtLv8wGwYrYSaDdDYe31ChxvhviVYDCFqywRbIFfMUiN64Oe1C/q87gkgdQM8VgLnSkssURxJXDagGvUtYQKrLZCQ38rJz8GkywhBf29XGCFhl05HzabIS4DcDS+/FBoqcc36Y/4AFhR6oU9gA9ZovBWph6nCuFF+DzwpCXCzs2pa5ZKDUuyF8UUZtPj8FUzxGWnbN3LPSxRaDtWsq+8VXAl+BbwE0vUbbdn4X1mkIZXhjnAoZZoyNM7wE1miE8Ky61QeMdugD81g/Q/fLCiWHfc5UCnJQpvv+r6jYrcfNicwKctEWzRephuBqk+fTADOMoSYVK4dKHrT0alDB0JLLVESzj7AZhihmKrzsBwgyUastgEUs0x38VWaNg1B8CLZoju+vAwYK4lCq+93Qf90u/xAbCisw6mAadaomVcaIJiGMymtnvWEkE62+FMM0j1SbKLPpeJCPOrHeGLZohLmi2T8WZLtIRpnXCaGYpvM9wGPG+Jus/9hw/A3paQXlsZ9kvgCEs05PmJcL0ZojxHeG+xdXy4DG8yg5TxAbCiMylb68y34FtECt0D8G5LxG9udkPrs5YIvkBZshEmW0LKZwPsCpxoiWBXHwBbzRDV2ChJfLO91Sxb6+xHhfd2eCH1hZxGtA3ByWaQtmsl3gdu1A0HwX+aIS690A38b0u0jA5cVk36nwGyCRSTjTA5dR2sljPkm3qFsQ0+BbxiiSDTBuEkM0i5B7dL8OWJUM9shs+ZIS7lbHrzAy3RUvaYAh8yQ0ucw64nmw5adUjgI2ucAUT6I+thT7LZQ1S/zcB1Zojy3Oo9xdZzRhl2M4PkA2BFZms2/ZkH8Na7kH93v2t1FMJc+A3wBUsEW+ZNLCncWuhM4AxLhEnh02+HFywR3QXcBVZoSSsdExRfFzySwrctUbc994H3mEH6fRPgPGCiJRpyUwl+bYa4lGE/YIElWs5k4CwzSD4AVlwn7Y4EzrVEa6o41WFhDMEVwDZLBJkx04sVKdiUbOrH6ZYI8lKSrc2uuMbD81OYZ4mWNHMmHGuG4vPY3HC/xVaQ/sdD8DrgVEs0ZLANrjZDlJz6vHWd8zDsZAa1Og+AikaarefnIu6teyF/dC8cYIn4zYEngDWWCD72rbCCFPS30oZr/eQ5r95Ugt9ZIjpOYdfax7mLUkgsUWyPwz+SjZdVnyMH4I1mkDJbsq/gpliiIbfPhn83Q1x6YS+c+ryVTdvsS2GSD4AVhxTaElhqiZaWtMEyMxTm5HMJULFEkJ5ev/aSahrIvpbfzxJBBlO4xgxx6YWDgcMs0dJmDTi9beEthCHgJkvUbUIFTjKD9N/Lo5xtiYYMVWcxU2TaspkEnfq8haWw9GH3AXkslJpfGY4B3maJlnfCAOxthvjNhh8DX7dE8Mnalx+k2vw7CXd7CX5uhri0w8fx68+WV/Er8FbxeWCzGep2ql/LS/+9PMoelmjImjnwqBnisgF2BU6xRMvb82X4kBnUynwArFg4BaoAOipwvhkK4xMmCLagH/Y3g/Ta+qDHdVGDVRK4ygzR7eNvTeFoSyiBd/TBoZYotuoU/V+2RN1m9MO7zKBWtgba8f5Jo1LgUjPEZwKcB0y2hBK4IPUZmFqYO7+aXhkOT6BkCVUtHoDXmyF+JdiQwvcsEXa+Tl3bVBruom6lFYL9Qxc8YoborPDaTR7zWksK11mhsetGE6iVzYQPAG+xREPuLcEPzRCXB2BKmq19LQG8tTqzqNSSvImgGDjNmV5tx4oPworkMhMEW7QepptB+n19MAM4yhJhErjcCnFZD3smcIIl9CpHVNeEVoF1w4Mp/Ksl6nZsGXYzg1pVmq1/qgZUXPs3SpPgTOB1ltCrroEvdmkItSofAKup9UEPTt2kP7akDDubIX7d8A1gwBJBOtuzCxlJv38xt5xsijvV9s0u6DdDXNphKTDREnr1oa/Ndc9bQhtcb4W6TcKXZ9Si+uAwoMsSDV1jfKsH1lkiLo/BpATOsYT+wMHl7LgoteL1hNTUA66LrKDXsHMCp5mhMH/nvlUb3mrJRtexkf7bBtgVONESYVLXMIvOOpiWOI2pXttx/U7tWXid8PfAk5aom8dPtaS2bOkINaACl1ghPs/CIuCNltAfSpxhVK07JpCaUz/sDxxpCb2WFM5fC52WiN8m+ArwmCWCTBuEk8wg/fdAdgm+FBGqtxu+Y4a4TMy+YNjJEnoN7Smcb4ZiOwC2Ap+zRN0O7Ie5ZlArGYBZKbzbEg3Z4Lg5PmugPclmzpFey/xemGcGtRofAKuZXeg+qmHsMdUHYYWwEIYSuNISwZatcbpbibXQmcAZlgiT+hVDdKozPpxlCQ3jlDK8wQzF1gY3AoOWqPv851fAaimVbCY917pszP8xQXz2gYXAvpbQMGOqC6ygFtzvpebTC3ulcJwlVONifsVamGCJ+E2F24FfWSLIjJmwwAxqdVPgZGC6JYI8UoL7zBCXwewFh90soWFMwnXuCm82/AdwtyXqdtx6mGoGtYI+mAEcY4mGbOyCr5shPgkst4JqOKoPDjSDWokPgNWsJ+0VQIclVMOMneADZojfvrAF+JQlwqSu6ST/BtqAj1kieFz1yQQqlohHORsH+2BPIc58EHYxQ7G1wWor1G1yB3zQDGqRMd8yfEm+UZckkJohurHzEcAhllCtw6RfAasFryOk5rIRdk/gFEso8ALnwtTpjQqhI5ve7neWCNLj2iVqZQPZV/D7WSLIz1P4OzNEN75ZBOxlCQWYWnGq8MKbDd8DHrJE3U41gYpuI+xONn5Q/X72OHzVDFFaaQKFSOH4B+HNllCr8AGwms4gnAvsYAkFOqgMf2GG+M2Cl4AbLBF8Al9mBbUw9/9wl5dcOzIqa6A9dQo75ZDCOWXY0RLFlsD1Vqj7b6S7Fw62hIpsWzY7jvfSGjvOXrIQhiwRl374X8DbLaFAE7Z5P0EtxAfAairVtXnOtIRyDtL/2grFsBWuBV60RJAF/bC/GdRq+qAn9Qv4UE9thVvNEJeZ2fIW+1pCOeyeOoNS4aVwB/CMJerTDh+xgopqI0xO4QxLNOQXnfC3Zojy/OjXv8olgY/0wh6WUCvwAbCayoRs+rJdLKGc5pZ9268Q5mU3tW62RNg5PHUNVLXmxZoX+OGumQevmCEufv2rOo+NF1TXjlZBleBl4DZL1H1sPdEv5VVUg3A6sKslGnLZAbDVDHHph4NwVkDl15nAEjOoFfgAWE3jMZiEDzNUPx8IFMQ2WIUXXqEWrYfpZlCr6IMZwFGWCPJ8O3zGDHHph/cCXZZQHfZK4TgzFN4NQMUMddk5gWPMoKKpvvxzjiUa8htnzYnWhUBiBuWVwNkP+hGaWoAPgNU0nsumLXuDJVSnI/rgEDPEby78MoUvWSJIZ7vT5qu1LtKWA+2WCHLDIfCsGeJSyW5iSfUeIy9MvcYvtBJsAr5hibotNoEKeOw/AXiTJRpqeJWz5sSnD2ak2dIpUj2mDmWzJ0iF5sWhmsKa7Gbu+ZZQg4N2p0wsjsvx64bQ/X7JRphsCRXdhmxauxMtEWQzcJ0Z4lKGOQm8wxJqwP5lONIMxZbC9Vaou907+2F/S6hA+3SSwjJLNOSZV+BGM0RpBTDBDGrAeetgBzOoyHwArKYwM5uu7C2WUIMWPgj7miF+3fDTBO6yRJBpg3CSGdQCg9Yl+LJDqFtK8GszROfjJlCjErjICsVWgn8CHrVEfSpwshVUFAPwPuAASzR03rzu7fCCJeLSC3sk3gdR46ZPhEVmUJH5AFjjrvrG4gpLaAS0V2CpGYphCD6RHSIUYNkap8VVga2FzgTOsETo4ZOrzRCXAXgb8JeW0AjoKcN8MxRXAmnq12qN9Dv5MZhkCRWB99Ia9pKzKsSpLbv312kJjYDla/2SXMU+Xkrjq/rG4p9ZouaFah+u5RdyAbSo7FrShdADPwC+ZYkgM2bCAjOoqKZkX+tMt0TQefDO6hqRikgl+2rTa7Pa/sUEQVxLuuAmwK3AS5aoy27PZvcgpKiVYQ5wqCXql8D1JfidJeLyELwO124N8QrwgBlq2mcqfNAMKipvMmjc+cZimEr2NeRnLFHTpBTOM0NhXGoCj6Vq+X27DfiYJUJzcbkZ4rIB9sGbDiGe2QYfAB4zRU1/PgAlMxTXIfBsAndYom6LTaACDPoutkJDNqdwjRnisxXOBqZYoqbbXBok/Hia+pxMBeWOrXHVC+/ENxZDPFqC+zqywekr5hheAmdU3whU5EqwNoV/tUSQnl6YZwYVzUD2dft+lgg6//1jN/zIEnFph+U47ViI1XPheZziPEjFF8Na4Zh/HS6XUm+7wwdgb0soVmXYL4EjLFG/FG4uwa8tEd2+vyOwxBIhQ0Gu64L7E1hnjpr2H/CYqoLyAbDGewd0erKwC9RVCVRmwVMpfNEiNU3ZCh81Q2H2/yusEHxMXWYFFZD7dfhVvsfLyKzPpjZfZImatlSqM+HsnE196w3b2o6pri2tgpoNPwa+a4n6hs1D2fISUqxW4j3dRgxOgFVmiNJi4PVmqOmeEvwEIIUrzVGbsyqosINeE2i8DMAs4HBL1PTUlt+f3utyYMgsNZ27ESabIX5dcA9+0RZqQT/sbwYVRR/0pH7ZHiSB73bD9y0RlwnZshU7WKLm/n1bDzwJsC9sSeF6q9S+1k9hqRmKzb+Fho4rH1kD7ZZQbH4AfwIcb4mGjp13HAL/Zom4lKEDON8StVVe9YJD9Z7aj61S05wBeIcZVLiLQhNoHE9GF2XXXaph9bxXTfvcDY8ncLdZatp1EE4xQ/wSSH1jMfy8nrpWqor197/SCsFcMz0y62EqcLolakqBa1/9H0yCG4AXTFMz3IlleJMliuvF7Lrwl5aoy577wHvMoNhsyx6ATbRE3SpkH1YovmvDE3D6/hC9Pa+a9rl6T80lVAIMOVOpCsgHwBoXZZgJHGuJml6mOt3dH5yQHKyGWf6wF0ZFGejfiW/ohlpUnVJUilofzACOskSQjbPhm2aISwecDexiiZru7YJHXv0fHAT/CXzONLV3szT7ylwFNR+2AZ+1RN3XGIutoJg8BK8DTrVEQ77SDT81Q1xSSFKXBgo9t132h//ZLtnMkv9hnZrt3tsPXZZQkfgAWONlJU63FHLiuaUEv/vD/7wH+oDvWKimvV5xaqRCKMFgCldZIkhnO5xpBhXgHLjcsUKwS5LsK0lFYi10prDEEkFec42+bfApYKt5ah5LTxtwrbxCa8seAG+2RF2OHIA3mkGx2AJnAVMs0RA/qIjQABwNHGCJmh7fBPf+4X9YXULlWvPUlsIFVlDBrhWksdULewAfskRNQwxzck7hChMFWZl6rCuEF+HzVNf/0/ASWOIa2IrZBtgVONESQTY9Dl81Q1x2yr4628MSNc9nfSV44LX+f3OzaW/vtFJNO1ayr81VULPhtwn8vSXqMqECJ5lBMVgLnYnH80bdV4IBM8QnzV4OVm2rFmb3k//IENwIPGuimo7dAH9qBhWFD0U0HjvdcqDTEjXd1QU/297/sxu+ATxoppr2G4AFZojffNicwKctEWTaoDezFPdYYQm+xBAkhUu3d5Gv5lSGjgSWWqK2So2vdJLs/1+xVE1nP+AXY0U/F1xvhbqdmkJiBjW7KXAyvjzW6LHyMivEpw8OA+ZaoqanO+D27f0/58LzCdxkppra233hQAXiA2CNqXUwDdcrCZIETHebwNWWCnKhCYphEFYDz1kiyLI1Tp+rCFW/bjjDEkF+tSN80QxxSbPlKd5siZqeeALuHu6/UF0b+OumqmlaJ5xmhuIqwYYkWyZI+c3oh3eZQc2sel13viUau8zohu+bIUorTRB0jbF6Frw03H9nMLuP7LIRtX24F/Yyg4rAB8AaU5OyL3p8+7y2+7tgfa3/0vPwZeDfzVVzENQ9AO+2RPyqbyx+1hJBZsz063dFqPp1w3RLBLn6ANdAjW1MkiS+UR5qVcjX7YnLooRattZZmIp+fPEr4PotNoGa2Uz4APAWS9SvDS6xQnx6oTvxfl6IzUPwmVr/pbnwG+BL5qqpow3OMYMKcv6TxsZGmJy6XknoxfuqkP/efNgGfMpitQ35FXBhVN9YfMUSQceSFVZQZPtsG/AxSwR5ZjN8zgxxKcNRwIGWqL1/d8AXQv6LXXB/AutMVtMeU+BDZiiunbOXg5+yRF2OLcNuZlATj5F9eawxvbPh/5ohPm3eywt1a/Xhbsjx5EpcQiXEGY4NVJDjqDQ2tmbTjnngrO3REtyX47//OeB3ZhteAu/ud82QQqgOar9giSA9vTDPDIpFdc32/SwRdOH+6bfDC5aI7uLrAisEqTmF3R/8PVxpsiArXR6iuPaFLcDNlqjLJOCvzKBmVF3/tMsS9UvgE1aITzm7LnRWs9oqwHWh/+Vu+Clwr9lqmgycZQbFzgfAGquTdkcC51oiaGC6KsnxJlYJXgZusFzQiMi3ZgtiKJvucZslgk70y6ygiLi/hnkpydZEV1zj4fmpL+WE2FIJmMLu1brgHuDHpqtp5kw41gyFvt75jGPkup1qAjXp9ZyzOjXmx7Pha2aI0kp8dhHinhL8JM//IIVLzRbknIdhJzMo8nGENPpSOBF4kyVqemoL3JH3fzSUven1kvmGl8DRvXCAJeI3B54A1lgiyIJ+2N8ManZ90OPDseDz2U0lZ/+IkVPYhe3ft/XAkzn/N2maLRGh2tdlF6WQWKKYeuAXqV/11OtAZ4xSsxmAWanrnzZ63vs/idPdRqcX9gKOt0RtlcBlBF+tG3qB+61X07TNsNgMipkPgDUWg622BJZaIsjqeXWsbToHnk7hNvPVlPg1ZKFOYJfghVxQqtQ1VRXDATp7w1u1DaZwjRni0gsHk03hqJqXDlxb5zHkduAXJqxp1gC8xwyFHiNfb4W6D0De5FVTqcBF+NJOIza9CF8xQ5TnsuXAREvUvszogXV1jp2vMF/Q2GDpw+6Livt4Ko2uMhwDvM0SNb1Mzunu/uDC4Cqc7ivECQOwtxniNzub6vHrlgiyaD1MN4OaVR/MAI6yRJDbS/BzM8SlHT6ON3BD3NsFj9TzPyxlL0c4NXrYdYNfoxdYF3wb+KEl6nLcephqBjXR+PgYS9QvhU/O9z5ZdDbArsAplqgtgcvq/d9Wp0b/kRVr2vNl+JAZFCsfAGssuF5J2En7lkamc5wDTyS+2RiiowLnm6EwPmGCIJ3tcKYZ1MTnwOVAuyVqqiTZC1+KSB+8NYWjLRFkVSP/4yG4EXjWjDWPue/og0MtUWg3mqAukzvgg2ZQkxyrlwETLFG3X+5YxxJrGn8T4DxgsiVqenxTA8s+VJdQudKMQa0uSH2Opki542pUleHwBEqWqGmIOqe7+4MT0mVkU+dpeIsH4PVmiF8JNqTwPUsEHR+WbPQiSk2o+ob3iZYI8g/1fh2pcb3gusDrrqDzVF8JHmjknzEXngc+a80gvqRbYDtkU6I/Z4n8nAZazWAj7A4sskRDrjgAtpohLg/AlBTOskSQVQuz+8mNjL/vxNmlQry17IwMipQ3IjTanF4szF1d8LNG/yGzYSPwLXPWtGPFNVGL5DITBJk2CCeZQU04GF2CLyeEtnKdpsishz1TpwwLUoHLR+Kfsw0+BWy26PASeF91bWoV0AHwInCbJerS49+Gxtu27H7FDpao21PAzWaIzw5wBvA6S9T0dEf2sldDqkuoXGPOoLHzxalL+ihCPgDWqOmDHuBdlgg6iYzYdI6pN4dDLSnDzmaIXzd8AxiwRJBla5xmV01kLXQm2UW+avvmbCibIS7tsBSYaImanngC7h6Jf9Bc+A1O+Rh0CdKWTS+q4l5jrgYqlqjr2P0RK2i8bITJqePjRl1dgpfNEJfHYFIK51qithRWz4KXRuKfNRFuAp62ak0Hl+EwMyg2PgDWaF5wXmSFIPd3wfqR+od1Z18A95u1pp0TOM0MhTne+OJDmBkzYYEZ1CymwMnAdEsEXeRfaoW4rINpiVOJhmp4Crs/+HtZhQ++QhzXD28xQzFVZ5j6F0vUdQw5sQw7WkLjYRBOJ1siRfV5DtdBj9Kz2bTnb7RETZuH4DMj9Q+bBS8l/s0ESZzpVBHyAbBGRT/sDxxpiaCLy1WjcEK60rJB7c9fC52WiN8m+ArwmCWC9nvX/FOz7IttOB1/qN5u+I4Z4jIRzgF2skRNz3TAF0byH9gNPwXuMW1N7Smcb4biSuB6K9Rl58S1/jQOytBBNn5Q/a4tuQZ6dNZAe5LNnKPabq3OeDNiJsB1wCumrWl+L8wzg2LiA2CNlgvdv4I8WoL7RvofWn0Y9jPz1rTHVNdELYSFMOSLD8F6+uBQM2i8DcD7gf0sUVsKl1ghLhuzda3PskSQEZvC7g/+bi4zbZBTyvAGMxTTbPga8Lgl6uIMDhpzCZwAvMkSdXupLZv+XpHZBxYC+1qipgrZw9oRNStbN/sL5q2tDS6wgiLbZ6WR1Qt7pXCcJYIG96uSUZierjqF3qcsXFsKK9bCBEvEbyrcDvzKEkHHHt+sVTNwPwzzyGi8LKbRNZit3bebJWraUhnBKexerRt6U/ieiWuahF+bFXnMV2GU/sZa4DrxndWZzaSx2ueS1LXZG3XjbPitGaI8Xy23QpB7SvCTUToGXckILslSYEf1wYFmUCx8AKzROGmvIJu2RsN7agvcMVr/8BfgFuBJM9c0Yyf4gBnity9swRcfQi3whpbGUx/0pE6dFDqu+mTiWqZRcfrGXPv3bT2jOF5N4AorBznzQdjFDMXUDp9nFL6ybxGLTKCxMgDvAw6wRN22tMHVZohy7HwEcIglaquMwjKC/6U7mzHkq1aufYnhV8CKiQ+ANaI2wu4JnGKJIKvnjeL6CvNhM3CDmQPO3HBhCokl4tcBNwK/s0Tt83/q2qsa3+PuSisE+XkKf2eG6PbvRcBelqgpBa4dzX9BF3w9u0RRDVMrTlleWIfAs8CdlqjrIPXhsi+3a+z2txVWaMgts+E/zBAlrw3D9PbAutH8F7T58mTo8fr4B+HNllAMfACsETUI5wI7WKKmlxmDqbi2wvXAi+au6aAy/IUZ4lddQ9AXH8IsWg/TzaCx1gczgKMsUVsCV5Rg0BLxWAPtqVPYhbq3Cx4Z5b+hNPVroCApnLPO67jCck3Muk1PHbNoDJRhDnCoJeo2lHi+j1I//C/g7ZYIGtdeNtr/jtlQBr5t7ZomVFzSSvFcB0gjYz1MBc60RNBJ+5bSGHylOA+eSbMpv1R7m/y1FQpy5QfX4YsPITrbPWZrfI63y4F2S9T01JZsOQdFZCYcC+xriSCrxuJfkmRfPv7c3DXtPsmZnAprdvYl/AOWqMtiE2i0pXCxFRrypS74mRmi3Pf9+jfM45vg3jEaO/sVcNi+u7gX9rCEmp0PgDViJmTThu1iiZqGGOXp7v7gX3YVsNXsNc0t+9ZhIcyBp4GbLRE0sF+yESZbQmNlA+wKnGiJINeM5lIRGrUbAa4HFXb+6SuN0cOoEgymcI3Vg/bfFU53W+jte70V6jpeHT4Ae1tCo6UM+yXZGqiqT6XiA6so9cNBOBtfqFULs/vJo64L/hkYMHlNnQksMYOanQ+ANSIeg0m4nmSou8byzcS58MvE9QND+eZhQWzLviryxYfapg3CSWbQGA48l+BLByGebx+DpSI0svrhvUCXJWqrwOVj+e+bCDeRvSCm4e2VwnFmKKYE/gH4lSXyD1+G4GQzaBStxPuzjfhqDzxshihdmJ2eVMPTHXD7GP87rzJ70Njq7Af9GE7NPpA1gUbCc9l0YW+wRNDJYcxPoilcmf0f1XBEHxxihvjNhV+m8CVLBFm2xul4NQbWZm/InmGJIDccAs+aIS6V7CaWanviCbh7LP+Fs+ClBG40fdC1yoWp9wkKqQSDCXzOEnX9XXzE8bJGww/gT4DjLdHQ3+dlVohPH8xI4QOWqC2F1bPgpbH8dz6efUi0yfo1TR2C082gZuaFnRpWvRA63xJB7u+C9eNwsf9D4BvmD7p4WG6FwrgcqJihphkzYYEZNNqmZF/PTLdETZvJ1jJXRMowJ4F3WCLImE1h92oTsr8rp1Wvbf8yHGmGYhqCz+IsOfXYcx94jxk00rZl99ImWqI+CXyjC/otEaUV2fBMta4Nh8ZhZqiFY7x8YeTOWwc7mEHNygfAatjMbJqwt1iitjSblnZcuCZK+DjnQdjXDPHrhp8mcJclgo5NK6ygUd7H2nCpiFC3lODXZojOx00Q5JkO+MJ4/ItnwVOM0787NglcZIVi6oEnyaaCVv6/i8VW0Eh6CF4HnGqJhq4xPmmF+PTCHolLUYW6dS78Zpz+3TcDv3UT1DR9Iiwyg5qVD4DV6GAr8cFBsEdLcN84Xux/N4V/dTPU1F6BpWYohiH4BE5/HnSI6INDzaDRMgDvB/azRMhhi6vNEN3+/TbgLy0RZMynsPuDa5crGYevj2McF5RhvhkKew1/vRXqcuQAvNEMGilb4CxgiiXqk8B3S/CAJeLTlt1z67RETRXGcWaoErycwg1uhiDL1/pFu5r3mCvVbwDeB/yZJYIGp6uScZ6Otm0cv0COSQqLvLgvhh74AfAtSwQdo3zxQaPJ/Svs/HNnybWWolOBi72uCrKlMg5T2L1aNzwOfNVNEcQ1rQuqG76PU6bWY0LFL9Y0QtZCZwJnW6KhcbNf/0aoDDvjl++h7inBT8bzBxjMHkC/6KaoaZ+p8EEzqBl5o0KNDrj8+jfMU1vgjvH+IWbD3cAjbo6aJg3BuWYohgQus0KQBf2wvxk00vqgJ4V5lggZVnG5GeKyAfYBFloi6Hx8W3X62XFV8YZxqD8fgJIZCnvC8Yue+pyaQmIGNWoKnAzsYYm6PdgF/2KGKH2M7CGwao9Zx/0jnnnwDHCrWyNobHVx6rM2NSF3StWtF96JU4aGWj0PXhnvHyKBSgKfcnMEtTqjuiaPItcF33b687AxQeoarRqd4+lKKwRdMN7XDT+yRFzaYTlO9xW4i3NtM/wg1dlBvu0mqa3iy76FNQh3Ak9bIrcZ/fAuM6gRa6AdON8SDfmbxKWeolOGHYEllgjS2wPrmuR652pgm5ukpv0HXBZITcgHwGpk53FasDAvM87T3b3aVLgd+LWbpaYpW+GjZiiGBK6wQpBF62G6GTRS+mAGcJQlgvj1b2Sqx8tFlghyb1dzzULj31uYY6prXKtg5sErCdxsibosNoEaMRM+ALzFEnV7pAvuNUO0x8/Xm6G2ZprJ7hD4N2CNW6W2FD5uBTUbHwCrLgMwCzjcEkEn7VtK8Ltm+Xn2hS1kaziotnM3wmQzxK8L7sEv60J0tsOZZtAIngOXk33loOE7fbe6JqMiMgHOA3awRJBVzfTDlOCb2SWNat0vSF3DvcjnnhuAIUvkdmwZdjOD6pVm42PV7xMJVMwQlzJ04JfvoR7f1GQvOSTZy5N+dV/bnAF4hxnUVBd0JlA9KnARrn0TYogmme7u1bZlF/vPuXlq2nUQTjFD/BJIU7jSEkGtlvjig0bCBtgVONESQS41QVzWw1TgdEsEnVf6SvBAs/1caZM9lG5WKZxYhjdZonhmw78n8DVL5DYJ+CszqB59cBjQZYm6Pf6CXyLGOh48AdjbEkFWLWyyF7S64CGyFyhVw5AzpqrJ+ABYuZVhJnCsJYLc1QU/a7Yfai48D3zOzRNk+cMw0QyFuOC4k2zqGg1v2iCcZAaNwCBzCb5MEGLjbC+mo9MBZwO7WKK2SpNOt/xEdgN5k1uo9u6eZl+7q4BSuN4KdTnVBKpzfOza6o1d018237VIYzzXJCkss0SQpzuypfua8e/PpdXCOr233xd91FxjDym3lTidY+hB/6pm/dkmwDXAVrdSTXu9AsebIX4lGEyb+G+yySxb43FeDVgLnQmcYYkglyROpxXd/p1mLziotieegLub8QdbCENpNh5W7Wua0wZcs6+QuuBfgJ9YIrcD+2GuGZTHAMxK4d2WqNsvpzbpgzHV3PePBg6wRG0prJ4FLzXpmOHbwAa3UtB2vMAKahY+AFYuvbAH8CFLBLm/C9Y36w93MPwqhS+5mYKsTD1eFsKL8HngSUvUNGMmLDCD6jUFTgamW6KmTY/DV80Ql51gMdmYWLU13RR2r5bALcBv3Uw17VjJvnpXwVRfQLrBEvml2blACuZSao2PKfaFLWaI8njputdhNg/BZ5r8Z/SjijDHboA/NYOagQ80lHeHWQ50WiJogBPDumKXZ9chqmG/AR+GFcJ82JzApy0RdAxzejLVu++0AR+zRFCrS5v54Zj+WBk6ElhqiSDPdMAXmvkHLMHLiVPghjr7AZhihuLZDLeRLRGkfI6rrgcv1dQHM4BjLFG3p3eAm80Q5b5/GM6YEOrWufCbZv4Bqy8vP+amqqm93Rcf1CR8AKxg62AarnUT6tES3NfsP2Q3/DSJ4OdsEheaoBgGYTXwnCVq6umDQ82gvAbg/cB+lqjpVzvCF80QlzRbFuLNlgjStFPYvdqW7MWwF91cNU3rhNPMUDxvhxdSz0f1mNwBHzSDQiTZ+qcTLFF3v6sP8Fwdq5UmCFIBrmv2H7L68vLVbq4gH+6Fvcyg8eYDYAWblK115lvfYYPTVUkkX9am8Em3WFCn7gHX6ymEufB8Ap+1RNCxzK/cVA/3mzBXHwBbzRDVWCBJfJM71JZK809hB8A8eAa41U0WZNlaZ4MqpLbsS3jXo89/XnAaaNW0EXYHFlmibs+3OVV9lHqhO/E+Wqh7SvCTGH7QnbNx86/dZDV1tME5ZlATjPOloAHr5NR1n0I9tQXuiOWHLcEG4AE3W21DfgVcGIPZG4uvWKKmBf2wvxkUqg96UphniZqe2QyfM0NcynAUcKAlakvgth54MpaftwJXZsMD1bDHFPiQGYqnCx5J4duWyK2nFw42g4azLVsaZQdL1D2m+PQh8Kwl4tPmPbQ8Y9FVsfys+8KW1CVUQp1Rht3MoHE+Fku1bc2m+/KAFWb1vMgeLCVwhZstqNO7+127pBCq66p8wRK1xwmpa7kq33HSKb4CpPDpt8MLlojuwukCK4Tu4lwb0w/cA78A/t5NF2TlGmg3QyHP4autkF87fMQK2p7qxxRnWKJuLyeRjSmUKWdLAi2wRJDeHlgX0w88Kfsq3+vZ2iYDZ5lB48kHwAo5aXckcK4lwganRDLd3avNztYBftjNV1vFqR8LYyh78WGbJWpatB6mm0G19MEMsi8kNbyXvMke5Xh4vl+3B7u3Cx6J7YdO4HKcAjfEzJlwrBmK53H4R+AJS+STwoll2NESei2DcDqwqyXq/vu6aTb81hJRWonPHULHoJfF9jMfBP+JM1qFOudh2MkMGi8eiBV0QQO8yRJBJ+1bSvC7CH/uNIloupFxbnV0LxxgifjNyW5wrbFETZ3tcKYZFHB8XI5fhYV0uinGsYKcwi6HKMeUXfAQ8E03X9D14UUpJJYoloUwBNxkidx2TuAYM+gPlaED139sxGACnzJDfHphL+B4SwR5fBPcG+MPvi37+9zqJqxp2mZYbAaNFx8Aq9bFfVsCSy0RZIiIp6ZJ4UvAz92MNSVtsMwMhTkJXgJULFFjp4clG7Opa6TXtCH7suFES9Q0mMI1ZohLdX3HwywRdL7oK8EDEf/8LosSZtYAvMcMhfR5YLMZcvPGrl7rnHICfkxRtxRuLXmPKkpt2YvBEy0RZFX1BazozIVfAne6CYOOZ0sf9m9C43dMlravnL3J+jZLBLmrC34W6w9fgkHgOjdjkBMGYG8zxG82/Bj4uiVqmjYIJ5lBwwwol+BLAiFu90ZWfNrh4/i1Y5BKNo1ytLrg28B6t2TQtvar+AKqzlDxZUvkk8I7+2F/S+hV+0SS+uJ4I4YmOEtdlKovBp9iiSBPd8DtMf8C1SVU/Kiitj1fhg+ZQePBB8CqZYUJgk96V8X+O2zOpvx61q1ZU0cFzjdDYXzCBEGWrXF6X72GtdCZwBmWqKlShLFCq+mDt6ZwtCWCPPEE3F2A3+NqN2XQtc87+uBQSxRP6kvB9VpkAv2XAXgfLh3VyHHozkPgMUvEZwKchy8Gh+7nq2fBSzH/Dl3wCH5UETp2viD1WZzGgTudtqsMhydQskSQ+7sK8LXA2+EF4DNuziCLB+D1ZohfCTak8D1L1DRjJiwwg/7QFDgZmG6Jmv6heoGsuC6WLvCaKVi0U9i92uPwVbzpHMqXhQuoGx7EL+FzS+HD1TVfJVKPjw3mi3tGkVb1AExJ4SxLBNk8VJD7ry6hEuyt1ZlWpTHlzQwNx2m9wkenhZmapiNbm/AVt2pNO1bgY2YojMtMEHSs80aG/nCfaMNjYeig2wvjyKyHPVOn6gr1TAd8oQi/SPUhtl8BB0jgfdU1slW8bbvaCrlNT+EoM6gMc3CGhEbc3Q0/MkN8dshmhXqdJYLcOhd+U4RfpAvuT2CdmzRofHVx6tJCGmM+ANZr6oMe4F2WCPJoCe4ryi8zC55K4Ytu1iBLyrCzGeLXDd8ABixRU4/TPerVBuD9wH6WqOmbs6Fshri0w1JgoiWCRD+F3avtDLcCv3az1pS0ucZlIXXC3wNPWiK3xSZQChdboX4VuNQK8XkMJqVwriVCd/NiLbeQwpVu1iAHl+EwM2gs+QBYr30lDxdZIbjVqqR4C95fTgGm8BsDOydwmhkK87fs13lhnZZaQa/i/hB2QeyNrMisg2mJN/JDbakUbAmRfWFLCte7aYMc1w9vMUOxHABbgc9ZIvc4+fAB2NsSrasM+yVwhCXq9s890GeG+DybrYP+RksEuacEPynSL9QF9wA/dtMGjRWccVVjygfA+iP9sD9wpCWCPLUF7ijaL9UNjydwt5u3thTOXwudlojfJvgKrvkXYkH1PKEW1wc9KcyzRE293fAdM8RlIpwD7GSJ2hK4raeAXwpWp8B9zi1cU3sK55uheNrgRmDQEvmyDcHJZmhpK/FeayPHnU9aIT5roN0XxcNVCrSM4KvGzWnqEiqh5vd6H0Vje26V/siF7hvBVs8r6Hq5Q9lXwKptj6lwkhnitxCGEqetCRo7pK75quwib6UVakvhEivEZSNMBs6yROguzrVF/MVK2cPfm93EQU4pwxvMUCyz4T/wpeB6xkcfWQPtlmg9P4A/AY63RN0Din+dDd+zRHz2gYXAvpYI0ttT0PVyd8k+kPoPN3FtbXCBFTSG+5v0qrMQ7JXCcZYI8jIFm+7u1arT7nzHzRx0obJiLUywRPymwu3AryxR06L1MN0MrasPZgBHWaKmR0pwnxniMghnALtZIsi9XfBIUX+5bfApsqlwNbxJZF/Nq2Dasi/hlc+e+8B7zNB6tmWzIUy0RN3Hm7+xQpwSWG6F4FaXFfV3qy6hcq1bOchRfXCgGTRG51fp905EK4AOSwS1uqUEvyvy75i6JmqoGTvBB8xQjAEr2c1eDa+zHc40Q8tf5Pt1S+1On0ygYol4lLNxsA+ywq0q8i83F34J3OlmDnLmg7CLGYql+jXeQ5bIff53DfkW8xC8DjjVEnX7wWz4ZzNEOXY+AjjEEkEe3wT3FvkXHMqWj3jWTV17qOBXwBorPgDWf9sIuydwiiVCz2nFf6upG74BPOjmDrrIvzCFxBLx68gGrL+zRM19fkl1mlS1mA2wK3CiJWr6eQp/Z4bojm2LgL0sEdSqrwQPtMDveTm+yBFiasWp04v6N3C9FXI70mnRW8uW7Pg3xRL1SeETSbashOLjskDhVi3M7icX1lx4PoGb3NRBx73jH4Q3W0KjzQfA+m+DcC6wgyWC3NUFP2uRC/6r3dxBDirDX5ghfrPgJeAGS9Q0bdD1r1t18LgEH/6HnD+vKMGgJeKxBtpTp7ALVskejBZedYrrr7vFa0vhnHVeTxZxu94BPGOJXCbgOLllrIXOBM62RN1+UoK7zBCffvhfwNstEeTpjmzJscIbzO4jb3aT1x4rVGCpGTTafAAsANbDVJzOM1gCV7XK7/o8fBn4d7d60H7x11YohiG4DnjREjUtW+M0wC2leoPrDEvU9NQWuMUMcZkJxwL7WiLIE0/A3S00xnNZlDC7T3JGqcIpwcvAbZbI7TRniGoNU+BkYA9L1Cd1yZSYt51f/4a3Wl392KDw5sJvgC+51YP2i8W9nj80ynwALAAmZNPV7GKJIPd3wfpW+WXnwzZcEzV4nFP27cdCmANPAzdboqYZM2GBGVpH9QbXdEvUdM08eMUM0V2Auw5TuMJPYfdqXXB/Auvc7EF/Ryuqa2mrWG7ABzS5x8n98C4zFFv1ZdjzLVG3J16EO80Qn344CGfBC7V5CD7TYuPBKx03BOlMshnWpFHjA2DxGEwCPmaJ4JPYqhb8tT+Ha6KG8g3IgtiW/a1vtUTNY+IKK7TMtm5zvBDk+fYWu8Avgn54L9BliSDPdMAXWvAYeKWbPsheKRxnhmIpwSbgnyyR22ITFNtM+ADwFkvU7YrqRweKz4U4y0GoW6tfxbaMbvgpcK+bvrYEzn7Qj/I0inwALJ7Lpul6gyWCPFqC+1rwgv9lXBM11BF9cIgZ4jcXfpk6bU2Inj441AzFNwDvB/azRE03HALPmiEulewmlsK0zBR2r9YF9wA/dvPXlsCFqfcaCieF1VbI7dgy7GaGQv9dLLdC3Z7c2oIvlBVBH8xIs5cfFHSZwXUteny81M0fZOoQnG4GjRYvylqc09Xkk8CqVl2bpLom6kvuBUH7iReBxXE5TlsTss8vtUJLcDvXtrlVL/BjVoY5CbzDEkG2VFr0C/cE0hSudhcIsn8ZjjRDsZSyL4AftUQuk4C/MkMx9cFhOHtII650yZRorQAmmCHIPSX4SSv+4t3QC9zvLhDkvHWwgxk0GnwA3OJmZtNzOV1NmKe2wB2t+svPgadTuM3dIMjCB2FfMxRiwPrTBO6yRE0L+mF/MxRXH/SkMM8SNd1Sgl+bITofN0GYBG7rgSdb+Pe/HfiFe0JQq4usULhtmqZwoyVyO9UExdTmUjiNeHoHuMkM8emFPRI4yRJhKq25jOCrxw5XuBcEmT4RFplBozReUatKIXHtxlxWt/rbiRW4CtdnCdFe8Uu5whiCT2SHTA03nkhdG7boF26ubx50uPDrwNgMwNuAv7RE6OUD17ZygBIMOg1usJ4yzDdDsUyAW3FWqLwOLMMcMxRu/DArhXdbom7XHAAvmiHCC//sXlenJYL09sC6Vg4wG74G/MhdIcjytX5Zr9E5bquFB6zvA/7MEkFepkWnu3u1OfBEAl9xd6gthUUD8EZLxK8HfgB8yxI1LVoP081QPH0wAzjKEjWP+3eWYJMl4lLJvlL0mijMvV3wSKtHGMq+gHzW3SGILw8VzCHwbNLCs2I1wK+Aizl+SCxRl+cnwvVmiE8ZdvZ4Fi6By2xASot/BZ3DPlPhg2bQSPNmRwvz699cJ6xbSvA7S/z3AMavIWubNATnmsGBewvpbIczzVDI/X850G6J4YdVTm8Vnw2wD15k5+HNG2AuPA981hJBDh+AkhmKZQg+7fVgbseth6lmKIbqy5HHWKJuNxwE/2mGKC0hewis2h7fBPeaAYC/BX5uhoCbCnBR6vM6jTB3qBbVC+8EDrVE6DVua09392qzYSN+DRkkgTMegtdZIn5d8O0U/tUSNff5JRthsiWKYwPsCpxoiZoXaveV4IeWiEt79nKD02yFHd/7SvCAJTLb4FPAZkvUVvGl48LpgYeB71oil8kdvnBUpHPiMscPddsMXGeG+JRhR1z2KY9VC7P7yS2vBIN4Xz3U2wZcnkgjzAfArbvhL7RCsLu64Gdm+B+pXzmFmrIVPmqGwlzou9/XNm0QTjJDocYLS/ChfojLTRCX6pT1iywRpuI+/nvmwm9wGtxQx1TX2laxrgedvjV/s8VWiN9G2N3xQ0NuKsGvzRClxcDrzRDk6Q643Qz/oyObPedpSwSNFz5uBY0kHwC3oAGYBRxuiTAJXGWF39edfQHcb4kg5/pFZDF0wT3AjyxR07I1ThdcCGuhM4EzLFFznPDdbvi+JeIyAc4DdrBEkCeegLvN8PvSbErsiiVqakthqRmK5cXsmPBLS+TS0wsHmyFu27IvIB0/1GewDa42Q3zK0AGcb4ngMeLqWfCSJf7HLHgpgRstEWTOALzDDBqxizETtJ4KXAQklghyfxesN8MfS+BKKwTZdRBOMUMh9vk0db8PMWMmLDBD/KbAyWRfSWp4l5ogLtV1GE+3RDCnsHsN3fBTspfDVEMKJ5bhTZYojvmwDdfCzq3N68KobYTJqS9HNuL22fDvZohPAicAe1siyOYh+IwZ/tiEbPr3VyxR25Azt2pkx59qJWWYCRxriTDVN/v1GjbBV3Bq7FDLH4aJZijEhc+dwL9Zouax0/X+4t+GbbjGU4iNs+GbZohLB5wN7GKJIM90wBfMsN1j5WVWCPuzS7Ov7lUgbdkDYNfCzufE6jqaitBg9vLYrpaoy9CQSyrFOtZJ0mzda4W5tbpUiP7ALHgKryuCJPDefuiyhEZozK4WsxKn5gz1aAnuM8Nrq34J8ilLBNnrFTjeDPErwWDqtPAhevrgUDPEawDeD+xniZouSSA1QzzWQmearW2tME5hN4xu6E3he5aoLYHTBlw7sFBmw2/T7KVghdslgWPMEJ/qFLjnWKJua+bAo2aI8rrwaOAASwSpkH3lqu2ozqrnzEJhrS6wgkaCD4BbSC/sAXzIEmESWJW4rtewXoBbgCctEWRl6jG3EF6Ez7vfBx1DXe8vbm6/2jY9Dl81Q1x2gsVkY2LVtqXiFHYh5zu/aAqzYyX7+l7F2v9XWyG3xSaIcl8/Aaeyr1eKS6bEvPGWWyHYPSX4iRm2rxsex2voUMdugD81gxrlw4jW2tjLgU5LBHlqC9xhhuHNz6b8usESQfYbcF3Uwuz3qTe7Qizoh/3NEJ8+6ElhniVqusx1UeOyFib4ckq4BG7r8YWnmrrg68BGSwQ5+wGYYobiKMGGBPosES6FdzpGjm6bOQVuY+4twQ/NEOV14WHAXEuEqbiMYJA2X54M1d7uuUcj8zenVrAOpgGnWiLY6nkuTB9kK1wPvGiJIBeaoBiqXzs8Z4nhxxipa8jGun+vtEJNv9oZvmiGuOyULcfwZksESYFrzRB0zExTuNoSQaZ1ek1axIPF9VbIbZEJ4jEA78MpcOtW8WFPzLwuDNfbA+vMUNtsKAPftkTYeKEX9jKDGuED4BYxKVvrzLetw7yM090FmwfPpNmUuKohhe4BeLcl4leC5xL4rCVqD1bXw3QzxKMPZgBHWaKmq/eFLWaI6hycJK6jlMe9XfCIGcIkcCfwc0sEWb7WWakKZWf4MvCUJXKdkz5cXVNWcWyvFVao+/z4LR+KxakXuhPvX+XZ1y+zQq5evhgSpqPN9efVIB8At4CNMDl1vaU8J6FbSvA7S4QbgquArZYIauVXwAUxmH3t40wBw+tshzPNENU5cDnQbolhPbMZPmeGuJSzFxsOtEQwp7DLoQSDKVxjiSB7TIEPmaE4qi9E3WyJXKanvnAXy/hhDnCoJepTgUusEKc2713l8fgmuNcM4brgn4EBSwQ5owy7mUENHM9VdFvhNDxQhBrC6e5ymwu/TODvLFFbAu/udw2Vouz3vwG+YIma+/ySjTDZEs1vA+wKnGiJ4aXw6bfDC5aI7qLHr3/Dj9t9JXjAEvlMhJuApy0RZOUaXzYqmhuBbWbIZbEJohj3XWyF+i8vuuE7ZohPGfYDFlgi2KqF2f1k5XOVCYJMBs4yg+rlA+Din7Q7EjjXEsHu6oKfmaGuC6Mrs/+jWirZF3YqgKFs2hpvdg1v2iCcZIYoBoVL8GF9LS9V1wBXXOPh+SnMs0TwOOVyK+Q3Kzs+3GiJIDNnwrFmKI4S/Dz166dcEjh8APa2RFOPH/ZL4AhL1O3/mCBaK/GZQainO+B2M+T3ePYh0SZLBDnnYdjJDKqHB/OCS7Mved5kieCLMN8+qv+i/4fANywRtJ8d3QsHWCJ+c+AJYI0lalrmlz7NbS10JnCGJWoev29ymYgoOYVduCeegLvNUJ8JcB0uDxF6nXpRCokliqMNrrdCvmRDcLIZmpoPweq3sQu+bob49MJewPGWCB7PrJ4FL1kiv4XOwpnHtM3OHKL6x+gq8EmoLYGllgh2fxesN0P9KtnXkKotaYNlZijMifSSbPfXMGbMdAqppjYluwE53RLDco3PCPXCwcBhlgjmFHYNmAVPAbdZIizXALzHDMXRBd8meylYoReF8BFfkmxOP4A/wYdgjbgkcYa4KLVlM9ZNtESQzUPwGTM05Gbgt2aoLYWlD/u3qfqO6yqqMhwDvM0SwQfSVVZoTA98N4V/tUSQE5zyqxhmw4/x7eaQY+wKKzTttmkDPmaJmm4vwc/NEJd2+Dh+ZRjqmQ7Xth+pawqXhwhQ8ev8InIa9Hz23McXIZrSNjgfb7TX62ePw1fNEJ8NsCtwiiWC3ToXfmOG+pXg5RRusETYmOFl+JAZlJcPgIvNm+3hHi3BfWYYkYOKD9LDdFSyi0oVwydMUFNPHxxqhuYzAO8H9rPEsCouExGfPnhrCkdbIphT2I2Abngcb3wHSeAdjg2KZYdsHcTnLJHr78ApHZvMQ/A64FRL1L1PX+JsInFqh3OByZYIuz4kW/pDDRrMOr5oiaDj6wWpz/OUkztMQZXh8ARKlgg+gK5KnMJ1RMzO1o17xBJBFg/A680QvxJsAO63RM1jrcsSNCe3S21f7fLcFuOFzgVe7wTbUnEKuxFTgUtx6stQvrRcIAdkN3CdSSCfI8vwBjM00QkRzgKmWKIuv+iEvzVDfB7I9vmPWiLYPSX4iRkaNw+eAW61RJC3ln3BWTl5Q6S4nE4r3FNb4A4zjIwk+0rqU5YIsmPFaVcLI81u9mp4C/phfzM0jz7oSWGeJWoOmC+3QlzWw56pU2TlGb/d1gNPWmJk9MAP0mw9VNXe995Xhj+zRKG26afx5eo8JgAnmaE5rIXOBM62RN0uOwC2miE+O8AZZF+/K0DF2Q9HVDtcjUuohI6zPp66xJFy8AFwAfVBD/AuSwRbPQ9eMcPImZpN/fVrSwRZUoadzRC/bvgGMGCJ4ccdqS89NNvFw0or1PTN2VA2Q3Q3EZbi2n2hUuBaM4z48fUKK4Sm8ivgIumCnwH/YolcTvNmbnOYAicDe1iiLr/Z6ld8UXoMJqXZ9M8K09sD68wwcg6BfwPWWCLIwWU4zAwK5QPgYl5BX2SFYC/jdHcjbl/YgmthhNo5gdPMUJjjrzd7a1u0HqabYfz1wQzgKEsMz6/747MOprmmYi73OsX5yCvBN/HFsFDH9cNbzFCoMfH1VshlRr8v8Y+7NdAOnG+Juv/ur/Ljijg9C4uAN1oieF+/zAqj0vVyXEIltJUzvyqYD4ALpjq15pGWCD5g3lKC31li5G2DG4DnLFFbCuevhU5LxG8TfAV4zBLD6myHM83QFOfA5WQ3urR9vd3wHTPEZSKcA+xkiWBOYTd6YzzbhmlPfehSKLPha8DjlsjFF5fG2Uz4AL6MUq9nXoEbzRCfNdCeZDPnKMzjm+BeM4y8LniI7AVK1Ta/16W8FMgHwMVzods12BBOdzdq5sLzwOcsEWSPqa77VAgLYSiBKy0xvASWbITJlhg/G2BX4ERLDC+FS6wQl+qx5SxLBB+P+0rwgCVGxxPZVHabLBHklDK8wQyFObZUEh8G5XVsGXYzw7iO+5Zboe6/+eveDi9YIj77wEJgX0sEW7Uwu5+s0TmWOKteoDa4wAoK3FdUFL2wVwrHWSLYXdX1iTRKJsA1wFZLBF1srlgLEywRv+oa2L+yxLCmDfrSw3gPAJfgQ/haHinBfWaIyyCcgTfQg1WyqdY0ShbCUJqNh1XbJLKv91UQHfB54CVL5Pob+CszjI++bD3FLkvU5aXUad+jlfjiQx5Pd2T3ezRKuuDbwAZLBDmqDw40g2rxAXCxTtorsussBfa6ygqj62D4VQpfskSQGTtlU04pctU1sD9liZqWrXH64XGxFjqT7CGZhh8nfDKBiiXiUc7GwT5ACvfEE3C3GUb9WHIL8FtLBDnzQdjFDMVwEPwncKclcjnVBOOjLbufpvrOc9e7tFq0Y+cjgEMsESaF1bN8sWkseL8+8PDrV8AKHOOoCDbC7gmcYolg93fBejOMicvxBnrohdOFKSSWiF9HNuXd05YY1oyZsMAMY28KnAxMt8SwfpHC35khuvPoImAvSwRzCrsxUIKXE7+MCjW14hTuhdIGq62Qy4FlmGOGsTUAs1J4tyXqsjlxabWYrTRB+L4+BJ8xw+h7HL4KPGaJ2lI4/kF4syVUYzyuIhiEc4EdLBF8gFxlhbHRDT9NnEIz1EFl+AszxK/6VugNlqh5LPZN+7Fv3gZ8zBLDS+DyEgxaIh5roD2FZZYI9kwHfMEMY2MLfBp40RJB56lz1nldWxizYSOuM56XXwGPsQpchC9i13vMvnk2/Icl4tMPc4G3WyLYrXPhN2YYfdUXVK+2RJAJFVhqBg3HB8AFsB6mAmdaItijruk35hcFn7RCmAT+2grFMJS9Ce3N3uH19MGhZhg7A/B+YD9LDOupLdmUrYrITDgW+FNLBHMKuzE0D54BbrVEkN0nObNV0a4F/QI+n+Oq93g0BvpgBnCMJeoyOMGPK2I+NnvvKVwFuM4MY2fnbNz8pCWC/pYX98IeltD2+AC4ACZk02TtYokwCaxyTb+xVYINwPctEWRu2bcwC2FONgX0zZaoeUz2bcWxZe/arpkHr5ghugtf1z8Kt6XiFHZjrgJX4swCoX/PK6preqsYY71/AH5liWCTO+CDZhiz/XMZMMESdR2r7zgE/s0S8emHg3D2uTzuKcFPzDB29oUtqctIhOpMYIkZtD0+AI7cYzAJp3LM46ktcIcZxuXi4AorBHMdloLYlr0RvdUSw1rQD/ubYfT1QU8K8ywxrOfbfTAWnX54L9BliTAJ3NbjG/Vjrgd+Afy9JYLslcJxZiiGEgwm8DlL5Lp2XmyF0bcRdgcWWaIuFeByM0TrQpz2PM/O7pfu42BStqzaC5YIur47+0E/DtR2+AA4cs9l02O9wRLBVvtVz7hd+P8j8LAlghzRB4eYIX5z4ZcpfMkSw49FUl9kGquLAl8uqe2GQ+BZM8Slkt3EUpiUbIkCjc9x+PLqNlDtVhem3q8ojCH4LL4UmUdPLxxshtG1LbsGcc3x+nylG35qhvj0wYwUPmCJYL09sM4MY+8g+M8EPm+JIFOH4HQz6LV4QRWxNdAOnG+JYC/jVz3jJoE08a25PL2WW6EwLsdp52tZtB6mm2F0L/SBoywxrM24tlN0yjAngXdYIti9XfCIGcZHFzwEfNMSQfYvw5FmKIbqrAP/YIlwba6FPao2wuQUzrBEQ9e4itMKnPY8WAKXWWH8DMLV+AJZqPPW+VKTXntMqVjNzKbFeoslgk/at5Tgd5YYP9UvIX9uiSALH4R9zRC/bvhpAndZYlid7XCmGUb1HLic7MUxbd8tJfi1GaLzcRPk4st44388dlmU8FYXWaFQ14LXWyGXE8uwoxlGx2D2pdSulqjLfSUYMEN8emGPBE6yRLDHN8G9Zhg/c+GXwJ2WCDJ9ossa6DX4ADjei6ckzd7aUpghnO5u3JVgEL+uCtVegaVmKMwB6BM45eOwEliyESZbYuRtyG5unWiJmuOEq80QlwF4G/CXlgg+zvaV4AFLjK8u+Daw3hJBesow3wzF0A3fB/otEWyXBI4xw8grQwdwjiXqk/pFZLTasntMnZYItmphdp2o8b2GcVa9cMvX+oW//vjYrxgNwPuAP7NEsLu64GdmGH+b4SZcXzH0wmrRALzREvHrgR8A37LEsKYN+jbyaA32luDD9VrH2ztLsMkScalkXwd6PRPey+kam4cvnIRz/fpinW9dkimfxSYYeQmcALzJEnVZW32ZQ5Epw87AqZYI9nQH3G6G8Vddvubrlgiyz1T4oBn0at4wiffCya9/8w3wr7JCc3g7vIAX/qEmDcG5ZijMccg3pWtbtsZpikfUWuhMXN+s5rDKKVnjswH2wYvbPJ54Au42Q3N4HL4KPGaJIIcPQMkMxTAIfws8bYnAAQq8sx/2t8SINk1SWGaJ+rTBJVaI1hKyh8AKO1asngUvWaI5eL2ea9+9KPWZn37/3K3Y9MI7gUMtEez+LqdZayodcA3wiiWCBjlnPASvs0T8uuDbKfyrJYY1YyYsMMPImQInA9MtMewF0n0l+KEl4tKerWvt9FbhnMKuiSx02vlcKr78XBjz4JUEbrZELotMMHKqs+kdYIm69M6G/2uG+FTXE/+YJYJtHvLDlabSBfcnsM4SQd424DJJehUfAMe50S60QrgUVlmhucyCp1L4oiWCTNkKHzVDMfjWYtAx25u8I9eyzQv9IE6LG5n12UsNiywR7JkO+IIZmsvOcCvwa0sEOaa65reKMR6+AV9IyTOe+3B1zVp5rTHef7ufsEK0FgOvN0OwW+fCb8zQdMfvK60Q3OrjVtB/8QFwZAZgFnC4JYI9WoL7zNCULvfCP9i5G12/sxC64B7gR5YYVk+fs1yM1Jjh/cB+lti+BL7rOmbxmQDnATtYIphT2DWhfWFLAqstEaQthaVmKIbZ8O8JfM0SwaancJQZGleGOXidUa8fz/bvNtb9vgM43xLBKsB1Zmg+1ftpP7ZEkDkD8A4zCHwAHONZ6CIgsUSYBFYl2clbTaYbHk9ciy7UroNwihkKcUxKfWsxqJM3eUeGHWu71ARxWQ9TgdMtEWxLxSnsmlYK1wPPWSKo1YlleJMlCrXvK9xiE4zIfnexFepu93+8txbttfUJwN6WCHZPCX5ihqbcl9PUJVSCDTmDrKp8AByRMswEjrVEsKe2wB1maOqTkdNuhlv+MEw0QyEGrXcC/2aJYS3oh/3NUL8+6ElhniWGtXE2fNMMcemAs4FdLBF8zrmtB560RHMqZQ9/XQ818M8/zb7+VwF0wb/gDfY8x/LDB3yA05Ay7JfAEZaoy6YX4StmiE8KSQrLLBGu4jKCTW2X7D7/f1giaOzw3n7osoR8AByXlUC7GYKtngevmKF59UAf8B1LBNnrFTjeDPErwWAKV1li+PFJ6tq1jQ72V1qhpksSSM0Qj7XQmcISSwRLgWvN0NwmZF8ybLVE0LnttAHXMCzKtkzJ1gJW4Nh4CE42Q0NW4j3QegcTn5wP2ywRnwE4GjjAEsF6e2CdGZrXvrAl9fomz/H7AivIwU8sZyDYA/iQJYK9jNPdxXIyusIK4RetqcftQngRPo9fZNWyaD1MN0N+fTAD14qrZdPj8FUzxGWnbArMPSwR7N4ueMQMze1g+BXZ7CCqbcdKNguACmAz3AY8b4kwCXxkjR8E1OUH8Cf4MnW9frmjM+tFK4XlVsh1nL3MCs1vCG4EnrVEkGM3wJ+aobX5ICGeDbUc6LRE8En7lhL8zhLNrxu+ATxoiSD7DcACM8RvPmxOYbUlhtXZDmeaoa5z4HK8QVjLZQthyAzxWAsTXB88N6ewi+iYhGsrhjr7AZhihvi9HV5I4YuWCLbnPvAeM+S3Dc7H5ZTqdcUBzlIRpT44DJhriWCPb4J7zdD85sLzCdxkiSDt7U4D3/J8AByBdTANONUSwYZwOoioJNnUdwpzoQkKs9+vJlv7T9tvtGQjTLZEuA2wK3CiJYb1q5294RydnbIvd95sieDjZ18JHrBEHErZWqhft0SQaZ1eGxdGG1yPyzHkObYvtkI+D8Hr8JhRr6dwnfqYuSRQPqt8QTgeg9l95M2WCLKoF/YyQ0uPt9XsJmVrnfmWc7i7uuBnZojH8/Bl4N8tUVsK3QPwbkvErwTPJfBZSwxr2iCcZIZcA7sl+NC8lqv3hS1miOrclySuX5RLBS63QlwSl0XJY/laZ8cqhC54JIVvWyLYkWV4gxnCbYGz8H5a3WPmUra8miLTC92J943yeLoDbjdDPObCb4AvWSJIRxucY4bW5QPgJrcRJqeuc5RLAldZIS7zYRvwKUuEGfIr4MKovrX4iiWGtcz1zsKshc4EzrDEsJ7ZDJ8zQ1zK2ZrWB1oi2BNPwN1miEsX3J/AOksE2WMKfMgMxVD9ClhhJuDLkXnHxt5Pq89zZOtsKs7jqveMckhh9Sx4yRLRbbcrcQmVUGeUYTcztOw5Qc1sK5yGf6B53N8F680Qpc/hus1BEnh3v2u5FEL1rcUvWGJYM2a69nWQKXAyMN0Sw14kfvrt8IIlortg8evffJzCLt5j1JVWCLbSF8SKobrm4hOWCHZaCokZgsfGe1iiLteWXK4oSmXYD6+f89g8BJ8xQ3y64ae4bnOoyWQzYqgF+QC4uU/aHQmca4lwKayyQpyqUwvdYIkwFVhuhWIYyqZ83GaJYY/tK6xQs1Eb8DFLDOul6trbims8PD+FeZYI9kyHLxZFqwvuAX5siSAzZ8KxZohf9YWVmywRbEYZ3mmG4VVfEDnfEvWNmdscM8dsJd7vz+PW6ov5ilAKl1oh2DkPw05maD2eEJr7IHYi8CZLBHu0BPeZIV5DcB1OuxIkgaN74QBLxG9O9sXDGksMq6cPDjXD9g3A+8ne9tb2j5s3lZxpIkZOYZePU9jFfZxK02x5CIVdL1/kl5CF8XlgsxmCjxWnWmF4M+EDwFssUZcbZ8NvzRCfXtgLON4SwSpk9yEVqW7oBe63RJBpm2GxGVqPD4Cb92K2LYGllsh1EbQqce7/qM2Bp1O4zRJhu3wbLDNDYVyWHfo1zDHec+Lw7DO8wRSuMUNceuFg4DBLBNtScQq7Ipzvbgd+YYkgswbgPWaIX/UFrS9bItixruU3vNQZs+oeS7T5IlK02rL9fqIlgt1Tgp+YIfqx8xVWCD43Ln3YY0QrnhvUjMpwDPA2SwR7agvcYYb4VeAqnA431AkDsLcZ4leCHwJfs8SwFvTD/mb4Y33Q4xS5Nd1egp+bIboLlYvx675gCdzWA09aIvoxwWDq1Jt5rDRBMaR+hZXHJOCvzLDdsfFhQJcl6nLLbPgPM8RnA+wKnGKJcBWXESyE2dm9tB9ZIsieL8OHzNBafADcvFzvMJ/V8+AVM8RvDjyRwFcsEaSj4rpGhZHAJVYYfsySusbt9vYdb37XuLb3S4b49MFbyV6IVJgUuNYMxTAENwLPWiJox3+ny0QUQzc8CKy3RDCngd7eRYP30+o+/SSOmaPVDucCky0RrLcH1pkhfkl2HeTD/PBeF6Q+E2y1cZGaTRkOT6BkiWAv43R3RTsZOR1uuMUD8HozxK8ru+Hl2iXDW7Qeppvhf/TBDOAoSwzrq7Phx2aI7iLlAq9Vcrm3Cx4xQzHMheeBz1oimA97inMd6Nfv4Q4swxwz/L4BmJXCuy1Rly91wc/MEJ8HYArwUUvkOt9cZoVC+Vuc8SvUW8twtBlahzdVmtOFJsh10r6lumaQCmI2bAS+ZYkgO1b8KrIwUrjUCsPqbIczzfB758DlQLslhh3sXm6FuKyHPVOnpsrLt94LZht8CthsiaBz4fvK8GeWKMBAD/4ep7LPY7EJfl8FLsLlI+pKV3EdzWjtAGcAr7NEsMc3wb1mKI4SDOJsSHnGzh9PPVe2DB8AN5k+6AHeZYlgQx7giyn14iOPJWXY2Qzx64ZvAAOWGHagumSjU1sB/73O04mWGNY3Z0PZDHFph6XAREsEHxf7SvCAJYplLvwGuMMSoX8GfgVcBAfAVuBzlgh23HqYaoZMdWYcl4+oz1d74GEzxOcxmJRm0z8r3KqF2f1kFUhHNnvO05YIcnAZDjNDa/ABcPNtkIutkMtdTlFTTN3ZF8D9lgiycwKnmaEYEl9+qGXaIJxkBmiDJfgwfFh+VR+fdTAt8YumXCp+5V7kY9iqbBMrwHH98BYzFGJ8cyPZlzyqbacO+KAZ/vs6ahkwwRJ1/d05lojUs7AIeKMlgj3dAbeboXhmwUtJNoZQ2DnTGWhb5xyvZtEP+6fwPkvkOlhdZYVCb98rrRAmhaVrodMS8dsEXwEes8Swlq1p8WmP10Jnkk31pe3r7YbvmCEuE+EcYCdLBHviCbjbDMXUDT8F7rFEkPYUzjdD/GbDf+BxLc91oC9NARthd7IHYcopgW84Y06c1kB7ks2co/Bj5upZ8JIlimkCXAe8Yokg83thnhmKzwfAzeVCt0ku93fBejMUV/VBmF94h5k+1a8iC2EhDPnyQ00zZsKCVg4wBU4GprsrDHtxf4kV4lKd3v0sS+TiFHbFP5ZdZoVgp5ThDWaIXwWut0Kwnl44uNUjbIOPATu4O9R1nvmkFeK0DywE9rVEsM1D8BkzFNcseAr4giXCtMEFVmiJ7axm0At7pXCcJXINUldZodiqNzQ/ZYngv4kVa53yqhCmZlMS/coSw+/vLfy7t5Hd5NL2PVKC+8wQl8Hsq/bdLBHsmQ5vcBReN/Sm8D1LBJlENouAItcD3wUeskSYNjillX//jTA5dWacuiTw3RI8YIlot99yK+Ry61z4jRmKLc0+qPAF2TBH9cGBZij8OFFNctJeAXRYItij3thtDS/ALcCTlggyYyf4gBnity9sAa6xxLB6+uDQVvzFB+D9wH7uAsNe9F2auG5mVMrZONgHN/k4hV3rXCteYYVgZz4Iu5ihEPu9XwGHO7EMO7bqLz8IpwO7uhvUNWb26994x85HAIdYIliFbHpgFVw3PA581RJhwy1fJCk+HwA3gY2we9Lib2zWcTG4yhu7rWE+bAZusETw38aFKSSWiF9HNjXR05YYdn9v1fWOXOdpeL9I4MtmiM6Hgb3MEGxLxSnsWkYXfB34gSWCTB2CM80QvxTuAJ6xRJBdEjimFX9xXyBryINd8C9miNZKE+RyTwl+YobW0ObLk3kc/yC82QyF/nvQeBuEc3Gtkjye2pJdDKpFbM3e/n7REkEOKsNfmCF+1a+6fPlheAv6Yf9W+oX7oCeFeW767Uvg8hIMWiIea6Ad3zzOu5/f1uMMKa20vdPUZVHyOHed19fRK8HLwG2WCLa4RY+PJwBvcvPX5W8SSM0Qn36YC7zdEuEqLiPYUmZDGfi2JYJ0VPzIoNB8ADzO1sNUfEM5r9Xz4BUztI558EwKn7dE8EXwX1uhGIbgWnz5YdhxTNpia+Emvuldy1NbsqUDFJGZcCzwp5YIlpKdH9Rax/87gX+3RJDdJznDVlHcgDN/hZ4Y3tlqL0amkKTetK7XI11wrxmi3fe955NPbw+sM0PLjZ39Cjj8mLK4F/awRDH5AHicTYCzcI2iPF7G6e5a0hBcBWy1RJC5Zd8GLYQ52RTQN1tiWIvWw/RW+EX7YAZwlJt8WNf4kliUF5wXWCGXe7vgETO0lhIMpj74z3NcWVGdGlZx7/ebgH+yRPi4uJV+2QF4H3Cgmz2/BC5xWbU49cNBOOtb3v39Miu0ni745+xUoQCdCSwxQzH5AHgcrYVOWuzLpRE4ad9Sgt9ZovXMhV8m8HeWCHahCYphWzZVkS8/DDNQbW+RmTSSbIrcdjf5dj3f7kti0emH92bX58rBKexa1ES4iezlMNW2VwrHmSF+Kay2QnCrD7fSiw8prHCr1+Xx5723ErMLs0tDhe7vm/zavZVdZYIwCZz9oB8pFpIPgMfRlGxaqjdYItgQvvXe6he0V+IaNaH+sg8OMUP85sIvU/iSJYYdqC7ZCJOL/DtugF2BE93aw7rhEHjWDHGp+MJS3uNdXwkesERrmgUv4Ysuef5eLky95xG9UvYF8KOWCDI9bZHZYsowBzjUTV7XsfGy+bDNEvHpgxkpfMASuaxamN1PVgt6PHvZZZMlgkwdgtPNUDxeDI2TNdkXPOdZIpe7uuBnZmjpi/8fAt+wRPCF3XIrFMblOEXXcKYNwkkFH7AtoeAPuRu0GbjODHEpw5wE3mGJcJXsfKAW1gGfxqnuQ+1fhiPNEP01TZrCjZYItrgVfskULnZT1+WXU+F2M0RrBTDBDMGe7nB/b2kL/Zgsr/PWwQ5mKBYfAI+Tmdl0VG+xRK4LP6dtEBW4wgrhY50HYV8zxK8bfprAXZYY1rI1BZ0eeW22HssZbuJh3VKCX5shOh83QS5PPAF3m6G1zYKngNssEXwNeZEV4jcBbiX7Al619/nDB2DvIv+OZdgvgSPc2nVZtS9sMUN8emGPpOAvPY+0FFbP8twhuBn4rRmCTJ8Ii8xQLD4AHp8TUOJaJbnd3wXrzaAe+G4K/2qJIO0VWGqGYhiCT+AU6MOZMRMWFPEXmwInA9PdxMP9eXC1GeLSD/sDf2mJXJzCTv91PbkKp+8Mvnwow3wzxO0QeDaBOywRpG0oGzsW2Qq8n1mPp3fIHoQoQgmcD3RaItjmIZfNEFCCl1O4wRLBlq91poFiDQxNMPYG4H3An1kiXPUmh/RfBy73h/C/nUUD8EZLxK8HfpDA/7XEsPv7igL+Tm3Ax9y6w/pyyXV9Yty3L/ZaJJdnOuALZhBANzwOfNUSwVaaIH5D2fTnvgwZIIGPFHVmnB/AnwB/5Vaua7+4+gB40RLxKcPOCZxmiVxunQu/MYMABrPlojz+hdlnCiw0Q3F402Uc+PVvbo+W4D4z6L/MzqY/fMQSQSYNwblmKIxLTTCsnj44tEi/0AC8H9jPTTvcsMo1UWOzAfYBPmiJXJzCTr+nko0JfBgW5vABKJkh8kEePJzA9ywRZM994D1F/MW2ZV9BTnQT5/Z8m1/AxWwJsLMZ8gyTuM4M+i/z4Bmy5SQU5uLU54aF4YYcY73wTgp2c3q0JbAqyU7e0n/tE5UEPmWJ4F5nPASvs0T8uuDbToFec38v2rTnTuM+jBTuK8EPLRGXdliO00rlsaXiFHb6Az3wgxS+bYkwFV/CLsp2XG2F4DHx4qL9TtVr2lPdunXtD58+BJ61RHzKsCPOCJXXPSX4iRn0B9egV+MSKqHeNuByTYXhA+CxD36hFXJ5aotr/eg1TIXbgV9bIsiUrfBRMxTm4v0KKwxrQXVt0ej1QU8K89ykw/Lr38isz9azXmSJXMf923rgSUvIMUFDjhmAt5khbi9mM0H90hJBjizDG4r0C22Bs4ApbtrcXk7gWjNEazHwejOEq7hsnF7DIfBvwBpLhEnh41YoBh8Aj6EBmAUcbolcVs+DV8ygP7QvbMEpXfI492HYyQzx64J7gB9ZYvtjm7Qgb0gnrllYq893u+H7lojLBDgP2MESea69vWmr11aCb2aXmQocHzirRuTmZ1/ufNYSoadcTirKL7MWOhM4281a10DiptnwW0vEpwwdZNOeK1xvD6wzg7ZzD+FyXEIl1JwBeIcZCnARZIKxU4GLsmONAr2M091pGNuyNWyes0SQXV+BU8xQiAFrmsKVlhjWoupXhtHqgxnAUW7KYbkmdmTWw1TgdEvkcm8XPGIGbU/qVy55Wp1YhjdZIm5t2QPgzZYIclpakHtQU+BkYA83aW6DLp8V9bX/CcDelsjV7DIraHu64CGyFygVYMiZbIsydtZYKMNM4FhL5Dpp31KC31lC2zMXngc+Z4lgyx6GiWYoxPHxTrLpa/TaOtvhzMi38XKg3U25XRtne+EWnY7sy51dLJGLD/c0rCeyqew2WSLsMJRmsxAoYrPhtyl8xRJBZpThnbH/EmuyMbFfQdYhhVtL8HNLRLntkhSWWSKXxzfBvWbQcFxCJVer9/ZDlyXi5gPgsbMSb+TmMYTT3SnABLgG2GqJIHu9AsebIX4lGEzhKksMO1BdshEmx/izb4BdgRPdisO6JHHqpqishc4Ullgi13GsrwQPWELDWQhDaTYeVtjf1WkDrqVYhO242grBrU6N/XeYmX1M8Ra3Zm5DE3yRLFoDcDRwgCVyWbUwu58sbVcXfBvYYIkwKVxghbj5AHgM9GbT1HzIErnc1QU/M4NqORh+lcKXLBFsZeqxvxBehM8DT1piu6YNRrruWVv2kGyym3C7Nj0OXzVDXHaCxTh1Yy6VbI0qqaYEbsH1HUPtOAQfNUPcSrAhgT5LBDm2DLvF/At487nubnceAo9ZItrtt9wKuTzdAbebQYH8oCLHOOJB2NcM8fIhwNhEXg50WiJc4oFY+VwOVMwQZL8BWGCG+M2HzalfP9SybE1ks2+shc4EznDTDesy3+yOy1qYkMBSS+TyxBNwtxkUogQvJ3C9JYKvNZc8AFMsEbfUfT7UJOCvYv3h++AwnH6yzj8RXySL1QC8G5hriVw7/OpZ8JIlFKL6QrkvyIRpH/KFlKj5AHiUrYNpFGDKnTF2fxesN4NCdcNPE7jPEsEuNEExVKe/e84S2zVjZmQvPEyBk4Hpbrrt+tXO8EUzxGWnbPmBN1siF6ewUy5b4NPAi5YIMq3Ta/To7QxfBp6yRJBo9/c2WOHmq8vd3fAjM8RpyHs2eW0egs+YQaGq11lXWyLYol7YywzRjqU0miZl0zj6dnEOqWuUqL795pNWCG7VXX2jVJErwXMJfNYSw+7vKyL6WduAj7nVhnX1vrDFDFH9DSaJUzfm9UwHfMEMymMePAPcaolgy9c6S1fUquOBmy0R5MAyzInthx6AWanXrXWpwKVWiFMvdCfu93ndOhd+YwblsXM2bnZZtTAdbXCOGeLkA+BRtBEmp3C2JXJ5tOSXnKpDCTYA37dEGN8oLY7B7K3FVyyxXT19cGgMP+gAvB/Yz022Xc9shs+ZIS5lOAo40BK5OIWd6lKBK7OhgQLsMQU+ZIbo3QhsM0OQxREe0y4CEjddbv/c4xrZ0WrzXk0dhwquM4Py2he2uKxaLmeUYTczRHle0WjZCqfhH0YuCaxKXMtVdUrhCisE/629ewD+H0vEr/qmq1+KDb+/x7L2qGukDn+M//Tb4QVLRHex4de/+WypOIWd6tQDvwD+3hLBVq6BdjPEqwQ/T+FeSwQ5bj1MjeWH3QD7AMe42eoaezk7WqTK2cvACyyRyz0l+IkZVI9JcAPeYwg1GTjLDFGOCzRKJ+2OBM61RC5PbYE7zKAGbgD8I/CwJcIMwTIrFGZbXoFfPwxnQT/s38w/YB/0pDDPTbVdLyW+nRvjeHi++3U+CdzW41RkamwfuhxILRFk5kw41gxxa4PrrRBkpw74YCw/bDssBya42fJJ4V9nw/csEa2VeK8+l4rLCKoBB8F/JvB5SwQ752HYyQzRjZU1SoOuE4E3WSKX1fOcxlQNSCBN4CpLBPc6uhcOsET85sATwBpLbH+8kzb52rpJdrGv7fe5qQS/s0R0nMIu9yUE15pBjeiCh4BvWiL4j+6i1ClmY9/nvw380BJB+3sU00BvhN2BRW6xOi564G+sEKde2As43hL5svXAOjOoEdVl1bZaIsi0zREuKeHYQKMxqG5LnMYxr5dxujuNzN/fHcDPLREkafMr4CK5DL/4Gc6i9TC9GX+wPphBtk6qtnNNlsI1ZohLLxwMHGaJXO7tgkfMoBFwuQmCzRqA95ghejeaIEhP9fzc1LZlL27u4ObK7Qez4Z/NEKe27Kv3iZYIl2T3QKSGzIVfAl+2RJgUlj7ssSq284tGWjlbp+Rtlsh10r7FL3s0EkowCFxniWAnDMDeZijEvv9D4GuW2K7OdjizSc+By3ENwuHcXvLFnhgvMi7Gr+rycgo7jdSYYC2w3hLBnIUjcjvA7cBzlgg6P5/SzD/fRpicwhluqfxS+ETiC8FR2gC70uR/m03o8U2uAa8RUn2ZoGKJIHu+DB8yQ1RjP42CFSbIZQinu9MI2gw3Ac9aIkhHBc43Q2EGrZdYYdg+SzbC5Ca82D/RrbNdlbZsSiZFpA/eSvZCpMKPT30leMASGimpy6LkafXOPjjUEvE6AF4EvmCJICeWYcdm/eEG4XSy8bHy+UkJ7jJDnNrhXJrsOjUCqxZm95OlhlVnYfq6JYKvXS9Ifa4YDTfUCCvD4QmULJHLXV3wMzNopLwdXsApxfNYPACvN0MhBq3rgfstsV3TBuGkJhuILfFif1hfnQ0ZZUcyAABPCElEQVQ/NkN0FxgXeJ2RT8UpezXCSvBV4DFLBPMl7sgl8Gn8eifELkmTvqRVhg7gHDdRfil8MnH/j9IDMAX4qCVyebojm/lBGslxxBVWCPbWMhxthjh4Y2bkXWiC3AdY307XiOvI1ot8xRJBdqxk6yypGBf/l1phWMvWNMl0y2uhM3GKu1oDVR+KRWY97Jk6JVReTzwBd5tBI3yNVfEr4Fy93leGP7NEvKovlf+LJYIsbtK/wxOAN7l58o8jXoQ7zRCnHbLrwddZIlwKq2fBS5bQCI8j7k9gnSWCz9kfT13yKQo+AB5BfdADvMsSudzf5fpUGgWz4KkUvmiJYEvKsLMZ4tcN3wAGLLFdM2bCgmb4QabAycB0N8l2fXM2lM0Ql3ZYCky0RC5OYadRsQvcBvzaEkES/Aq4CBvxeivUlsI7y7Bfk/1MSZqNIZTfFfNhmxni8xhMSrPpnxVu85Az/mn0zkVXWiHYwWU4zAzNzwfAIxvzYivkPrCusoJG0eV4QzXUzgmcZoZicOqamueeFU3wM7Thl/e1Gvk1e2TWwbSkSb8qamLPdLhupUbJvrAlgdWWCHZcP7zFDPGaDV8DHrdE0PXCyc308wzA+4AD3TK5PbnVcUS0noVFwBstkcutc+E3ZtBo6IJ7cAmqPGMJZ8KNgA+AR0g/7J9mA1aFe7QE95lBo6UbHk+cUjFYCkvXQqcl4rcJvoLr/g2npw8OHc8fYADeT5N9edFkervhO2aIy8Rs3b6dLJGLU9hptMd31wPPWSJIewrnmyFeCVQSuNESQceGD1fX3G2Wn8cv8Otz5TyXvorSGmhP/Oo9rwpwnRk0iuOINIWrLRFsfi/MM0Nz8wHwyLnQnrkPqquS7OQtjZoh14/MY/pUOMkM8VsIQ4lT19Q6B433xbYX+8NI4RIrxGUjTAbOskQuWypOYadRVsoe/t5siWCnlOENZohXB3weX6wJuvZL4ahm+EHKMIdxfjkzUk/vADeZIU77wEJgX0vkck8JfmIGjaZd4A7gPywRpg0usELTbyM1qhf2SuE4S+Ty1JbsgCqNqh7ow6/IgqWwYi1MsET8psLtwK8ssV0L+mH/8fgX90FP6luSw3nEGULiMwhnALtZIlwCt/XAk5bQaJuQfcmw1RJBJpHNZqBIHQT/CdxpiSBNsWxD6nJq9br2AHjRDNGOA5dbIZ+KywhqDOwLW1K41hLBjupzCYem5gPgkTlpr6CJps6JxGqnqdEYXlC6Hmq4GTvBB8xQjEErcI0ltj8GSsdpDd4EVpp/2GP2pc4QEpfqFJI+MMm9q3tjQWPj4OyFMB+IhTvzQdjFDBEP8lz7OnRMevgA7D3OY4j9EjjCrZHb8xPdz2MeOx8BHGKJXHp7YJ0ZNBaGsuUknrVE2HDCF1qaflysRmyE3RM4xRK5vIzT3WkMdcM3gActEXwj4MIUEkvEryM71j5tie1a1At7jOW/sA9m0CTT7TWpXyTwZTNE58PAXmbI5d4ueMQMGkOX4cs1oaYOwZlmiNds2Ag8YIma2obg5HH+GVbgvcl63FD92l1x8oXgnJJsHCONibnwfOIU+3kc/yC82QxNOtgzQWMG4VxgB0vkOmnfUoLfWUJjvN9dbYVgB5XhL8wQv1nZ+mc3WGK7OpNs2tqxPBYtB9pNv90+l5dg0BLxWJPtz77xm59T2GlMVdfM+7olgp27zuv8qKVwvRWCxl4fWTNOY9MfwJ8Af+VWyG0zcJ0Z4tQPc4G3WyKXxzfBvWbQWBrM7iNvtkSQjgosNUNz8gFwA9bDVHwzOK8hnO5O4+D57Iuyf7dE8I2Av7ZCYQ661+LaUMPt60s2wuSx+HdtgF2BE62+XU9tgVvMEJeZcCzwp5bIddzpK/llmsZn33NZlHC7T3Kmr9j3938gm/5cw9tzHzh8PP7F2+B8YKKbILebSvBrM8Qp9V5LPVYtzO4nS2NmLvwG+JIlgo9ti8d6hj2F8QFwAybAWbg2UF53dcHPzKCxNh+2AZ+yRPhYp+xbqYUwJ5sC+mZLbNe0QThpjAZdSxijh82RumYevGKG6C70LrBCPhW43AoaD11wf+L6eXmObyuqa5wrQiUYTOBzlqgtgVPH+t/5ELyOcfj3FsBgm7ObRasfDsLZ1vJ6ugNuN4PGaSx4JS6hEqozye55qcn4ALhOa6ET+Jglcl9YXGUFjaPP4fTjeVxogmLYlk01utUS27VstKe+WzsO001H5vn2bM1qRaQf3gt0WSKXJ56Au82g8VK9kaUwe6VwnBniNQSfdQwc5MgyvGEs/4Vbsg8qppg+t9tnO7NZzC4EEjPkGresri5tJY25bvgpTj8eLIGzH/RjyabjA+A6Tcmmg3qDJXK5vwvWm0HjpQQv43qoefxlHxxihvjNhV+mTl0znBkzYcEojxtOBqabertuOASeNUNcKr4oVA+nsNO46oJ7gB9bIkwCF6beN4lWDzxJNhW0hjeBMZoRB/77xcizzZ7b0JBT+UerD2ak8AFL5LJ5yJeENc5SuNQKwaYOwelmaC5eyNSh+pXQeZbIfcBcZQWN+xUTXIdvDwZLYLkVCuNynLpmuHPUilH8Z7fhrCHDXtiTHZsVkTLMSeAdlsjlmQ74ghk0zmO7NHX60Dz2L8ORZoh6jHe9FYKclo7Rl4nVFyNdJzC/NXPgUTNEawXZyxYKd2t1HVZp3HRDL3C/JYKdtw52MEPz8AFwHWZm00C9xRK5PFqC+8yg8TYHnk7hNksEW/gg7GuGQgxaf5rAXZbYrp4+OHQ0/sED8H5gPxNv1y0l+LUZ4pLCxVbIzSns1BSSbC29X1giuNdFVoh6DPx9oN8SNc0owztH+19S/aDifHPXM/TyK7RYrYfpyRh+ZV8QFXxJWM0zFnT2hXDTJ8IiMzQPHwDnH3Elo/mVUIEPlKsSvzxT84wirwK2WSJIewWWmqEw+/4l1ZsHeu1z1Wjt6/4Nbd9QAp8yQ1z6Yf8EjrBELlsqTmGnJlGCwRRWWyJYTx+8ywzxSj3+ho6FF4/2v2MmHIsfVNSzbf6xBD+0RJzas+vBTkvkck8JfmIGNYPZ8DXgR5YItnytMx40DR8A5zQA7wP+zBK5PLUF7jCDmsUceCKBr1giTAqLBuCNlohfNzyYwP+1xHYt6If9R/If2Ac9Kcwz7XZ9uQt+ZobozgsXex2RTwK3VdeilJrCENyIa6/n+Rt2zfOIDcLfAk9boqYPlGG3UR5DXGDmuo7Zl1shTmXYOYHTLJFPxWUE1VzjwBT3yTz2mQILzdA0+6/y6IfveyM3t98kvqnYclJ4AfhgCQabdBA+G6cCy7M9r+z2Yr0o57H/nfoQeDg3luDMETzWfBU42qzbO7Qwy68Z4rIB9mnP1p/zjd58NibwWzO03EHun0rZzDNNqQyX4exWwRIodXn9EPMY+HIfPgY5pzRK0672wWEJ/IuJcx97vtUFf26JOJXh48D/sUQu2xL4jhla0tIueKhJ/5Y7gE3AXm6mID/sglmJsxA2wzhCoXrhnW2egKQ8Ti3B55t4IP5NvJAK9cJE2Psg+E9TxK8P1iXw/1jiNW2uwD4j8aVeH8xIsgdl7Wb9Yyn8YzccZYm4lOEGRvAlCangXgFmNus65+th+gT4N5yWMtRXSvD/miFOA7B3Jbtx67hseD8qjdKsd/3wLykcZuLcY+b53d6LjHXcvCPZefb11pBqS+AfuuADTfw3fT5N/HJnE27PI7vgPkuML6duyxfLaZ+kfD7+MExs4gupK9xEwaZshY+aoTCDMPf97etM4IwR6rwcbzIOx6nsIrMepgOLLCEF24HsRlFTmgu/waV68jhmAN5mhjjNhn9PsjX8NLwDyzBnpP+hAzArhXebN7cNPvyN2mJ8+CsFS7Ox1qxm/fk64LO4pESe7flxK4w/HwDnGKwCh1tCymXvV+CkZv3huuFbOI1bHuc+DDuZIX5dcA/wI0u8tgSWbITJjfwzNsCuwInW3G7j73bD9y0RlwlwHtkDLUnhPlqGNzTrDzcEVwIVN1OQthSWmiFeKVxvhSCLR/ofWIGLcBbCejh1cKSq08Webwkp362CFP66WX+4WfBSAje6mYLNGYB3mGGcL2BM4GBVGmVN/RVwkt30UphdX4FTzFCAETWkqfv+cKYNNvjyShssocGHyAV3qQnish6mAqdbQsqtqb8CnpMtVXCPmylMCieW4U2WiFNXtv7sTyxR03HV8/6I2AD7AMeYNbeNXfB1M0R7zX0CsLclpNxjrab+CngCXEe2zIsCDDmj7rjzAXCAMswEjrWEVJem/gp4E3wF+JmbKdiyZn6gr1wXpHeSrUek7ezra+qcvnntCE4jXVAbZ2drsCsiHXA2sIslpLo09VfAFV/KyXU4TLPZEBTn+DclW8tew9upAz44Uv+w9mxZlAlmze2S6j6ryKTZV4zLLCH9/9u78zi7igJh/8/p7iQdJEFwQRwRJWZUgmC6b4dMRDE/lZdxdBBlMjiiMgyDDMpmgCSg84cKhJAEEhYjsqgsYl5k3EZwgbhgDMlNh1XGgURZRRQGCJCl0/e8f5z2N4jppKrTy6lzn+8/+lGi6adu33vOrVNVA/u4Lvkq4MeBrzpMwddeh6yGTkuMHCeAw8zGM/ykHVHaVcAzoBc43yEKtucG+LAZ0leDHmChJfq19wQ4dCB/cBz8M8VZqdr6DcDZfpmVlmXQnher2iUNTKlXAU+BVTn8zGEK/hw7tg4vt0SaNsJXgGcssW35IG0DfQe8EjjKotHuXwc3mCFN3XAYMMkS0oA/g0q9CrhvR71eRypMo3gQTCPECeDtWAmvAo60hLRDSr0KeD1cATzmMAWbnfv5UQnr4cu+9rd5UT9rAH+mBTjRev1auxa+aYa0jId/obgmljRwpV4FnME8hyjYTnmxK4ISdCCsz+EqS2zXlJXw1h39H9lSXBePNWf0e/JZM5xcSFbD1b/SDr8NlnkVcBesw4d0Yj7TDl8DEy0xMvwCf/uBTgPaLSHtsNKuAp4OG3ErsBhv6h7gykiV77Wfw0WW6NeUVfC2mD/QDR8A3mS6fs31y6y0LIM2t7CTBkWpVwH3nTN5u8MUJoMTboVxlkhTC1yMu5GEdDp6R/78HfCS3GNRBuKhdrjWDGnqhndl8DeWkHZM2VcBt/jwZIzWXlcBj+RrVf1ZDrsB/2oJaVCUehXw5uJLgGcdpmBzTFANWTEB/LQl+u0zM/KPzLRavx7ZxRU3ydm52Pb/dZaQBkVpVwFnkOceixJjt3a/K0hWJ9ybwy2W2K6P1mGngf7hHvgE8DIzRps7CTabIU29flciDdrlaZlXAXdAHa8lYhy1EvY0w/BzAngbxhRnnflUrzR4SrsKeBo8mcNlDlGYHLq64V2WSF8Nns7gS5bo16Gr4c0h/+AqmJLDNJP1a+FE2GSGpN7rswxOt4Q0aEq9CjiDrwMPOEzBTlvmbmHJ6lsFrG17aQYfHMgfrMMo4CQTRvv9ZrjSDGlaCV2Z35NIg3k/WupVwB6hEmVUi9cFI3XNq63p26rGc32kwVXqVcC9sACftI3p5ZOtFdEDC4ENltj6tVIeeKZvBrPN1a8nNxZnTishdfh7YF9LSIOqtKuAa9CTwyKHKNirxsGRZkjTWvgO8BtLbNcxA/lDGXwEeK35orstmOZ9Wbo3jn5HIg3622KZVwF3wg+Abocp2HF1eLkZhv2zSVuzGY7FF6Q0FEq7CngqPJzBNxyi4JvTd3V7tk0lTIXfA1+1RL+OWgmv2tY/sAr2ppgs01bkcOGBsN4Syd0ouPpXGnylXgU8Gi4FnnCYgs1eCq1mSM8M6KV4vWvb13AH1eFNkX8myz0WZSCe3ABLzJCmvt+TQy0hDfrnUKlXAVMsJlKYlwDHm2F4OQG89Q/tURmcbAlpSJR6FXAO5xX/ohC9cKoVKjOW84Atltiq9gyO29Y/kMFp+AVwf57rO2taaV0PT3dLc2nIlHYV8P7wHPBFhyjYhAnwITMk6zJgoxm2LYN/jvnnu+F9uIPIQDov9oHJpM3G79mlIXl7LPMq4HXFQqK1DlOwk+6Bnc0wfPxg2oocPopb1UhDqbSrgGtwF3CjQxR8k3rYSphkifQdUGyBt9QS/b7WT7ijeFrxL9wGL6O4dtDW211agz9aIjluYScNnVKvAh4FF+IWpDHfH5yRQ2aJ9PRdn1xnie2+xj/ed6Zv6D8/y2rRnss9lzpZK2FP4MOWkIbsc6i0q4D7dhTxCJVwu20c4PESGhgngP/yDaUlc6saaaiVehVwo1gJqTBZi6uAq2QuroDv9yK1p5/3rRY4gX4mh0VPDheYIS0r4a3Auy0hDakyrwJ+HPiKQxSerBv+jxnSlMNiK2zX7nngUSd1OAB4m8kib6rhYh+YTFffdyKjLSEN3dtkmVcBA5cDf3CYgq+9Zt7je+ZwfkbpRRerHwT2sYQ05Eq7CngK/DSHXzpEwT7SDXuZIX19K+C/b4l+nfric/6WBWwP3dR3aXBVDR60RHI3CGfiajZpqJV6FXAO8/FoiBizTZCmLlgDrLDEdgWt1smLawjF2Zi5eixZfbtBHW0JacivTUu7CrgGz+dwiaMU7DUb4SNmGB5OAP8lt6qRhkepVwG3FF96KcyoRom/wFScDL5ghX7tPQEOfeF/MK44E21302xVI4MFZkjLKngjxQORkoZeaVcBd8E64AaHKEwOB61y1WPK178XWWG7jQ7e3kO/dXhTBn9nrej3j8s74FFLpKkVTsbzLKVh+Sgq8yrgnmJHkWcdpuDPvlm5c5PDwsh/frF6cAY1S0jDprSrgDvgW8C9DlGwY7rhFWZIX2exAuLnluj/IvUF/74FONEq/bqhA35lhuRuDk73HkEaNqVeBdyAc/BoiBg+TJ6odvi/wGOW2PYlQm/x4OP2fge8hojT0+bD58m6FcYBn7SENDzKvAp4GjwJXOkoBXtjHQ4zwzBcwJngz8wxgTSsSrsKOCtWrp3vEAXbqeFEWJUuqs+xQr+m/GmFTzd8AHiTSfq9yDzXCmlZAa/J4UhLSMOqtKuAp8DtOdziEAXfP7yvDm+xRHomwWbgy5bY7mv8X158HMqf3A5/BfyTlaLvu66eDL+1RJrGFkcB7WoJafg+isq8CrgVFuIRKjHXFZ/JPXpqyDkB3GcVTAHeaQlp2JV2FfB4+BrwO4co2Al12MUM6euCG4FuS/R7kTqz79/OtEa/ftgBdTOkpbV4TY+2hDSsSr0KOIN5DlFMLlcBp6oFlgA9ltim17weDt7af7GleB/zGiJOAx+YTNZ9MCYvtn+WNIzKvAq474GepY5SsLfW4d1mGPJrXPWFONMK0ogo7SrgibCJ4gwHhdklg2PNUA1+4btNh9bh4zlMM0W/N2WuIk/Mctgtg2MsIY2I0q4CrsEP8aGwGEeshjeYIT19Z7B+yxLbvUf41xf/Z3cWKyD/1TrRru+CX5shTU/BUcCrLSEN/0dRmVcBZ8WDPR6hEt7LHXmHmBPAwGp4cw7vs4Q0Ykq7CngLXAI87RCFyWHmMmi3RPrWwvXAfZbo9/rJbQL7t6ILfmKGtIyGk4CdLSGNiFKvAs49nzJGa17isdS2NeBiK2zX+1/8wMomOJ7iLFTFcfVvopZCa+ZuUNJIXpuWdhVwJ9xJ8QClwkxf6eKKIeUEcGGOLaQRVdpVwFPhGZzoibH7+JKOpeLMgN4MzrNEv0aZoN+bMVf/JuYOeAnFl7eSRs7xK2D3Mv7FflNsZbfWIQp2dFlXdGvbpsBPKb64Vf/aeMH93jJoz+BTZon2vZq7KyTr9TADmGgJacSUfRWwO+pFaIHTrTCkfZvbStgzhyN8KUgjrrSrgNvgAmCzQxQmh1nLii8GlLi+c7AftYQi3FuD75khLT1wHPByS0gjaqc2OLWMf7EZ0JsX18MKMwY40QxpylwFHOLYvDjzmnHwz8CrTBJ9zzzXCkm/T5xmBWnE30fLvAr4FuA2RynY36+Cfc0wNJp+AjiDWbiKRyqD0q4Cfis8ksM1DlGwvXeGw82Qvr5zsM+3hCJuws7JoGGJdNSL62AnKqRyKO0q4AyuAP7gEIWP5Rp4qRmSvJa5GnjSEtu+36vDQUuhFbc8H4hlXfALM6RpFbwXmGwJaeQvT8u8ChhY4BCFj6UP1gydpp4AvgNemcHRvgyk0ijtKmCK83mc1Aj95IY5f3oqXGkbBV8EnrCEAjyUwXVmSM7HgdeaQSqF0q4CrsHzroyMMr4X/s0M6anB88BXLLHd+71jJsCHgDdYI04LnGWFpF/7c6wglUOZVwGvgxuA+xylYB9eA68zw5BcdzSvHjgZGOvLQCqN0q4C7oJfZ25rGmO/OvytGdK3PzwHXGIJbU8G59agxxLp6Fu545O2UrmUdhXwJrgQeNYhCnbycr9vSPWa5ov48O/2fKjkK6/K6rYOuNkMaVoNU4EDLSGV5yO7rJ9FM6AXWOgQBRvVgJlmGHxNOwG8AsbjE7lSGZV2FXAOZzs8EVdhfiFQGb2wCL/w1bY9vqnYHlQJ6Vu589eWkEqltKuApxXb4vpeH+6VY9xxLEmdcD9wkyW2qR3P64vmdwrJj5/fcUjl+70s7SrgXeBK4DFHKXgsj1kJr7LE4GraCeA2OB7P5JHKqLSrgGtwG57VE2Nq3adjK+GAYgvoyy2hbbhgGmwwQ3I3WKdbQSql0q4CbsB83O0h5n12Vt9Z60pv7C6yggbZr2ruKpas1bAf7nImlVFpVwFPhE1eT0Rpz+AEMwyuppwAXlY8qXiiwy+VVplXAc9zeKJ4Pk5FbCm+8N1sCW3FM63FVolKyGo4BOi0hFRKpV0FPAUeApY6RMH2zOEIM6SnVqwA/m9LaLDk8PnMrcVTNgfIzCCV8v21tKuAxxRHqq13lMJk8Kk1LtocVE05ATyu2IZpD4dfKq0yrwL+LnCPQxTsvatgshnSNxUezuEaS2grLpkMT5khLQ0f0JHKrrSrgLPigcjcIQruNSdv4t3XEh63PIclltAgWfssXG+GNK2CvXM43BJSeT+2y7oKeD/4nwwuc4iCje+FT5hh8DTdTchSaAVOceil0ivlKuAM8gwWODxRzU6zQmWci0+t689tBBabIS11OCCDd1hCKrXSrgLuhDtz+IFDFOzNdXi/GdLTVpzd95wltKNyOHs6bLFEsmYVbwmSSvw+W9pVwD2wEHfUi3HKchhrhsHRdBPAE4rtl97g0EulV9pVwDlcDTzoEAWbsQYmmiF9XfDrDP7DEnqBK2rwOzMkd3N8phWkJJR9FbDCe51hhfRMhqey4t5P2hEP7+TrKFkrYPespN9NSfrzy62yrgKeCg8D1zlEwXYfDUeZYXA01QRwXrwRzHLYpWSUchVwDXqACx2eYK0NmGmGamjAWbjtowq9GZxvhrSshjdn8HeWkJJQ2lXANVgGrHCIgk1ZBe80Q4IXO8V9n9e+2hHzJrnyK1mtxXcZ7ZaQyq/Mq4AzmIs76sU4bZk7LwyKppoA7ob3AW9x2KVklHYV8Eb4Ep55GXMRdlQ3vNoS6euCNRncbAkB13XC/WZI7v34TDyLUkpJaVcB5x6LEiXz7PUkTYF7MviZJTRAjwOXmyFNddglg2MtIaVzuVXWVcCdcC9wo0MU7PXjYIYZdlyzrQB29a+UnlKuAj4Q1gNfdHiCjemFk81QGeeYoOnlFGdCKyG3weuBf7SElJQyrwK+AbjPIQp2cDfUzJCeBlxkBQ3Qwho8b4ZknQDsYgYpHWVeBdziESqxzsx9eH0wXnfNYSUcBLzNIZeSU9pVwFtgEbDBIQqTwXF3wq6WSF8n3JLDLy3R1DdV36vBXZZISyuchtsoSSkq5SrgDBquAo7T8KH0JD0L36I4v0+K8TSwxAxpqsNOwImWkJJT2lXAHfCzDJY7RMH26Yb3mmHHtDTRD+p2S1K6SrkKeCr8PoerHJ5g4zbDJ81QkStqn1xsdq7+TUzf5NFRlpCSVNpVwC+FrwC/c4iCfbAb9jFDWqbDFoojgKQYi2vFJLDSdAzwCjNI6SnzKuAcznOEonp9xgo7pikmgPt+4Q92uKVklXYVMMUkSK9DFOzke2BnM6SvE74N3G2J5pPBT7vgF5ZISxucAoy1hJSsUq4CngibMrfHjdGSw0wzJDhwxQTwRkso0HMtcKEZ0lSHUcCnLSElq8xnAX8b+JVDFOyAbniHGXboGrb6GnAGkDncUtJKuQq4C9ZlxZZgCvOyDXC0GSpwNQ25Ty42Lc+ATswKGA98whJS0kq7CjiHi3GVW0yvj9bhtZZISwf8IYfrLaFASzrgD2ZI9l73I8BelpCSvt4q5Srgvu/SFjpC4Xrd2XeHVH4CuA4TgA851FLySrsKuNetUGOdWsbJfA3owvXrwG8t0VTu6IAfmiEto+BTwEstISWvlKuA+7Y4vdzhCX9bzotdGZTeta+r3RViU4tf7icrL1YOnmoJKf2P7bKuAn4pXA086hAFX38dsho6LTEwzbACeDbQ6lBLlVDKVcBTYBXwE4cn2J4b4MNmSF8NevDLjWa78D47g9wS6VgG7TmcYAmpEkq7CrituB7Y7BAFf54eW4eXWyK5a9/bsuLeT9qWKzr8Yj9Z3XAYMMkSUvrKugp4ImzKYZEjFK4Bp1lhYCo9AXw7/BXwUYdZqozSrgLOYZ7DE2V23iTHEFTdevgy8JglmsLatfBNM6RlPPwL8CpLSJVRylXAb4VHKHYGUZid8mJ3BiWmb8tzqT+9mQ/IJq3h6l+pSkq7CrgXlgBPOUSBAwmHr4GJlohX6S/ft8CngTEOs1QpZT0L+EZgjcMT7E3dcKgZ0jcdNuZuh9cs5s6AXjOkYxm0uYWdVDmlXQUMzAUaDlGYDE64FcZZIi27wHXA45ZQP67phPvNkKZueFcGf2MJqTrKugp4KjyTwaWOULDWXlcBD0hlJ4CXw27AvzrEUuWUdhWwT/pGm2OCaug7D+1pS1TaY+uLc2qUkJ2L7fZfZwmpcsp6FvB/Ad93eILt1u53FsmZCJvwzGttXaPhzmBJ6/U7CqmKSrsKuKf4HnmjQxTsY7cXO/4qQmUngMcUZ535NK1UTaVcBfxM8TT4Aw5PmBy6uuFdlkhfDZ7O4EuWqLTzpntjktp7bJbB6ZaQKqm0q4AzJz9inbYM2s2QnCXAFjPoRW6YAveYIU0roSvz+wmpqvfGZV0F/HvgGkco2JgtcIoZ4lRyAvgOeInn6UiVVspVwNOLLwHOd3jC+YRtdfQ9ubjBEpX05MbirGclpA5/D+xrCamySrkKuBN+nsFyhyfYq8bBkWZISw0eBL5rCb1QC5xrhaTHz+8mpOoq7SrgHM7DI1RiHFeHl5sh6vOtejbDsfhCkKqulKuAKSZJ/ujwBF6Bwbu6PWOnEvqeXPyqJaonhwsPhPWWSO4i39W/UrWVdhVw3xdZCjd7KbSaIbn7mIusoBe8Hm7sgLol0lSHNwGHWkKqrrKuAu6CXwPfcYSCvQQ43gzhKjcBXIdRGZzs0EqVV8pVwDV4HrjE4QnXW9IvLzWgsZyH2+FVzXN+wZnk9fD0HKZZQqq8sq4C/jbwK4cn2IQJ8CEzpKUTbgHusoQAcjjbCkmbTYWPSZQElHsV8DkOT5ST7oGdzRCmch9uOXwUeK1DKzWFUq4C7oXFwHMOT+AVGBy2EiZZIn0HwG+ApZao1O/npTV3NUjRbBNITaGUq4AzyHNY4PCEy+GMHDJLJGeJCZTBT2twqyXStAJeA3zYElJTXG+VdRXwSuDnjlCw3TbCMWYI01KxX+KWDGY6rFLTKOUq4APgiRy+4vCE3zO3uAq4OoNZnH2VW6ISenK4wAxpWQlvBd5jCalplHIVcAZXAQ85PMH274aDzZCWsfA14GlLNDdX/6atDU6jnMeLSRqCS9SyrgLOih31FP7ZO/Me37uDVGoCuA4fBPZxWKWmUspVwI1i1YNb4Yb7SDfsZYb0dcKdwPctUYE7I7iqBg9aIrmL+zNxFZnUTEq5CrgGPRlc6PBEmWOCtEyCZ4GvWqKpremEH5khTbfBy4CjLSE1j7KuAu6A/wTudoSCvWYjfMQM21e1LaBnOaRS0ynrKuDfZHC9wxNsVAM+bYZqyOALVkheI3P7zuTUYQJwmCWkplPKVcAbiu1xn3J4wuRw0Cp4myXS0goXAQ1LNK3PZe5+lPLv78l4jqTUbEq5Crjvs2S+wxN17Twr9/z27apMoDocnEHNIZWaUilXAWcwF28GYxzTDa8wQ/o6YQWeX5K6GzrgV2ZI7E4WzgBaLSE1nVKuAj4Q1gNfcnii+FB7YibDfbgCtFnd2wnfMUOaboVxwCctITWfsq4CBq7FXdhivLHuA/Db1Vahn2W2wxns6Qz+pgGbTCENnQ64ow4/xrMYQ+3UgBMp6Xkcir6gPieDt1siTS3FWc5KyAp4TQ5HWiLY9bkTLaqQXthc0r/aIooVVmMcpe3L4H11eEsN7rJGUuN2cQ7/xxJNN+5nZa7+TtZYOC6HXS0RfH//T8BtllCF3sOfLNvfqQY9q+CCDBY6QsHjOAf4piW22Sh9q2BK5odQzKDP6/QLL2m43p/enflEeIyngb1qxb8qcXVYDXRYIjk/rPklZoqfN+dnxSSLwnTWoNsM0rBcD3wZOMYSwa6p+UBPUnJoWV2sBN7bGk1j3Xp443TYYor03AdjnoZ1wKutEeSuTtjf7c6loXcHvKQHHqA4o1xh12EHd/nde79aKvJDnOlQBuvpLc6okTQMuooVwKstEWyXDI41QzVkMM8KSV48n2OFtCyH3TInV2Je4zc7+SsNn144D1fJxThiNbzBDEld8zay4sxrNc+Yz3XyN11PwVE4+Rtz7TzfyV9peOwPz3lNEf2ZPMcK/Ut+Ang1vDmH9zmUwa6dAg+ZQRrWD6LzrBB1czFzGbRbIn1r4XqK1RBKx8ou+IkZ0jIaTgJ2tkSwBSaQhs8B8N/Aty0RrDWHT5shLaPgMuB5SzSFh8fD18yQpqXQmsFMSwR7ZCe4zgzS8GmDxcAGSwSbvhKmmWHrqrACeE5Ffo5h0YALrCANr75JsPstEWz38fAxM6RvBvRmMN8S6cjhbCuk5Q54CXC8JYLdXYObzCAN+32ou0vEOboOe5ghHfvB/wBft0RTmD8RNpkhTa+HGcBES4TJYNEk2GwJafjsD48DX7VEuBY4zQr9tknXStgzhyMcxjA53DQFbreENLxmQC9wviWi3q9mLYM2S6RvfHHR+qglknBvDb5rhrT0wCeAl1siTAYL3MJOGn5TYFUOP7NEsDHAiWZISwtcaIXKe2IsXG6GpK8FT7VCsPUt8GUzSMMvL3aT7LVEsENXwb5m2Or1adIf2rOAUQ5jMLe7k0bqqhmuAB6zRLC9d4bDzZC+vqfjfQAijRuMczLPaExKvbgOPskSwR5th2vNII3Y/fs8K0Q5fg281Azp6IA7gFstUen3sYWT4FlLpGkVvLf4VVWgSyfDU2aQhl8XrANusET4R3TmKuCtSnYC+A54ZQZHO4TB7qzBzWaQRsZ02AhcYomom+s5OWSWSN8o+CLwhCVK7aHMs51S9HHgtWYIttgt7KSR0wnfxx2pYozvhX8zQ1pyuNgKlfVMi/f0ScuKYwQVpofiHFJJI6TFhydjfXgNvM4Mf/E6SvZT6GRgrEMYfJEzz+3upJG1ufgywKeFw+1Xh781Q/r2h+fwy5KyXyecWytu8pWIpdCKT7jGWN8KXzKDNKKfNXnuriCxTl7u9x6pvc6/CTxiiUqO7YWuhkzXapgKHGiJMDl8owYPWkIaOR1QB26xRLBRDZhphj+X5ATwChiPT8LGeDiHpWaQRtY0eBLPC4q9yf6sFaqhFxbhAxBl9fimYpt6JWQCfAj4a0sEf55c5pe2Uil+F78OPGCJYK8c485nSalBTw6XWaJyns+K+xklKve7hVgLTSCV4trZVcBx7/XHrIRXWeJ/JTkB3AbH41k4Mc53VY9UDltgPv4+xpha9yndSjig2ALaByDK6YJpsMEMyd3YnG6F8I9fv7SVyqFvcszfx7j3+1l9Z74rEVmx44RHDlTr9/DSDviDJdK0GvbD3cVi3sN+3AVrLCGNvE74Af4+xmjP4AQz/K/kJoCXQTtwokMX7Bn8wl0qjanFivxvWCKK5/RURN8DEH4ZVrLrhNbijGYlZDUcUtwLKtDSDlccSqUxGi6leDBMYfbM4QgzpKMGv6PYClrV0JO5fX3q5gCZGYLNN4Hk72SqMvjUGheP/v+SmwAeV2x/tIdDF/yCX1KDpy0hler3ch6eyR3jvatgshnS1/cAxDWWKJVL3BY3PQ0fjIm1wARSeewPz+HDR7H3D3PyRHdwa1Y5XGyFyozllZ6Fmq5VsHcOh1si2F0d8EMzSOWxrlhItNYSwcb3wifMUEjqBmIptAKnOGzBenrhIjNI5VKDu4AbLREug9OsUBnnAg0zlMImYLEZ0lKHAzJ4hyXC5HBzDbotIZXLKLgQjx+I8eY6vN8M6eiCXwCrLZG83jZXXiWtpTg2pc0SwdfO8zMXLEilMgN68QiVWKcsh7FmSGwCeEKx7dEbHLZg106Bh8wglU+jWAWsiOudNTDRDOnrgl/n8C1LlMIVfVsUKiE5nGmFKK7+lUpof3gc+IolwmVwhhWS+8x2pXv6rpsM95khTStg9xw+Zolgj+wE15lBKqXL8Sz6GLuPho+bIaEJ4ByyHGY5ZOEacIEVpHKaAj/N4ZeWCNbagJlmqIwv4FPFI603g4VmSMtqeHMGf2eJYHfX4CYzSKW9x58PbLFE+C3EKninGdLRA9fieddJv03lMNcM6WotvkNwBVigDBZNgs2WkMqnBs/ncIklopy+zB0g0pkA7ob3AW/xdRt8M33TFLjdElKp34DdSirufe2obni1JdLXBWsyuNkSI+q6TrjfDMm9D56JZ0AGy2CBW9hJpb4eWAfcYImo9zXPgE/INNiQwxWWSNa3uuBuM6SpDrtkcKwlgq1vgS+bQSqvnuIIr2ctEez142BGs0dIaQWwq3/juN2dVHIdxTa491oi2JheONkMlXGOCUbysopzzZCW2+D1wD9aItij7cXKK0kl1iiuB3xQI9zB3VAzQzpa4WKKs/uU5vuT0nUCsIsZgl06GZ4yg1Re0+BJ4EpLRDkzb/KH6JP44VfCQcDbfL0Gu7Pmyiqp9DJoZHC+JaKaHXcn7GqJ9HXCLW6DPjJy+F4N7rJEWlrhNNy+KMZit7CTym8K3J7DLZYI1/Dh+KR0wAMZ/KclkvODKbDKDGmqw07AiZYI1kOxslBS+b8XWIhHqMTYpxve28wBWhL5S7rNUYQM5rndnZSG8fA14HeWCDZuM3zSDNX5vLLCiHD1b2JWwO7AUZYItr4VvmQGyeuBivpgN+xjhnTkxSpgJaQFzrZC0o4BXmGG4Peob9TgQUtI5TcZfgsstUTUe9xnmvyapty6YX/gYF+qwR7OfROQkjERNuGTlrFOvgd2NkP6OuHbeK7WsMrgp13wC0ukpQ1OAcZaIvh1fplb2EnpqMEPi1t/BWrJYaYZkrrm/RHwX5ZIQw6/7ICfWSJNdRgFfNoSURaaQErqfvdcXPwX44BueEfT3jiU/S/YgDOK17UCnV8rtu6QlIgtcAnwtCWCvWwDHG2GSly05jmcZ4lh5VlmiVkB44FPWCL8YzWDRWaQ0pLDfCtE9fpoHV5riXSueYEvWiINLfA5KyT9+/YRYC9LBPtRF6wxg5SOTriT4gFKBept4h2GSz0BXIcJwId8iQZ7BrjcDFJapha/u1+2RJRT74HRZqjEDfrXgQcsMSzu6PAmITmj4FPASy0RbGmH7ylScn5T7GK11hLhHw8ZnGyGdGyEKynu+1Rut3fAD8yQphyyHE61RNT9+AIrSEn+7nqESlyvQ+rQ0Yw/e9lXAM8GWn2JBr+Ql9RcRSglqQ0uADZbItieG+DDZkhf364V3nQOz3XC2ZnbBCVlGbTnxQSwwvl+IiVoBvTmxfWwAuVwbB1ebok0HAjrc7jKEqX/vfqC18vp6oYPAJMsEewuHxCW0tQJtwC3WSLqM/70Zvy5SzsBfDv8FfBRX5rBenrhIjNIaXorPJLDNZaIMjtP4CgDbd/6YgX8Y5YYUmvXwjfNkJbx8C/AHpYIvqG7ueY5olKyMrgC+IMlgr3Eh4TS0gIX4+Rimf1XDf7DDOlqwGlWiLp2nu8DD1LSfPg57l7j8DUwsQmvP8tpC3waGONLM9i1U+AhM0hJO7e4Z1GgN3XDoWZI33TYmPsQ01CbOwN6zZCOZdDmFnbeAEvNpAbPZ8UEmQJlcMKtMM4SaeiEe/NixY5KKC92y/F+PFHd8K4M/sYSwR7ZCa4zg5SudXADcJ8lgrX2NuGDQqWcAF4OuwH/6msyXMPtsqTkdcGvM/ieJaLMMUE1ZMUEsMcYDI3H1sPVZkjLzsU296+zRLC7a3CTGaS0bYILgWctEWy3dr87SUqLDzmU1W+eha+bIV29fjcQe/+9aJLHkElJ63vIf6Elonzs9mLn4Wa69iyfMXACPsUaLIebpsDtlpAq8ft8thWienV1w7sskb4aPJ3BlywxJM6bDhvNkNR7W5Y16fk0A5XBArewk9I3DZ6k2Apa4U5bBu1mSMNa+A7wW0uUzrzpsMUMaVoJXZnfC8RY31IcwyQpcbvAlXikWowxW+CUZvqBSzcBfIfn2AyE291JFVGD24BfWCKcT/pWR0/x5OIGSwyqJzd6c5+cOvw9sK8lgj3aDteaQaqGBswvLgsU6FXj4EgzpKFvtY4PPZbLY5vhq2ZIV4vfCcS6dDI8ZQYpfRNhk0eqRTuuDi9vos/IctkMx9JEAzAI7qzBzWaQqiOHeVYIl8G7uj3rpxKmwu/xy5fBfj+58EBYb4nkLtBd/RtnsVvYSdUxBR4Clloiyuyl0GqGZFyGu7OUyXnTfAg1WXV4E3CoJYL1AIvNIFXHGLgEv/eJ8RLg+Gb5YUs1AVyHURmc7GswXAbz3O5OqpYafBe4xxLheuFUK1RmLOfh9muD5bnMJ0GTU4fpOUyzRLD1ra6kkip5n4v3uTEmTIAPmSGZ+70/AtdZohSeGAuXmiFpsynpEYdllMM3avCgJaTq2A/+JyseLlO4k+6BnZvhBy3VB2QOHwVe6+sv2MO5T0ZLlZNBnrm1e2yzw1bCJEuk7wD4DX62DdbvxaV9XzAqLbNNEPU6v8wt7KTq6YQ7c/iBJcLlcEYOmSWSGS9X4JXDoknwrBnStAJeA3zYElEWmkCqnr4j1dwVK9xuG+GYZvhBSzMBnENLBjN97UU5v+bZSFJVvxC4Gp/KjJG1uAq4OoMJ5+Kqnx2+/s/hAjOkZSW8FXiPJYJtyWCRGaTKXg94LEqc/bvhYDOkoQvWACssMaKeGe1uOUlrg9OA0ZYI9qO+9x5JFTMVHsbdRaLkMPOeJvgMKc0EcB0+COzjSy/8QhW43AxSNfU93HGhJaJ8pBv2MkP6OuFO4PuWGLgMrnJrryQvzM/E1VsxlnbAA2aQKns9vAwnyGLNMUFS12sXW2FEXbIf/I8Z0nQbvAw42hJR7znuNCdV+3d8LtCwRLDXbISPVP2HLNMW0LN8zUX9Qi+pwdOWkKprY3Gm4VOWCDaqAZ82Q2U+575ghQFreHOfnjpMAA6zRBRf51LF5f6ex/Y6aBW8zRJpaC+OPXnMEiN1u+023ClrhZNpkvMbB8ldHfBDM0jV1Qn3AjdaIuraeVZe8XPkS/HD1eHgDGq+5IL19LpNjVR5B8J64IuWiHJMN7zCDJW4cF0B/NwSA3JDB/zKDGnJ4Ayg1RLBN2o316DbElK11eAG4D5LRPHh+kRMKs7q+7IlRsSlNfidGdJ0K4wDPmmJqGvn+ZnHLEmV1+IRKrHeWK/4g/hlmd12m6I4106Bh8wgVd+W4mzDDZYItlMDTjRDZW5Sz7HCgC7uzrVCWlbAa3I40hJRXBUoNYEMGq4Cjm72vjq8xRLJXLctoTj+R8OnpwUWmiFdY+E4YFdLBHtkJ88GlZpCB/wsg+WWiLp2/kxe4aO4RnwCeBVMAd7pSy1cAy6wgtQcpsLvc7jKElFOqMMuZkhfV7F1jSv84vywA+pmSEsrzARGWyLY3TW4yQxSc3gpfAVX6sXIcBVwMjrgUeBblhhWX+uAB8yQpvtgTF5s/6zwD4VFfTsOSGoO800Q5a11eHdVf7iWEvwFzvQ1Fi6Hm6bA7ZaQmupifR7Qa4lgu2RwrBkq9fpX+HWCq6YTsxx2y+AYS0S9LyxwCzupeUyETZlHIMU6YjW8wQxpaMDFVhg2vb3eXyTtKTgKeLUlgq1vcat5qal0FA+WeSxYhKzCOxSP6ATwanhzDu/zJRbF7a+kJlODtZlPhUfJYeYyaLdE+tbC9Xj2X6iVXfATM6RlNJwE7GyJYI+2w7VmkJru2u5i4GlLBGvN4dNmSMMU+ClwpyWGxdID4L/NkOjgQWtW7JyjcJdOhqfMIDWPvoelz7dElOkrYVoVf7CRXgE8h/KcQ5yCO2twsxmk5tPrmZ6xdh8PHzND+mZAb+b2NUFyONsKabkDXgIcb4koi93CTmo+tWLy93JLRDm6DnuYIQ2Zq4CH6XLZ3XJS9nqYAUy0RLAeYLEZpOazS3Gc4KOWCNcCp1X05xoZK2HPHI7wpRV1QzDP7e6k5jQFVuHKvti7+1nLoM0S6RsPX/XCdbvurcF3zZCWHvgE8HJLBFvfCl8yg9Sc2mAhPgASYwxwohmSuXe5GnjSEkMng+/W4C5LJD2Gp1oh6n3lGzV40BJS85kIm3JYZIkoh66Cfav2Q43YBHAGs4BRvq6CPZzDUjNITX3x7llFcfbeGQ43QzUuXHH7mu29P5yTQcMS6agX18EnWSLq/uEyt7CTmtdb4RHg65aIcvwaeKkZyq8GzwNfscTQcVettK2C9wIdloiy0ARSU3/uLcH75xhZVsFVwCMyAXwHvDKDo31NRTm/VmzdIalJdcGNwBpLRHxyw5wcMkukbxR8EXjCElv1UAbXmSE5Hwdea4ZgWzKfYJYEc/GBpxjje+HfzJCMS3x9D9l94Y+nwHJLpH1vb4UoP+ry+yOpqU2FZzK41BJRPrwGXlelH2hEJoB74GRgrK+nYM/geUeSipsen+CMs18d/tYM6dsfnqP4Ukx/+b5wrg+JpWUptFLR82WGMlsHPGAGqbnV4L9y+E9LRDl5ud+/pPL6XgvcZInB14CzrJCu1TAVONASUfeIC6wgqaf4HnmjJYKNasDMKv1Awz4BvALG4xOosR/aS2rwtCUkPVOs8vML8Lj30M9aoRp6i9V/z1rizzy+Ca4wQ1omwIeAv7ZEFL/EkvSnazuPRYnzyjHuwJaMHC62wqC7rQt+Yoakfy+8p49zVwf80AySpsLvgWssEfWZc8xKeFVVfp5hnwBug+PxDJoYPb1wkRkkAUyHLXgWavT1Tt2nhSvhgGILaHfE+HMXTIMNZkjuhuJ0K0T1urkG3ZaQBFCDWzO3co19H53Vd/a8yv/6vhH4b0sMqs+bIF2rYT/c1Sv2PX9+BrklJPW9J5yHR0zEaM/ghKr8MMM6AbwM2oETfQ1FuXYKPGQGSS/wZeCPZojieUEVsQXmA5stAcAzrcXZyErIajgE6LREFFf/SvozDVcBx9ozhyPMUH4Z5DksscSguaMTvm+G5O/lMzMEe2SnYuc4SQKgC34NfMcSUddjn1pTkUWswzoBPK7YdmgPX0JRN7YXWEHSC9XgeTwLNdZ7V8FkM6RvKjycu33Nn1wyGZ4yQ3JmmyDK3TXPQ5T0l9fD3wF+ZYlwGczJR2AXOMVrgyuB5ywxKM5yJWS6VsHeORxuiaj3+kWTfGBa0ovkcI4VoozvhU9U4QcZtov/pdAKnOJrJ+oX86YpcLslJL1YLyz2S4HoG6HTrFAZ5+L2NZso3geUkDockMNBloh6717gF7eStvLekOfuDhDrzXV4nxnKbzI8lcHVlthh96+DG8yQrpbi2JQ2SwRb31LsGCdJf6YLVgI/t0SUU5bD2Ap8lg6PCcV2Q2/wdROutdjmUpL+wgHwRA5fsUSUGWtgohkqceH66xy+1eQZrqjB73w1pCWHM60Q5dF2uNYMkrYmg6vwuKTYZn4OJaIXLsQHoHb09X7WDOi1RJpWwO45fMwSUS51hyhJ2/hc9AiVOLuPho+n/kMMywRwDlkOs3zNRLlzMtxiBkn9aRSrHrZYIlhrA2aaoTK+QPN+KdabwUJfAmlZDW/O4O8sEWWxW9hJ6k8NerJikkzhpqyCd5ohgYGCezL4mSUG7CEfIkv85r24dx9riWA9uEOUpG3ogP8E7rZElNOXJb4TxbBMAHcX2wy9xddLuAzmud2dpG05AH6TwfWWCJfDUd3wakukrwvWZHBzk/7413XC/b4Kknv/ORPPXoyxvhW+ZAZJ27IBluBqpygZzLFCGhpwkRUGbK4PkaWrDrtkcKwlou41vlGDBy0haRvXgDnuOBvr9eNgRso/wHCtAHb1b5yHc1hqBkkBH95z8WGRGGN64WQzVMY5zXlvz7kOfVpug9cD/2iJqM+3y9zCTtL2HAjr8WGRWAd3Q80M5fdsceTJw5aI9vvNcKUZknYCsIsZorhDlKQQ1+LDIrHOzBN+mH/I/+Ir4SDgbb5OopxfK7bukKRt6oA7gB9bIlwGx90Ju1oifZ1wSw6/bKafOYfv1eAuRz8trXAaiW8bNMy2ZLDIDJKC3jDgfGCjJcI1fEg/CdOL4358wCH+fm/BNNhgiTTVYSfgREtE+VEXrDGDpO3pm3PyXjvOPt3w3lT/8i3D8H/g9kJxngEuN4OkUDnMs0KUcZvhk2aohqz5Xv+u/k3MCtgdOMoSUZZ2wANmkBRiKvweuNoSUT7YDfuYIYl7vfFWiPJk39bwStcxwCvMEHVPvMAKkkKNKh4ue8ISUddjn0n17z6kE8DdsD9wsC+RqA/tJTV42hKSQnUVK4BXWyLKyffAzmZIXyd8G7i7Sa4RftoFv3DU09IGpwBjLRHFL7EkRemF84CGJYK15DDTDOW2HHbL4DhLRF0vL+7bGl4JqsMo4NOWiHJXB/zQDJJC7Q/PZT4sFeuAbnhHkhf9Q/k/3oAziusvBerphYvMIGkAN7rnWSHKyzbA0WaoxGs/B+Y3yY871xFPy4pi1c4nLBEuh5tr0G0JSTEOgP+meChM4e+3H63Day1RXqOKbXDHWSLYczlcbIak7+0+Auxliaj38vl998SSFKwNFuNxCbHvt7NT/HsP2QRwHSYAH/KlEeXaKfCQGSTFWgvXA/dbIsqp98BoM1Tj85Pqbxd7Rwf8wKFO7qbqk8BLLRHF1b+SBqQB51ghyqgMTjZDOd0DO2fwKUuEy+DiGvzREmnKIcvhVEtEeWQnuM4MkmLtD48DX7VE1OfU39ahI7W/91CuAJ4NtPrSiLphvcAKkgZiBvQC51siyp4b4MNmSF8Neqj4pFEGZ/tkd1qWQTtwgiWi3F2Dm8wgaSCmwKocfmaJcDkcW4eXW6J8NhQPkb3MEsE2ZrDIDOnqhg8AkywRdY+4aBJstoSkAV4HnkfxfbLCm52e2t+5bYhCZN1wT6rLokfIE1PgdjNIGqjNcOVotwiLvWFyu5PquBzYqaI/25a18E2HOC3j4K/wi8hYv/BBB0k7eG13CvAeS0TZA1dNlkrfQ2QnWSJcDpd3wKOWSFcDGpnfI8e+7i+1gqSB6oJ1q+DorLgWVNi9Ru8yaJsOWxL6O0uSJEmSJEkaafXi7F8fIgvX0wp/PRl+awpJkqT/1WICSZIkSZIkaWTVYRTwaUuEy+FqJ38lSZL+khPAkiRJkiRJ0sj7OLCXGYI1gHPNIEmS9JecAJYkSZIkSZJG0FJoBU63RJTru+DXZpAkSfpLTgBLkiRJkiRJI2gCHAFMtEQUV/9KkiT1wwlgSZIkSZIkaYTkkOUw2xJRvleDbjNIkiRtnRPAkiRJkiRJ0gjphg8A+1oiXA5zrSBJktQ/J4AlSZIkSZKkkTPHBFGWdcEvzCBJktQ/J4AlSZIkSZKkEbAaDsmhyxLhWuAsK0iSJG33mkmSJEmSJEnScMvhDCtEWdkBN5tBkiRp25wAliRJkiRJkoZZN7wDeLslwuWu/pUkSQriBLAkSZIkSZI0zBpwphWi/KoG3zODJEnS9jkBLEmSJEmSJA2jOnQA77FEuBw+n0HDEpIkSdvnBLAkSZIkSZI0vP4dyMwQbO2zcL0ZJEmSwjgBLEmSJEmSJA2TbtgHeL8lwuVw9nTYYglJkqQwTgBLkiRJkiRJw6QBn8Hv5GI8vBNcbQZJkqRwXmxKkiRJkiRJw6AOE4B/sESUeZNgsxkkSZLCOQEsSZIkSZIkDYMMzgDaLBHsceByM0iSJMVxAliSJEmSJEkaYithzxyOtESUhTV43gySJElxnACWJEmSJEmShlgrnA6MtkSwp4ElZpAkSYrnBLAkSZIkSZI0hFbA7jn8iyWiLK4Vk8CSJEmK5ASwJEmSJEmSNIRaYSYw1hLBnmuBC80gSZI0ME4AS5IkSZIkSUNkOeyWwXGWiLKkA/5gBkmSpIFxAliSJEmSJEkaIqPhJGCcJYJtaoGFZpAkSRo4J4AlSZIkSZKkIXBrMfF7giWiXNEBj5pBkiRp4JwAliRJkiRJkoZAOxwP7GqJYL2Zq38lSZJ2mBPAkiRJkiRJ0iBbBu0U2z8r3DWdcL8ZJEmSdowTwJIkSZIkSdIgGwfHAntYIlijAfPMIEmStOMyE0iSJEmSJEmDpw6jgPuAvawR7Poa/IMZJEmSdpwrgCVJkiRJkqTB9XGc/I3SAudaQZIkadCurSRJkiRJkiQNhqXQCpxuiXAZ3NgBdUtIkiQNDieAJUmSJEmSpEEyAY4AJloiXA5nW0GSJGnwOAEsSZIkSZIkDYIcshxmWyJcBj+twa2WkCRJGjxOAEuSJEmSJEmDoBs+AOxriXCu/pUkSRp8TgBLkiRJkiRJg2OOCaKs6YQfmUGSJGlwOQEsSZIkSZIk7aDVcEgOXZaI8rkMcjNIkiQNLieAJUmSJEmSpB2UwxlWiHJvJ3zHDJIkSYPPCWBJkiRJkiRpB3TDO4C3WyJcBmdl0LCEJEnS4HMCWJIkSZIkSdoBDTjTClHWPQPfMIMkSdLQcAJYkiRJkiRJGqA6dADvsUS4DOZOhy2WkCRJGhpOAEuSJEmSJEkD9+9AZoZgD4+Hr5lBkiRp6DgBLEmSJEmSJA1AN+wDvN8S4TJYMBE2WUKSJGnoOAEsSZIkSZIkDUAOn8Xv12I80Q6XmUGSJGloeYEqSZIkSZIkRarDhBwOt0S4DBZOgmctIUmSNLScAJYkSZIkSZIiZXAG0GaJYM+0wCVmkCRJGnpOAEuSJEmSJEkRVsKeORxpiXAZXDgZnrKEJEnS0HMCWJIkSZIkSYqQwSxgtCWCPZ/BIjNIkiQNDyeAJUmSJEmSpEArYPcMjrZEuBwu7YA/WEKSJGl4OAEsSZIkSZIkBWqFmcBYSwTryeB8M0iSJA0fJ4AlSZIkSZKkAMthtwyOs0S4HK6swYOWkCRJGj5OAEuSJEmSJEkBRsNJwDhLBOttg/lmkCRJGl5OAEuSJEmSJEnbcWsx8XuCJaJcNxnuM4MkSdLwcgJYkiRJkiRJ2o52OB7Y1RLB8hzmmkGSJGn4ZSaQJEmSJEmS+rcM2sfBOmAPawT7jxp80AySJEnDzxXAkiRJkiRJ0jaMg2Nx8jdKA86xgiRJ0shwBbAkSZIkSZLUjzqMojjHdi9rBPtBDQ4xgyRJ0shwBbAkSZIkSZLUv4/j5G+UFjjbCpIkSSPHFcCSJEmSJEnSViyF1r3hXmCiNcLk8MsumGYJSZKkkeMKYEmSJEmSJGkrJsAROPkbpQU+ZwVJkqQRvyaTJEmSJEmS9EI5ZDnMtkSU2zvgB2aQJEkaWU4AS5IkSZIkSS/SDYcB+1oiXA5fyCC3hCRJ0sjyDGBJkiRJkiTpRVbBqgxqlgj2X50wKYOGKSRJkkaWK4AlSZIkSZKkF1gNhzj5GyeHs538lSRJKgcngCVJkiRJkqQXyOEMK0R5MIPrzCBJklQOTgBLkiRJkiRJfVbCQcDbLRHlnBr0mEGSJKkcnACWJEmSJEmS+rTAmVaI8thm+KoZJEmSSnVNK0mSJEmSJKkOHcC7LRHlvGmwwQySJEnl4QSwJEmSJEmSVPh3IDNDsCfGwqVmkCRJKhcngCVJkiRJktT0umEf4P2WiLJoEjxrBkmSpHJxAliSJEmSJElNL4fP4ndlMZ4ZDReZQZIkqXy8qJUkSZIkSVJTq8OEHA63RJRL9oP/MYMkSVL5OAEsSZIkSZKkppbBGUCbJYJtBBabQZIkqZycAJYkSZIkSVLTWgl75nCkJaJcWoPfmUGSJKmcnACWJEmSJElS08pgFjDaEsF6WmChGSRJksrLCWBJkiRJkiQ1pRWwewZHWyLK1zrgATNIkiSVlxPAkiRJkiRJakqtMBMYa4lgvb0wzwySJEnllplAkiRJkiRJzWY57DYafguMs0awr9fgn8wgSZJUbq4AliRJkiRJUtMZDSfh5G+MHDjHDJIkSeXnCmBJkiRJkiQ1lVthXHtxju2u1giTwXc64VBLSJIklZ8rgCVJkiRJktRU2uGTOPkbpRfOtYIkSVIaXAEsSZIkSZKkprEM2sfBOmAPa4TJ4Med8B5LSJIkpcEVwJIkSZIkSWoa4+BYnPyNksPZVpAkSUqHK4AlSZIkSZLUFOowCrgP2MsawW6rwVQzSJIkpcMVwJIkSZIkSWoKGRyFk7+xPm8CSZKk5K57JUmSJEmSpGpbCq17w73ARGsEu6MTJmeQm0KSJCkdrgCWJEmSJElS5U2AI3DyN9ZZTv5KkiSlxwlgSZIkSZIkVVoOWQ6zLRHl/nVwgxkkSZLS4wSwJEmSJEmSKq0bDgP2tUS4DM6aAb2WkCRJSo8TwJIkSZIkSaq0BsyxQpSH2uFaM0iSJKXJCWBJkiRJkiRV1mo4JIOaJaLMnQSbzSBJkpQmJ4AlSZIkSZJUWTmcYYUov98MV5pBkiQpXU4AS5IkSZIkqZJWwkHA2y0RLoMF02CDJSRJktLlBLAkSZIkSZIqqQXOtEKUJzfAEjNIkiQlfx0sSZIkSZIkVUsdOoB3WyJcBosPhPWWkCRJSpsTwJIkSZIkSaqifwcyMwR7LoeLzSBJkpQ+J4AlSZIkSZJUKd2wD/B+S4TL4OIa/NESkiRJ6XMCWJIkSZIkSZWSw2fxe68YGzNYZAZJkqRq8EJYkiRJkiRJlVGHCTkcbolwOVzeAY9aQpIkqRqcAJYkSZIkSVJlZHAG0GaJYD1tMN8MkiRJ1eEEsCRJkiRJkiphJeyZw5GWCJfD1ZPht5aQJEmqDieAJUmSJEmSVAkZzAJGWyJYAzjXDJIkSZW7LpYkSZIkSZLStgJ2b4PfAGOtEWxpDf7RDJIkSdXiCmBJkiRJkiQlrxVm4uRvLFf/SpIkVZArgCVJkiRJkpS05bDb6OIc23HWCPa9GrzfDJIkSdXjCmBJkiRJkiQlbTSchJO/UXKYawVJkqRqcgWwJEmSJEmSknUrjGuHB4BdrRFsWQ3+PzNIkiRVkyuAJUmSJEmSlKx2+CRO/kZpgbOsIEmSVF2uAJYkSZIkSVKSlkH7OFgH7GGNYCtrcIAZJEmSqssVwJIkSZIkSUrSODgWJ3+j5K7+lSRJqjxXAEuSJEmSJCk5dRgF3AfsZY1gv+qEt2TQMIUkSVJ1uQJYkiRJkiRJycngKJz8jZLD5538lSRJqj4ngCVJkiRJkpSUpdCaw2mWiLL2WbjeDJIkSdXnBLAkSZIkSZKSMgGOACZaIlwO50yHLZaQJEmqPieAJUmSJEmSlIwcshxmWyLKwzvBVWaQJElqDk4AS5IkSZIkKRndcBiwryWizJsEm80gSZLUHJwAliRJkiRJUjIaMMcKUR4HLjeDJElS83ACWJIkSZIkSUlYDYdkULNElIU1eN4MkiRJzcMJYEmSJEmSJCUhhzOsEOVpYIkZJEmSmosTwJIkSZIkSSq9lXAQ8HZLRFlcKyaBJUmS1EScAJYkSZIkSVLptcCZVojyXAtcaAZJkqSmvHaWJEmSJEmSyqsOHcC7LRFlSQf8wQySJEnNxwlgSZIkSZIkld2/A5kZgm1qgYVmkCRJak5OAEuSJEmSJKm0umEf4P2WiHJlBzxqBkmSpObkBLAkSZIkSZJKK4fP4ndYMXozWGAGSZKk5uXFsyRJkiRJkkqpDhNyONwSUa7phPvNIEmS1LycAJYkSZIkSVIpZXAG0GaJYI0GzDODJElS019HS5IkSZIkSeWyEvZsKVayjrZGsOtr8A9mkCRJam6uAJYkSZIkSVLpZDALJ3+jtMC5VpAkSZIrgCVJkiRJklQqK2D3NvgNMNYaYTK4sRPeawlJkiS5AliSJEmSJEml0gozcfI3Sg5nW0GSJEngCmBJkiRJkiSVyHLYbTT8FhhnjTAZ/LQT3mkJSZIkgSuAJUmSJEmSVCKj4SSc/I3i6l9JkiS9kCuAJUmSJEmSVAorYHxbsfp3V2sEW9MJnRnkppAkSRK4AliSJEmSJEkl0QbH4+RvrM85+StJkqQXcgWwJEmSJEmSRtwyaB8H64A9rBHs3k7YN4OGKSRJkvQnrgCWJEmSJEnSiBsHx+Lkb5QMznLyV5IkSVu5TpQkSZIkSZJGTh1GAfcBe1kj2Lr18MbpsMUUkiRJeiFXAEuSJEmSJGlEZXAUTv7GNpvr5K8kSZL6uVaUJEmSJEmSRsZSaN0b7gUmWiPYw7vAGybCJlNIkiTpxVwBLEmSJEmSpBEzAY7Ayd8oGSxw8leSJEn9cQJYkiRJkiRJIyKHLIfZlojyRDtcZgZJkiT1xwlgSZIkSZIkjYhuOAzY1xLhMlg4CZ61hCRJkvrTZgJJkiRJkiSNhBxuGg27WSLcE7DeCpIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZIkSZKkpvX/AC3AB1hemT1TAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDI0LTA3LTA5VDE4OjUwOjI5KzAwOjAwpp6skAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyNC0wNy0wOVQxODo1MDoyOSswMDowMNfDFCwAAAAASUVORK5CYII=) center/140px no-repeat}.logo-text{font-size:18px;font-weight:700;color:var(--text-dark);letter-spacing:-.2px}.logo-text span{font-size:9px;margin-left:4px}.alert{margin:0;padding:10px 12px;border-radius:8px;font-size:13px;line-height:1.4}.error{background:var(--avaya-red-light);color:#b5000c;border:1px solid #f5b3b8}.form{display:flex;flex-direction:column;gap:12px}.field{width:100%;--mdc-outlined-text-field-outline-color: #e0e0e0;--mdc-outlined-text-field-focus-outline-color: var(--avaya-red);--mdc-outlined-text-field-hover-outline-color: var(--avaya-red);--mdc-outlined-text-field-container-fill-color: transparent;--mdc-outlined-text-field-input-text-color: var(--text-dark);--mdc-outlined-text-field-label-text-color: var(--text-muted);--mdc-outlined-text-field-input-text-placeholder-color: var(--text-muted)}.field .mdc-text-field__input{font-size:14px}.btn{width:100%;height:46px;border:none;border-radius:10px;background:var(--avaya-red);color:#fff;font-weight:700;font-size:15px;cursor:pointer;transition:transform .12s ease,box-shadow .12s ease;box-shadow:0 8px 18px #e3000f4d;display:inline-flex;align-items:center;justify-content:center}.btn:disabled{opacity:.7;cursor:default}.btn:active:not(:disabled){transform:translateY(1px)}.spinner{display:inline-block;width:16px;height:16px;border-radius:50%;border:3px solid #fff;border-top-color:#fff6;animation:spin 1s linear infinite}.footnote{font-size:13px;color:var(--text-muted);text-align:center}.footnote a{color:var(--avaya-red);font-weight:700;text-decoration:none;margin-left:4px}.login-background{background:transparent;padding:0;min-height:100vh;display:flex;align-items:center;justify-content:center}@keyframes spin{to{transform:rotate(360deg)}}\n"] }]
|
|
2324
|
+
args: [{ selector: 'app-avaya-ipo-login', standalone: false, template: "<div class=\"avaya-ipo-login-background\">\n <div class=\"avaya-ipo-login-simple\">\n <div class=\"avaya-ipo-logo\">\n <div class=\"avaya-ipo-logo-img\"></div>\n <div class=\"avaya-ipo-logo-text\">IP Office<span>TM</span></div>\n </div>\n\n @if (hasAvayaSocketError || hasAvayaLoginError || hasAvayaLoginFailedGeneral || hasAvayaLoginConflictError || hasAvayaDeviceError) {\n <p class=\"avaya-ipo-alert avaya-ipo-error\">\n @if (hasAvayaSocketError) { Connection issue detected. }\n @if (hasAvayaLoginError) { Invalid extension or password. }\n @if (hasAvayaLoginFailedGeneral) { Something went wrong. Please try again. }\n @if (hasAvayaLoginConflictError) { Another user is logged in with this extension. }\n @if (hasAvayaDeviceError) { Device access error. }\n </p>\n }\n\n <form [formGroup]=\"loginForm\" (ngSubmit)=\"onLoginClick()\" class=\"avaya-ipo-form\" autocomplete=\"off\">\n <mat-form-field appearance=\"outline\" class=\"avaya-ipo-field\">\n <mat-label>Extension</mat-label>\n <input matInput formControlName=\"ipoExtensionNo\" autocomplete=\"off\" autocapitalize=\"off\" autocorrect=\"off\"\n spellcheck=\"false\" (keypress)=\"restrictNumeric($event)\" />\n <mat-icon matPrefix>call</mat-icon>\n @if (loginForm.controls['ipoExtensionNo'].invalid && loginForm.controls['ipoExtensionNo'].touched) {\n <mat-error>\n @if (loginForm.controls['ipoExtensionNo'].errors?.['required']) {\n <small>Extension is required.</small>\n }\n </mat-error>\n }\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"avaya-ipo-field\">\n <mat-label>Password</mat-label>\n <input matInput formControlName=\"ipoPassword\" autocomplete=\"off\" autocapitalize=\"off\" autocorrect=\"off\"\n spellcheck=\"false\"\n (keypress)=\"restrictNumeric($event)\" [type]=\"showLoginPassword ? 'text' : 'password'\" />\n <mat-icon matPrefix>lock</mat-icon>\n <button mat-icon-button matSuffix type=\"button\"\n (click)=\"showLoginPassword = !showLoginPassword && !hasAvayaSocketError\">\n <mat-icon>{{ showLoginPassword ? 'visibility_off' : 'visibility' }}</mat-icon>\n </button>\n @if (loginForm.controls['ipoPassword'].invalid && loginForm.controls['ipoPassword'].touched) {\n <mat-error>\n @if (loginForm.controls['ipoPassword'].errors?.['required']) {\n <small>Password is required.</small>\n }\n </mat-error>\n }\n </mat-form-field>\n\n <button type=\"submit\" class=\"avaya-ipo-btn\" [disabled]=\"showLoginLoader\">\n @if (showLoginLoader) { <span class=\"avaya-ipo-spinner\"></span> } @else { <span>Login</span> }\n </button>\n </form>\n\n</div>\n</div>\n", styles: [":host{display:block;width:100%;max-width:100%;margin:0;font-family:Open Sans,Helvetica Neue,Arial,sans-serif}.avaya-ipo-login-simple{width:100%;padding:24px 18px 32px;background:transparent;border-radius:0;box-shadow:none;display:flex;flex-direction:column;gap:16px;box-sizing:border-box}.avaya-ipo-logo{display:flex;flex-direction:column;align-items:center;gap:6px;margin-bottom:4px}.avaya-ipo-logo-img{width:140px;height:40px;background:url(data:image/png;base64,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) center/140px no-repeat}.avaya-ipo-logo-text{font-size:18px;font-weight:700;color:var(--sd-text);letter-spacing:-.2px}.avaya-ipo-logo-text span{font-size:9px;margin-left:4px}.avaya-ipo-alert{margin:0;padding:10px 12px;border-radius:var(--sd-radius-sm);font-size:13px;line-height:1.4}.avaya-ipo-error{background:var(--sd-accent-soft);color:var(--sd-call-end);border:1px solid var(--sd-call-end)}.avaya-ipo-form{display:flex;flex-direction:column;gap:12px}.avaya-ipo-field{width:100%;--mdc-outlined-text-field-outline-color: var(--sd-input-border);--mdc-outlined-text-field-focus-outline-color: var(--sd-accent);--mdc-outlined-text-field-hover-outline-color: var(--sd-accent);--mdc-outlined-text-field-container-fill-color: var(--sd-input);--mdc-outlined-text-field-input-text-color: var(--sd-text);--mdc-outlined-text-field-label-text-color: var(--sd-text-muted);--mdc-outlined-text-field-input-text-placeholder-color: var(--sd-text-subtle)}.avaya-ipo-field .mdc-text-field__input{font-size:14px}.avaya-ipo-btn{width:100%;height:46px;border:none;border-radius:var(--sd-radius);background:var(--sd-accent);color:var(--sd-accent-contrast);font-weight:600;font-size:15px;cursor:pointer;transition:transform .12s ease,box-shadow .12s ease,background .12s ease;box-shadow:var(--sd-shadow-md);display:inline-flex;align-items:center;justify-content:center}.avaya-ipo-btn:hover:not(:disabled){background:var(--sd-accent-strong)}.avaya-ipo-btn:focus-visible{outline:none;box-shadow:var(--sd-focus-ring)}.avaya-ipo-btn:disabled{opacity:.7;cursor:default}.avaya-ipo-btn:active:not(:disabled){transform:translateY(1px)}.avaya-ipo-spinner{display:inline-block;width:16px;height:16px;border-radius:50%;border:3px solid var(--sd-accent-contrast);border-top-color:#fff6;animation:spin 1s linear infinite}.avaya-ipo-footnote{font-size:13px;color:var(--sd-text-muted);text-align:center}.avaya-ipo-footnote a{color:var(--sd-accent);font-weight:600;text-decoration:none;margin-left:4px}.avaya-ipo-login-background{background:transparent;padding:0;min-height:100%;display:flex;align-items:center;justify-content:center}:host-context(.avaya-ipo-mode-standalone) .avaya-ipo-login-background{min-height:100dvh}@keyframes spin{to{transform:rotate(360deg)}}\n"] }]
|
|
2125
2325
|
}], propDecorators: { loginForm: [{
|
|
2126
2326
|
type: Input
|
|
2127
2327
|
}], showLoginLoader: [{
|
|
@@ -2145,13 +2345,47 @@ class RecordingManagerService {
|
|
|
2145
2345
|
sessions = new Map();
|
|
2146
2346
|
MIME_TYPE_PREFERRED = 'audio/webm;codecs=opus';
|
|
2147
2347
|
MIME_TYPE_FALLBACK = 'audio/webm';
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
|
|
2348
|
+
// Record one continuous file for the whole call; a timeslice just flushes data periodically so the
|
|
2349
|
+
// final Blob is complete. In 'complete' mode the full recording is uploaded once at call end; in
|
|
2350
|
+
// 'chunked' mode each timeslice is also streamed live over the recording WebSocket so the backend
|
|
2351
|
+
// can stitch a file even if this tab dies mid-call.
|
|
2352
|
+
TIMESLICE_MS = 1000;
|
|
2353
|
+
// API Gateway WebSockets enforce a 32 KB FRAME limit — oversized frames kill the connection (1009).
|
|
2354
|
+
// Three-second slices at a capped bitrate stay comfortably under it; anything bigger is split into
|
|
2355
|
+
// frame-safe segments before sending (see MAX_WS_DATA_CHARS).
|
|
2356
|
+
CHUNKED_TIMESLICE_MS = 3000;
|
|
2357
|
+
// Opus voice at 32 kbps is transparent for calls and keeps a 3s slice ≈ 12 KB raw / 16 KB base64.
|
|
2358
|
+
CHUNKED_AUDIO_BPS = 32000;
|
|
2359
|
+
// Base64 payload cap per websocket message (multiple of 4 so each slice decodes independently);
|
|
2360
|
+
// leaves ample headroom inside the 32 KB frame limit including the JSON envelope.
|
|
2361
|
+
MAX_WS_DATA_CHARS = 24000;
|
|
2362
|
+
AUDIO_CONTEXT_CLOSE_DELAY_MS = 500;
|
|
2363
|
+
SOCKET_RECONNECT_DELAY_MS = 3000;
|
|
2364
|
+
// Pause between the last flushed chunk and the call-completed message: chunk messages invoke the
|
|
2365
|
+
// backend Lambda concurrently, so the final parts may still be mid-write to S3 when the stitch
|
|
2366
|
+
// would otherwise run. This settle window lets them land first.
|
|
2367
|
+
CALL_COMPLETED_DELAY_MS = 2000;
|
|
2368
|
+
// Stop redialing a broken socket after this many consecutive failures — the in-memory chunks and
|
|
2369
|
+
// the REST fallback still save the recording at call end, so endless connection spam buys nothing.
|
|
2370
|
+
SOCKET_MAX_RECONNECT_ATTEMPTS = 10;
|
|
2371
|
+
// Give the final flush + call-completed message a moment before force-closing the socket.
|
|
2372
|
+
SOCKET_FINALIZE_GRACE_MS = 1500;
|
|
2373
|
+
RECORDING_API_URL = APP_CONFIG.INTERACTION_CALL_RECORDING_API_URL;
|
|
2374
|
+
RECORDING_WS_URL = APP_CONFIG.RECORDING_SOCKET_WS_URL;
|
|
2151
2375
|
constructor(http) {
|
|
2152
2376
|
this.http = http;
|
|
2153
2377
|
}
|
|
2154
|
-
startRecording(localMediaStream, remoteMediaStream, metadata) {
|
|
2378
|
+
startRecording(localMediaStream, remoteMediaStream, metadata, mode = APP_CONFIG.RECORDING_UPLOAD_MODE) {
|
|
2379
|
+
// Restart for the SAME call in chunked mode (e.g. remote stream arrived late, or the call
|
|
2380
|
+
// re-fired CONNECTED): keep the session — one socket and one seq counter per call — and only
|
|
2381
|
+
// swap the audio plumbing. Tearing down would open a second socket and prematurely finalize.
|
|
2382
|
+
const existing = this.sessions.get(metadata.callId);
|
|
2383
|
+
if (existing && existing.mode === 'chunked' && mode === 'chunked' && !existing.stopping) {
|
|
2384
|
+
if (localMediaStream && remoteMediaStream) {
|
|
2385
|
+
return this.rebindMedia(existing, localMediaStream, remoteMediaStream);
|
|
2386
|
+
}
|
|
2387
|
+
return existing;
|
|
2388
|
+
}
|
|
2155
2389
|
this.stopRecording(metadata.callId);
|
|
2156
2390
|
if (!localMediaStream || !remoteMediaStream) {
|
|
2157
2391
|
console.warn(`[${metadata.callId}] Skipped start recording: missing remote or local stream`);
|
|
@@ -2166,23 +2400,62 @@ class RecordingManagerService {
|
|
|
2166
2400
|
}
|
|
2167
2401
|
const audioContext = new AudioContext();
|
|
2168
2402
|
const recordingStream = audioContext.createMediaStreamDestination();
|
|
2169
|
-
audioContext
|
|
2170
|
-
|
|
2171
|
-
|
|
2172
|
-
|
|
2173
|
-
|
|
2174
|
-
.
|
|
2403
|
+
const localSource = audioContext.createMediaStreamSource(localMediaStream);
|
|
2404
|
+
localSource.connect(recordingStream);
|
|
2405
|
+
const remoteSource = audioContext.createMediaStreamSource(remoteMediaStream);
|
|
2406
|
+
remoteSource.connect(recordingStream);
|
|
2407
|
+
const mimeType = MediaRecorder.isTypeSupported(this.MIME_TYPE_PREFERRED)
|
|
2408
|
+
? this.MIME_TYPE_PREFERRED
|
|
2409
|
+
: this.MIME_TYPE_FALLBACK;
|
|
2175
2410
|
const session = {
|
|
2176
2411
|
audioContext,
|
|
2177
2412
|
recordingStream,
|
|
2178
2413
|
metadata,
|
|
2179
2414
|
stopping: false,
|
|
2180
|
-
|
|
2415
|
+
chunks: [],
|
|
2181
2416
|
recorder: null,
|
|
2182
|
-
|
|
2417
|
+
mimeType,
|
|
2418
|
+
uploaded: false,
|
|
2419
|
+
mode,
|
|
2420
|
+
socket: null,
|
|
2421
|
+
seq: 0,
|
|
2422
|
+
pendingChunks: [],
|
|
2423
|
+
sentAny: false,
|
|
2424
|
+
reconnectAttempts: 0,
|
|
2425
|
+
sourceNodes: [localSource, remoteSource],
|
|
2426
|
+
streamCursor: 0,
|
|
2427
|
+
pumping: false,
|
|
2428
|
+
everConnected: false,
|
|
2429
|
+
completedSent: false,
|
|
2183
2430
|
};
|
|
2184
2431
|
this.sessions.set(metadata.callId, session);
|
|
2185
|
-
|
|
2432
|
+
if (mode === 'chunked') {
|
|
2433
|
+
this.openRecordingSocket(session);
|
|
2434
|
+
}
|
|
2435
|
+
const recorder = new MediaRecorder(recordingStream.stream, mode === 'chunked'
|
|
2436
|
+
? { mimeType, audioBitsPerSecond: this.CHUNKED_AUDIO_BPS }
|
|
2437
|
+
: { mimeType });
|
|
2438
|
+
session.recorder = recorder;
|
|
2439
|
+
recorder.ondataavailable = (evt) => {
|
|
2440
|
+
if (evt.data && evt.data.size > 0) {
|
|
2441
|
+
// Keep the local copy in BOTH modes: it's the upload source in 'complete' mode and the
|
|
2442
|
+
// fallback in 'chunked' mode if the socket never works.
|
|
2443
|
+
session.chunks.push(evt.data);
|
|
2444
|
+
if (session.mode === 'chunked') {
|
|
2445
|
+
// The pump streams chunks strictly in order from session.chunks — it also lets a
|
|
2446
|
+
// reconnect rewind and re-send the whole call (the backend deletes parts on every close).
|
|
2447
|
+
void this.pumpChunks(session);
|
|
2448
|
+
}
|
|
2449
|
+
}
|
|
2450
|
+
};
|
|
2451
|
+
recorder.onerror = (err) => {
|
|
2452
|
+
console.error(`[${metadata.callId}] MediaRecorder error:`, err);
|
|
2453
|
+
};
|
|
2454
|
+
recorder.onstop = () => {
|
|
2455
|
+
void this.finalizeRecording(session);
|
|
2456
|
+
};
|
|
2457
|
+
recorder.start(mode === 'chunked' ? this.CHUNKED_TIMESLICE_MS : this.TIMESLICE_MS);
|
|
2458
|
+
console.debug(`[${metadata.callId}] MediaRecorder started (${mode} mode)`);
|
|
2186
2459
|
return session;
|
|
2187
2460
|
}
|
|
2188
2461
|
getSession(callId) {
|
|
@@ -2193,17 +2466,18 @@ class RecordingManagerService {
|
|
|
2193
2466
|
if (!session)
|
|
2194
2467
|
return;
|
|
2195
2468
|
session.stopping = true;
|
|
2196
|
-
if (session.chunkTimer) {
|
|
2197
|
-
clearTimeout(session.chunkTimer);
|
|
2198
|
-
session.chunkTimer = undefined;
|
|
2199
|
-
}
|
|
2200
2469
|
const rec = session.recorder;
|
|
2201
|
-
if (rec && rec.state
|
|
2470
|
+
if (rec && rec.state !== 'inactive') {
|
|
2202
2471
|
try {
|
|
2203
|
-
rec.stop();
|
|
2472
|
+
rec.stop(); // flushes final data, then onstop -> finalizeRecording (uploads)
|
|
2204
2473
|
console.debug(`[${callId}] MediaRecorder stopped`);
|
|
2205
2474
|
}
|
|
2206
|
-
catch {
|
|
2475
|
+
catch {
|
|
2476
|
+
void this.finalizeRecording(session);
|
|
2477
|
+
}
|
|
2478
|
+
}
|
|
2479
|
+
else {
|
|
2480
|
+
void this.finalizeRecording(session);
|
|
2207
2481
|
}
|
|
2208
2482
|
setTimeout(() => {
|
|
2209
2483
|
if (session.audioContext.state !== 'closed') {
|
|
@@ -2213,71 +2487,275 @@ class RecordingManagerService {
|
|
|
2213
2487
|
}, this.AUDIO_CONTEXT_CLOSE_DELAY_MS);
|
|
2214
2488
|
this.sessions.delete(callId);
|
|
2215
2489
|
}
|
|
2216
|
-
|
|
2217
|
-
if (session.
|
|
2490
|
+
async finalizeRecording(session) {
|
|
2491
|
+
if (session.uploaded)
|
|
2218
2492
|
return;
|
|
2219
|
-
|
|
2220
|
-
|
|
2221
|
-
|
|
2222
|
-
|
|
2223
|
-
|
|
2224
|
-
|
|
2225
|
-
|
|
2226
|
-
|
|
2227
|
-
|
|
2228
|
-
|
|
2493
|
+
session.uploaded = true;
|
|
2494
|
+
if (session.mode === 'chunked') {
|
|
2495
|
+
await this.finalizeChunked(session);
|
|
2496
|
+
return;
|
|
2497
|
+
}
|
|
2498
|
+
if (!session.chunks.length) {
|
|
2499
|
+
console.warn(`[${session.metadata.callId}] No recording data captured`);
|
|
2500
|
+
return;
|
|
2501
|
+
}
|
|
2502
|
+
const blob = new Blob(session.chunks, { type: session.mimeType });
|
|
2503
|
+
session.chunks = [];
|
|
2504
|
+
const filename = this.generateFilename(session.metadata.callId, session.metadata.agentId, session.mimeType);
|
|
2505
|
+
try {
|
|
2506
|
+
await this.uploadCallRecording(session.metadata, blob, filename, session.mimeType);
|
|
2507
|
+
console.debug(`[${session.metadata.callId}] ✅ uploaded recording -> ${filename}`);
|
|
2508
|
+
}
|
|
2509
|
+
catch (err) {
|
|
2510
|
+
console.error(`[${session.metadata.callId}] ❌ recording upload failed`, err);
|
|
2511
|
+
}
|
|
2512
|
+
}
|
|
2513
|
+
// ── Chunked mode: stream slices over the recording WebSocket ─────────────────────────────────
|
|
2514
|
+
/**
|
|
2515
|
+
* Rewire fresh local/remote streams into the SAME recording destination. The MediaRecorder (and
|
|
2516
|
+
* therefore the single WebM byte stream, the socket and the seq counter) continue uninterrupted —
|
|
2517
|
+
* restarting the recorder would inject a second WebM header mid-file and break playback of the
|
|
2518
|
+
* stitched recording.
|
|
2519
|
+
*/
|
|
2520
|
+
rebindMedia(session, localMediaStream, remoteMediaStream) {
|
|
2521
|
+
const { callId } = session.metadata;
|
|
2522
|
+
console.debug(`[${callId}] Rewiring recording sources (recorder, socket and seq preserved)`);
|
|
2523
|
+
for (const node of session.sourceNodes) {
|
|
2229
2524
|
try {
|
|
2230
|
-
|
|
2231
|
-
console.debug(`[${session.metadata.callId}] ✅ uploaded chunk -> ${filename}`);
|
|
2525
|
+
node.disconnect();
|
|
2232
2526
|
}
|
|
2233
|
-
catch
|
|
2234
|
-
|
|
2527
|
+
catch { /* already disconnected */ }
|
|
2528
|
+
}
|
|
2529
|
+
const ctx = session.audioContext;
|
|
2530
|
+
if (ctx.state === 'suspended') {
|
|
2531
|
+
void ctx.resume();
|
|
2532
|
+
}
|
|
2533
|
+
const localSource = ctx.createMediaStreamSource(localMediaStream);
|
|
2534
|
+
localSource.connect(session.recordingStream);
|
|
2535
|
+
const remoteSource = ctx.createMediaStreamSource(remoteMediaStream);
|
|
2536
|
+
remoteSource.connect(session.recordingStream);
|
|
2537
|
+
session.sourceNodes = [localSource, remoteSource];
|
|
2538
|
+
return session;
|
|
2539
|
+
}
|
|
2540
|
+
openRecordingSocket(session) {
|
|
2541
|
+
const { metadata } = session;
|
|
2542
|
+
// One socket per call: never open a second connection while one is open or still connecting.
|
|
2543
|
+
if (session.socket &&
|
|
2544
|
+
(session.socket.readyState === WebSocket.OPEN ||
|
|
2545
|
+
session.socket.readyState === WebSocket.CONNECTING)) {
|
|
2546
|
+
return;
|
|
2547
|
+
}
|
|
2548
|
+
if (session.reconnectTimer) {
|
|
2549
|
+
clearTimeout(session.reconnectTimer);
|
|
2550
|
+
session.reconnectTimer = undefined;
|
|
2551
|
+
}
|
|
2552
|
+
const token = (typeof sessionStorage !== 'undefined' && sessionStorage.getItem('auth_sessionToken')) || '';
|
|
2553
|
+
const url = `${this.RECORDING_WS_URL}?` +
|
|
2554
|
+
`token=${encodeURIComponent(token)}` +
|
|
2555
|
+
`&callId=${encodeURIComponent(metadata.callId)}` +
|
|
2556
|
+
`&tenantId=${encodeURIComponent(metadata.tenantId)}` +
|
|
2557
|
+
(metadata.entityId ? `&entityId=${encodeURIComponent(metadata.entityId)}` : '') +
|
|
2558
|
+
`&contentType=${encodeURIComponent(session.mimeType)}`;
|
|
2559
|
+
console.debug(`[${metadata.callId}] Opening recording socket (entityId=${metadata.entityId || 'NONE — chunks will land under the NIL entity folder'})`);
|
|
2560
|
+
try {
|
|
2561
|
+
const socket = new WebSocket(url);
|
|
2562
|
+
session.socket = socket;
|
|
2563
|
+
socket.onopen = () => {
|
|
2564
|
+
session.reconnectAttempts = 0;
|
|
2565
|
+
if (session.everConnected) {
|
|
2566
|
+
// Reconnect after a drop: the backend stitched AND deleted the parts on $disconnect, so
|
|
2567
|
+
// rewind and re-stream the entire call from memory — the next stitch then has everything.
|
|
2568
|
+
console.debug(`[${metadata.callId}] Recording socket reconnected — re-streaming ${session.chunks.length} slices`);
|
|
2569
|
+
session.streamCursor = 0;
|
|
2570
|
+
session.seq = 0;
|
|
2571
|
+
session.pendingChunks = [];
|
|
2572
|
+
void this.pumpChunks(session);
|
|
2573
|
+
}
|
|
2574
|
+
else {
|
|
2575
|
+
console.debug(`[${metadata.callId}] Recording socket connected`);
|
|
2576
|
+
session.everConnected = true;
|
|
2577
|
+
this.flushPendingChunks(session);
|
|
2578
|
+
void this.pumpChunks(session);
|
|
2579
|
+
}
|
|
2580
|
+
};
|
|
2581
|
+
socket.onerror = (err) => {
|
|
2582
|
+
console.warn(`[${metadata.callId}] Recording socket error`, err);
|
|
2583
|
+
};
|
|
2584
|
+
socket.onclose = () => {
|
|
2585
|
+
// Ignore close events from sockets we've already replaced — only the current one counts.
|
|
2586
|
+
if (session.socket !== socket) {
|
|
2587
|
+
return;
|
|
2588
|
+
}
|
|
2589
|
+
session.socket = null;
|
|
2590
|
+
// Reconnect while the call is still recording — the backend stitches on every close, so a
|
|
2591
|
+
// blip costs nothing; the next close re-stitches the fuller file.
|
|
2592
|
+
if (!session.stopping && this.sessions.get(metadata.callId) === session) {
|
|
2593
|
+
session.reconnectAttempts += 1;
|
|
2594
|
+
if (session.reconnectAttempts > this.SOCKET_MAX_RECONNECT_ATTEMPTS) {
|
|
2595
|
+
console.warn(`[${metadata.callId}] Recording socket gave up after ${this.SOCKET_MAX_RECONNECT_ATTEMPTS} attempts; ` +
|
|
2596
|
+
`recording continues in memory and uploads at call end`);
|
|
2597
|
+
return;
|
|
2598
|
+
}
|
|
2599
|
+
if (session.reconnectTimer) {
|
|
2600
|
+
clearTimeout(session.reconnectTimer);
|
|
2601
|
+
}
|
|
2602
|
+
session.reconnectTimer = setTimeout(() => this.openRecordingSocket(session), this.SOCKET_RECONNECT_DELAY_MS);
|
|
2603
|
+
}
|
|
2604
|
+
};
|
|
2605
|
+
}
|
|
2606
|
+
catch (err) {
|
|
2607
|
+
console.warn(`[${metadata.callId}] Failed to open recording socket`, err);
|
|
2608
|
+
session.socket = null;
|
|
2609
|
+
}
|
|
2610
|
+
}
|
|
2611
|
+
/** Stream session.chunks in strict order; safe to call repeatedly (single active pump). */
|
|
2612
|
+
async pumpChunks(session) {
|
|
2613
|
+
if (session.pumping || session.completedSent) {
|
|
2614
|
+
return;
|
|
2615
|
+
}
|
|
2616
|
+
session.pumping = true;
|
|
2617
|
+
try {
|
|
2618
|
+
while (session.streamCursor < session.chunks.length && !session.completedSent) {
|
|
2619
|
+
const blob = session.chunks[session.streamCursor];
|
|
2620
|
+
session.streamCursor += 1;
|
|
2621
|
+
await this.streamChunk(session, blob);
|
|
2235
2622
|
}
|
|
2236
|
-
}
|
|
2237
|
-
|
|
2238
|
-
|
|
2239
|
-
}
|
|
2240
|
-
|
|
2241
|
-
|
|
2623
|
+
}
|
|
2624
|
+
finally {
|
|
2625
|
+
session.pumping = false;
|
|
2626
|
+
}
|
|
2627
|
+
}
|
|
2628
|
+
async streamChunk(session, chunk) {
|
|
2629
|
+
if (session.completedSent) {
|
|
2630
|
+
// Never send chunks after call-completed: the backend has already stitched and retired the
|
|
2631
|
+
// connection; a straggler would just become an orphaned part.
|
|
2632
|
+
return;
|
|
2633
|
+
}
|
|
2634
|
+
try {
|
|
2635
|
+
const dataUrl = await this.convertBlobToBase64(chunk);
|
|
2636
|
+
const data = dataUrl.split(',')[1] || '';
|
|
2637
|
+
if (!data)
|
|
2242
2638
|
return;
|
|
2243
|
-
|
|
2244
|
-
|
|
2245
|
-
|
|
2246
|
-
|
|
2247
|
-
|
|
2248
|
-
|
|
2249
|
-
|
|
2250
|
-
|
|
2639
|
+
// Split into frame-safe segments: API Gateway kills connections on frames > 32 KB. Slicing
|
|
2640
|
+
// base64 at 4-char boundaries keeps every segment independently decodable, and each segment
|
|
2641
|
+
// carries its own seq — server-side concatenation in seq order reproduces the exact bytes.
|
|
2642
|
+
for (let i = 0; i < data.length; i += this.MAX_WS_DATA_CHARS) {
|
|
2643
|
+
const segment = data.slice(i, i + this.MAX_WS_DATA_CHARS);
|
|
2644
|
+
session.seq += 1;
|
|
2645
|
+
const message = JSON.stringify({ action: 'chunk', seq: session.seq, data: segment });
|
|
2646
|
+
if (session.socket && session.socket.readyState === WebSocket.OPEN) {
|
|
2647
|
+
session.socket.send(message);
|
|
2648
|
+
session.sentAny = true;
|
|
2649
|
+
}
|
|
2650
|
+
else {
|
|
2651
|
+
// Socket down — keep the message (seq already assigned, so order survives a reconnect).
|
|
2652
|
+
session.pendingChunks.push(message);
|
|
2653
|
+
}
|
|
2251
2654
|
}
|
|
2252
|
-
}
|
|
2655
|
+
}
|
|
2656
|
+
catch (err) {
|
|
2657
|
+
console.warn(`[${session.metadata.callId}] Failed to stream recording chunk`, err);
|
|
2658
|
+
}
|
|
2253
2659
|
}
|
|
2254
|
-
|
|
2255
|
-
|
|
2256
|
-
|
|
2257
|
-
|
|
2660
|
+
flushPendingChunks(session) {
|
|
2661
|
+
if (!session.socket || session.socket.readyState !== WebSocket.OPEN)
|
|
2662
|
+
return;
|
|
2663
|
+
while (session.pendingChunks.length) {
|
|
2664
|
+
session.socket.send(session.pendingChunks.shift());
|
|
2665
|
+
session.sentAny = true;
|
|
2666
|
+
}
|
|
2667
|
+
}
|
|
2668
|
+
async finalizeChunked(session) {
|
|
2669
|
+
const { metadata } = session;
|
|
2670
|
+
if (session.reconnectTimer) {
|
|
2671
|
+
clearTimeout(session.reconnectTimer);
|
|
2672
|
+
session.reconnectTimer = undefined;
|
|
2673
|
+
}
|
|
2674
|
+
// Wait (briefly) for the pump to drain so the call's tail audio is part of the stitch.
|
|
2675
|
+
const drainDeadline = Date.now() + 2000;
|
|
2676
|
+
while ((session.pumping || session.streamCursor < session.chunks.length) &&
|
|
2677
|
+
Date.now() < drainDeadline) {
|
|
2678
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
2679
|
+
}
|
|
2680
|
+
const socket = session.socket;
|
|
2681
|
+
if (socket && socket.readyState === WebSocket.OPEN) {
|
|
2682
|
+
try {
|
|
2683
|
+
this.flushPendingChunks(session);
|
|
2684
|
+
session.completedSent = true; // no further chunks may be queued from here on
|
|
2685
|
+
// Let the already-sent chunk writes settle server-side before asking for the stitch.
|
|
2686
|
+
await new Promise((resolve) => setTimeout(resolve, this.CALL_COMPLETED_DELAY_MS));
|
|
2687
|
+
socket.send(JSON.stringify({ action: 'call-completed' }));
|
|
2688
|
+
console.debug(`[${metadata.callId}] ✅ recording finalized over socket (${session.seq} chunks)`);
|
|
2689
|
+
}
|
|
2690
|
+
catch (err) {
|
|
2691
|
+
console.warn(`[${metadata.callId}] Failed to send call-completed`, err);
|
|
2258
2692
|
}
|
|
2693
|
+
setTimeout(() => {
|
|
2694
|
+
try {
|
|
2695
|
+
socket.close();
|
|
2696
|
+
}
|
|
2697
|
+
catch { /* already closed */ }
|
|
2698
|
+
}, this.SOCKET_FINALIZE_GRACE_MS);
|
|
2699
|
+
session.chunks = [];
|
|
2700
|
+
return;
|
|
2701
|
+
}
|
|
2702
|
+
if (session.sentAny) {
|
|
2703
|
+
// Some chunks made it — the backend's $disconnect stitch already saved (or will save) those.
|
|
2704
|
+
// Don't double-upload; the lost tail is at most a few seconds.
|
|
2705
|
+
console.warn(`[${metadata.callId}] Socket down at finalize; backend stitches what was streamed`);
|
|
2706
|
+
session.chunks = [];
|
|
2707
|
+
return;
|
|
2708
|
+
}
|
|
2709
|
+
// Streaming never worked at all — fall back to the original complete upload so the recording
|
|
2710
|
+
// is not lost just because the socket couldn't connect.
|
|
2711
|
+
console.warn(`[${metadata.callId}] Recording socket never connected; falling back to complete upload`);
|
|
2712
|
+
if (!session.chunks.length) {
|
|
2713
|
+
console.warn(`[${metadata.callId}] No recording data captured`);
|
|
2714
|
+
return;
|
|
2715
|
+
}
|
|
2716
|
+
const blob = new Blob(session.chunks, { type: session.mimeType });
|
|
2717
|
+
session.chunks = [];
|
|
2718
|
+
const filename = this.generateFilename(metadata.callId, metadata.agentId, session.mimeType);
|
|
2719
|
+
try {
|
|
2720
|
+
await this.uploadCallRecording(metadata, blob, filename, session.mimeType);
|
|
2721
|
+
console.debug(`[${metadata.callId}] ✅ uploaded recording (fallback) -> ${filename}`);
|
|
2722
|
+
}
|
|
2723
|
+
catch (err) {
|
|
2724
|
+
console.error(`[${metadata.callId}] ❌ fallback recording upload failed`, err);
|
|
2725
|
+
}
|
|
2726
|
+
}
|
|
2727
|
+
async uploadCallRecording(metadata, file, filename, mimeType) {
|
|
2728
|
+
try {
|
|
2259
2729
|
const base64 = await this.convertBlobToBase64(file);
|
|
2260
2730
|
const body = base64.split(',')[1];
|
|
2261
2731
|
const payload = {
|
|
2262
|
-
|
|
2263
|
-
|
|
2732
|
+
tenantId: metadata.tenantId,
|
|
2733
|
+
callId: metadata.callId,
|
|
2734
|
+
agentId: metadata.agentId,
|
|
2264
2735
|
filename,
|
|
2736
|
+
contentType: mimeType,
|
|
2265
2737
|
isBase64: true,
|
|
2266
2738
|
body,
|
|
2267
2739
|
};
|
|
2268
|
-
|
|
2269
|
-
const
|
|
2270
|
-
|
|
2740
|
+
let headers = new HttpHeaders({ 'Content-Type': 'application/json' });
|
|
2741
|
+
const token = (typeof sessionStorage !== 'undefined' &&
|
|
2742
|
+
sessionStorage.getItem('auth_sessionToken')) ||
|
|
2743
|
+
'';
|
|
2744
|
+
if (token) {
|
|
2745
|
+
headers = headers.set('Authorization', `Bearer ${token}`);
|
|
2746
|
+
}
|
|
2747
|
+
const res = await lastValueFrom(this.http.post(this.RECORDING_API_URL, payload, {
|
|
2748
|
+
headers,
|
|
2271
2749
|
responseType: 'json',
|
|
2272
2750
|
}));
|
|
2273
2751
|
return {
|
|
2274
2752
|
success: true,
|
|
2275
|
-
message: res?.
|
|
2276
|
-
|
|
2753
|
+
message: res?.status || 'Upload successful',
|
|
2754
|
+
interactionId: res?.interactionId,
|
|
2277
2755
|
};
|
|
2278
2756
|
}
|
|
2279
2757
|
catch (err) {
|
|
2280
|
-
console.error(`[${metadata.callId}]
|
|
2758
|
+
console.error(`[${metadata.callId}] Recording upload failed:`, err);
|
|
2281
2759
|
return {
|
|
2282
2760
|
success: false,
|
|
2283
2761
|
message: err?.message || 'Upload failed',
|
|
@@ -2292,34 +2770,14 @@ class RecordingManagerService {
|
|
|
2292
2770
|
reader.readAsDataURL(blob);
|
|
2293
2771
|
});
|
|
2294
2772
|
}
|
|
2295
|
-
generateFilename(callId, agentId) {
|
|
2773
|
+
generateFilename(callId, agentId, mimeType) {
|
|
2296
2774
|
const timestamp = new Date()
|
|
2297
2775
|
.toISOString()
|
|
2298
2776
|
.replace(/[:.]/g, '')
|
|
2299
2777
|
.replace('T', '-')
|
|
2300
2778
|
.slice(0, 15);
|
|
2301
|
-
|
|
2302
|
-
|
|
2303
|
-
generateChunkFilename(callId, chunkIndex) {
|
|
2304
|
-
const now = new Date();
|
|
2305
|
-
const dateStr = now.toISOString().slice(0, 10).replace(/-/g, '');
|
|
2306
|
-
const timeStr = now.toTimeString().slice(0, 8).replace(/:/g, '');
|
|
2307
|
-
const msStr = now.getMilliseconds().toString().padStart(3, '0');
|
|
2308
|
-
const part = String(chunkIndex).padStart(4, '0');
|
|
2309
|
-
return `${callId}-${dateStr}-${timeStr}${msStr}-part${part}.webm`;
|
|
2310
|
-
}
|
|
2311
|
-
normalizePhoneNumberForUpload(value) {
|
|
2312
|
-
let digits = (value ?? '').toString().replace(/\D/g, '');
|
|
2313
|
-
if (digits.startsWith('00')) {
|
|
2314
|
-
digits = digits.slice(2);
|
|
2315
|
-
}
|
|
2316
|
-
if (digits.startsWith('0')) {
|
|
2317
|
-
digits = digits.slice(1);
|
|
2318
|
-
}
|
|
2319
|
-
if (digits.length === 10 && !digits.startsWith('91')) {
|
|
2320
|
-
digits = `91${digits}`;
|
|
2321
|
-
}
|
|
2322
|
-
return digits;
|
|
2779
|
+
const ext = mimeType.includes('webm') ? 'webm' : 'dat';
|
|
2780
|
+
return `${timestamp}-${agentId}-${callId}.${ext}`;
|
|
2323
2781
|
}
|
|
2324
2782
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: RecordingManagerService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
2325
2783
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: RecordingManagerService, providedIn: 'root' });
|
|
@@ -2334,16 +2792,16 @@ class TranscriptionStreamService {
|
|
|
2334
2792
|
transcriptSubject = new Subject();
|
|
2335
2793
|
transcript$ = this.transcriptSubject.asObservable();
|
|
2336
2794
|
SAMPLE_RATE = 16000;
|
|
2337
|
-
BUFFER_SIZE =
|
|
2795
|
+
BUFFER_SIZE = 512;
|
|
2338
2796
|
SILENCE_RMS_THRESHOLD = 0.002;
|
|
2339
2797
|
VOICE_RMS_THRESHOLD = 0.006;
|
|
2798
|
+
CUSTOMER_SILENCE_RMS_THRESHOLD = 0.0006;
|
|
2799
|
+
CUSTOMER_VOICE_RMS_THRESHOLD = 0.0025;
|
|
2340
2800
|
NOISE_FLOOR_MULTIPLIER = 2.5;
|
|
2341
2801
|
NOISE_FLOOR_SMOOTHING = 0.05;
|
|
2342
|
-
|
|
2802
|
+
MIN_VOICE_FRAMES = 2;
|
|
2343
2803
|
CUSTOM_WS_URL = APP_CONFIG.TRANSCRIPTION_WS_URL;
|
|
2344
|
-
|
|
2345
|
-
LANGUAGE_CODE = APP_CONFIG.TRANSCRIPTION_LANGUAGE_CODE;
|
|
2346
|
-
ALT_LANGUAGE_CODES = APP_CONFIG.TRANSCRIPTION_ALT_LANGUAGE_CODES;
|
|
2804
|
+
LANGUAGE = APP_CONFIG.TRANSCRIPTION_LANGUAGE;
|
|
2347
2805
|
TRANSCRIPTION_MODEL = APP_CONFIG.TRANSCRIPTION_MODEL;
|
|
2348
2806
|
constructor() { }
|
|
2349
2807
|
ngOnDestroy() {
|
|
@@ -2415,14 +2873,9 @@ class TranscriptionStreamService {
|
|
|
2415
2873
|
stream.sourceNode.disconnect();
|
|
2416
2874
|
}
|
|
2417
2875
|
catch { }
|
|
2418
|
-
if (stream.chunkTimer) {
|
|
2419
|
-
clearInterval(stream.chunkTimer);
|
|
2420
|
-
stream.chunkTimer = undefined;
|
|
2421
|
-
}
|
|
2422
2876
|
try {
|
|
2423
2877
|
if (stream.ws.readyState === WebSocket.OPEN) {
|
|
2424
|
-
|
|
2425
|
-
stream.ws.send(JSON.stringify({ type: 'end', source: stream.label }));
|
|
2878
|
+
stream.ws.send(JSON.stringify({ type: 'end' }));
|
|
2426
2879
|
stream.ws.close();
|
|
2427
2880
|
}
|
|
2428
2881
|
}
|
|
@@ -2434,6 +2887,12 @@ class TranscriptionStreamService {
|
|
|
2434
2887
|
catch { }
|
|
2435
2888
|
this.session = null;
|
|
2436
2889
|
}
|
|
2890
|
+
destroyAll() {
|
|
2891
|
+
if (!this.session) {
|
|
2892
|
+
return;
|
|
2893
|
+
}
|
|
2894
|
+
this.stopSession(this.session.callId);
|
|
2895
|
+
}
|
|
2437
2896
|
enableBinary(callId) {
|
|
2438
2897
|
if (!this.session || this.session.callId !== callId) {
|
|
2439
2898
|
return;
|
|
@@ -2513,33 +2972,13 @@ class TranscriptionStreamService {
|
|
|
2513
2972
|
return output;
|
|
2514
2973
|
}
|
|
2515
2974
|
queueAudio(stream, chunk) {
|
|
2516
|
-
stream.
|
|
2517
|
-
stream.pendingBytes += chunk.byteLength;
|
|
2518
|
-
this.flushPendingAudio(stream);
|
|
2519
|
-
}
|
|
2520
|
-
flushPendingAudio(stream) {
|
|
2521
|
-
if (stream.pendingBytes === 0 || stream.ws.readyState !== WebSocket.OPEN) {
|
|
2975
|
+
if (stream.ws.readyState !== WebSocket.OPEN) {
|
|
2522
2976
|
return;
|
|
2523
2977
|
}
|
|
2524
|
-
|
|
2525
|
-
stream.pendingChunks = [];
|
|
2526
|
-
stream.pendingBytes = 0;
|
|
2527
|
-
stream.ws.send(merged);
|
|
2978
|
+
stream.ws.send(chunk);
|
|
2528
2979
|
stream.lastAudioSentAt = Date.now();
|
|
2529
2980
|
stream.lastChunkSentAt = stream.lastAudioSentAt;
|
|
2530
2981
|
}
|
|
2531
|
-
mergeChunks(chunks, totalBytes) {
|
|
2532
|
-
if (chunks.length === 1) {
|
|
2533
|
-
return chunks[0];
|
|
2534
|
-
}
|
|
2535
|
-
const out = new Uint8Array(totalBytes);
|
|
2536
|
-
let offset = 0;
|
|
2537
|
-
for (const chunk of chunks) {
|
|
2538
|
-
out.set(chunk, offset);
|
|
2539
|
-
offset += chunk.byteLength;
|
|
2540
|
-
}
|
|
2541
|
-
return out;
|
|
2542
|
-
}
|
|
2543
2982
|
handleTranscriptPayload(callId, text) {
|
|
2544
2983
|
if (!text)
|
|
2545
2984
|
return;
|
|
@@ -2547,7 +2986,7 @@ class TranscriptionStreamService {
|
|
|
2547
2986
|
const data = JSON.parse(text);
|
|
2548
2987
|
if (typeof data?.text === 'string') {
|
|
2549
2988
|
this.transcriptSubject.next({
|
|
2550
|
-
callId,
|
|
2989
|
+
callId: data?.callId || callId,
|
|
2551
2990
|
text: data.text,
|
|
2552
2991
|
isFinal: Boolean(data?.isFinal ?? data?.final ?? true),
|
|
2553
2992
|
ts: typeof data?.ts === 'number' ? data.ts : Date.now(),
|
|
@@ -2555,9 +2994,19 @@ class TranscriptionStreamService {
|
|
|
2555
2994
|
});
|
|
2556
2995
|
return;
|
|
2557
2996
|
}
|
|
2997
|
+
if (data?.type === 'Results' && typeof data?.transcript === 'string') {
|
|
2998
|
+
this.transcriptSubject.next({
|
|
2999
|
+
callId: data?.callId || callId,
|
|
3000
|
+
text: data.transcript,
|
|
3001
|
+
isFinal: Boolean(data?.is_final ?? data?.speech_final ?? data?.isFinal ?? data?.final ?? true),
|
|
3002
|
+
ts: typeof data?.ts === 'number' ? data.ts : Date.now(),
|
|
3003
|
+
speaker: data?.source,
|
|
3004
|
+
});
|
|
3005
|
+
return;
|
|
3006
|
+
}
|
|
2558
3007
|
if (typeof data?.transcript === 'string') {
|
|
2559
3008
|
const ts = typeof data?.ts === 'number' ? data.ts : Date.now();
|
|
2560
|
-
const isFinal = Boolean(data?.isFinal ?? data?.final ?? true);
|
|
3009
|
+
const isFinal = Boolean(data?.isFinal ?? data?.final ?? data?.is_final ?? data?.speech_final ?? true);
|
|
2561
3010
|
const lines = data.transcript
|
|
2562
3011
|
.split(/\r?\n/)
|
|
2563
3012
|
.map((line) => line.trim())
|
|
@@ -2566,7 +3015,7 @@ class TranscriptionStreamService {
|
|
|
2566
3015
|
for (const line of lines) {
|
|
2567
3016
|
const parsed = this.parseSpeakerLine(line);
|
|
2568
3017
|
this.transcriptSubject.next({
|
|
2569
|
-
callId,
|
|
3018
|
+
callId: data?.callId || callId,
|
|
2570
3019
|
text: parsed.text,
|
|
2571
3020
|
isFinal,
|
|
2572
3021
|
ts,
|
|
@@ -2577,7 +3026,7 @@ class TranscriptionStreamService {
|
|
|
2577
3026
|
else {
|
|
2578
3027
|
const parsed = this.parseSpeakerLine(data.transcript.trim());
|
|
2579
3028
|
this.transcriptSubject.next({
|
|
2580
|
-
callId,
|
|
3029
|
+
callId: data?.callId || callId,
|
|
2581
3030
|
text: parsed.text,
|
|
2582
3031
|
isFinal,
|
|
2583
3032
|
ts,
|
|
@@ -2634,31 +3083,35 @@ class TranscriptionStreamService {
|
|
|
2634
3083
|
processor,
|
|
2635
3084
|
sourceNode: opts.sourceNode,
|
|
2636
3085
|
closed: false,
|
|
2637
|
-
pendingChunks: [],
|
|
2638
|
-
pendingBytes: 0,
|
|
2639
3086
|
lastChunkSentAt: Date.now(),
|
|
2640
3087
|
noiseFloor: this.SILENCE_RMS_THRESHOLD,
|
|
2641
3088
|
readyForBinary: false,
|
|
2642
3089
|
allowSendBinary: opts.allowSendBinary,
|
|
2643
3090
|
muted: false,
|
|
2644
3091
|
lastAudioSentAt: Date.now(),
|
|
3092
|
+
voiceStreak: 0,
|
|
2645
3093
|
};
|
|
2646
3094
|
ws.onopen = () => {
|
|
2647
3095
|
opts.audioContext.resume().catch(() => { });
|
|
2648
3096
|
const payload = {
|
|
2649
3097
|
type: 'start',
|
|
2650
|
-
mimeType: this.CUSTOM_WS_MIME_TYPE || 'audio/pcm;rate=16000;encoding=s16le',
|
|
2651
|
-
sampleRate: this.SAMPLE_RATE,
|
|
2652
|
-
encoding: 's16le',
|
|
2653
|
-
channels: 1,
|
|
2654
3098
|
callId: opts.callId,
|
|
2655
3099
|
source: opts.label,
|
|
2656
|
-
|
|
2657
|
-
alternativeLanguageCodes: this.ALT_LANGUAGE_CODES,
|
|
3100
|
+
language: this.LANGUAGE,
|
|
2658
3101
|
model: this.TRANSCRIPTION_MODEL,
|
|
3102
|
+
sampleRate: this.SAMPLE_RATE,
|
|
3103
|
+
channels: 1,
|
|
2659
3104
|
};
|
|
2660
3105
|
ws.send(JSON.stringify(payload));
|
|
2661
3106
|
stream.readyForBinary = false;
|
|
3107
|
+
if (opts.label === 'customer') {
|
|
3108
|
+
setTimeout(() => {
|
|
3109
|
+
if (!stream.closed && ws.readyState === WebSocket.OPEN && !stream.readyForBinary) {
|
|
3110
|
+
console.debug('[Transcription] No ACK yet, enabling customer stream');
|
|
3111
|
+
stream.readyForBinary = true;
|
|
3112
|
+
}
|
|
3113
|
+
}, 1200);
|
|
3114
|
+
}
|
|
2662
3115
|
console.debug('[Transcription] WebSocket open', { source: opts.label });
|
|
2663
3116
|
processor.onaudioprocess = (event) => {
|
|
2664
3117
|
if (stream.closed || ws.readyState !== WebSocket.OPEN) {
|
|
@@ -2672,17 +3125,28 @@ class TranscriptionStreamService {
|
|
|
2672
3125
|
return;
|
|
2673
3126
|
}
|
|
2674
3127
|
const rms = this.calculateRms(input);
|
|
2675
|
-
|
|
3128
|
+
const silenceThreshold = opts.label === 'customer'
|
|
3129
|
+
? this.CUSTOMER_SILENCE_RMS_THRESHOLD
|
|
3130
|
+
: this.SILENCE_RMS_THRESHOLD;
|
|
3131
|
+
const voiceThreshold = opts.label === 'customer'
|
|
3132
|
+
? this.CUSTOMER_VOICE_RMS_THRESHOLD
|
|
3133
|
+
: this.VOICE_RMS_THRESHOLD;
|
|
3134
|
+
if (rms < silenceThreshold) {
|
|
2676
3135
|
stream.noiseFloor =
|
|
2677
3136
|
(1 - this.NOISE_FLOOR_SMOOTHING) * stream.noiseFloor +
|
|
2678
3137
|
this.NOISE_FLOOR_SMOOTHING * rms;
|
|
2679
3138
|
return;
|
|
2680
3139
|
}
|
|
2681
|
-
const adaptiveThreshold = Math.max(
|
|
3140
|
+
const adaptiveThreshold = Math.max(voiceThreshold, stream.noiseFloor * this.NOISE_FLOOR_MULTIPLIER);
|
|
2682
3141
|
if (rms < adaptiveThreshold) {
|
|
2683
3142
|
stream.noiseFloor =
|
|
2684
3143
|
(1 - this.NOISE_FLOOR_SMOOTHING) * stream.noiseFloor +
|
|
2685
3144
|
this.NOISE_FLOOR_SMOOTHING * rms;
|
|
3145
|
+
stream.voiceStreak = 0;
|
|
3146
|
+
return;
|
|
3147
|
+
}
|
|
3148
|
+
stream.voiceStreak += 1;
|
|
3149
|
+
if (stream.voiceStreak < this.MIN_VOICE_FRAMES) {
|
|
2686
3150
|
return;
|
|
2687
3151
|
}
|
|
2688
3152
|
const pcmBytes = this.encodePcm16(input, opts.audioContext.sampleRate);
|
|
@@ -2709,9 +3173,11 @@ class TranscriptionStreamService {
|
|
|
2709
3173
|
if (typeof evt.data === 'string') {
|
|
2710
3174
|
try {
|
|
2711
3175
|
const maybeAck = JSON.parse(evt.data);
|
|
2712
|
-
|
|
2713
|
-
|
|
2714
|
-
|
|
3176
|
+
const ackType = (maybeAck?.type || '').toString().toLowerCase();
|
|
3177
|
+
const ackMessage = (maybeAck?.message || '').toString().toLowerCase();
|
|
3178
|
+
const isReady = (ackType === 'ack' && ackMessage === 'stream-started') ||
|
|
3179
|
+
(ackType === 'ready' && ackMessage.includes('ready'));
|
|
3180
|
+
if (isReady) {
|
|
2715
3181
|
stream.readyForBinary = true;
|
|
2716
3182
|
return;
|
|
2717
3183
|
}
|
|
@@ -2735,14 +3201,6 @@ class TranscriptionStreamService {
|
|
|
2735
3201
|
});
|
|
2736
3202
|
this.stopSession(opts.callId);
|
|
2737
3203
|
};
|
|
2738
|
-
stream.chunkTimer = setInterval(() => {
|
|
2739
|
-
if (stream.closed || ws.readyState !== WebSocket.OPEN) {
|
|
2740
|
-
return;
|
|
2741
|
-
}
|
|
2742
|
-
if (stream.readyForBinary && stream.allowSendBinary) {
|
|
2743
|
-
this.flushPendingAudio(stream);
|
|
2744
|
-
}
|
|
2745
|
-
}, this.CHUNK_INTERVAL_MS);
|
|
2746
3204
|
return stream;
|
|
2747
3205
|
}
|
|
2748
3206
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: TranscriptionStreamService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
@@ -2785,11 +3243,11 @@ class PhoneIdleComponent {
|
|
|
2785
3243
|
this.keyboardInput.emit(ev);
|
|
2786
3244
|
}
|
|
2787
3245
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: PhoneIdleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2788
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.9", type: PhoneIdleComponent, isStandalone: false, selector: "app-phone-idle", inputs: { dialForm: "dialForm", contacts: "contacts", showDirectoryPhonebook: "showDirectoryPhonebook", isRinging: "isRinging", CountryISO: "CountryISO", SearchCountryField: "SearchCountryField" }, outputs: { toggleDirectory: "toggleDirectory", clear: "clear", makeCall: "makeCall", keypadInput: "keypadInput", keyboardInput: "keyboardInput" }, ngImport: i0, template: "<form class=\"phone-shell classic\" [formGroup]=\"dialForm\" (ngSubmit)=\"onMakeCall()\">\n <div class=\"input-row classic-input\">\n <ngx-intl-tel-input\n formControlName=\"phoneNumber\"\n name=\"phoneNumber\"\n [cssClass]=\"'phone_number_sd'\"\n [preferredCountries]=\"['in']\"\n [customPlaceholder]=\"'Phone Number'\"\n [enableAutoCountrySelect]=\"false\"\n [enablePlaceholder]=\"false\"\n [searchCountryFlag]=\"true\"\n [searchCountryField]=\"[SearchCountryField.Iso2, SearchCountryField.Name]\"\n [selectFirstCountry]=\"false\"\n [selectedCountryISO]=\"CountryISO.India\"\n [maxLength]=\"15\"\n [phoneValidation]=\"true\"\n [separateDialCode]=\"true\"\n (keydown)=\"onKeyboardInput($event)\"\n >\n </ngx-intl-tel-input>\n <button type=\"button\" class=\"clear-btn\" (click)=\"onClear()\">\u232B</button>\n </div>\n\n <div class=\"keypad classic-grid\">\n <button type=\"button\" (click)=\"onKeypadInput('1')\">\n <span class=\"digit\">1</span>\n <span class=\"letters\"> </span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('2')\">\n <span class=\"digit\">2</span>\n <span class=\"letters\">ABC</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('3')\">\n <span class=\"digit\">3</span>\n <span class=\"letters\">DEF</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('4')\">\n <span class=\"digit\">4</span>\n <span class=\"letters\">GHI</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('5')\">\n <span class=\"digit\">5</span>\n <span class=\"letters\">JKL</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('6')\">\n <span class=\"digit\">6</span>\n <span class=\"letters\">MNO</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('7')\">\n <span class=\"digit\">7</span>\n <span class=\"letters\">PQRS</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('8')\">\n <span class=\"digit\">8</span>\n <span class=\"letters\">TUV</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('9')\">\n <span class=\"digit\">9</span>\n <span class=\"letters\">WXYZ</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('*')\">\n <span class=\"digit\">*</span>\n <span class=\"letters\"> </span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('0')\">\n <span class=\"digit\">0</span>\n <span class=\"letters\">+</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('#')\">\n <span class=\"digit\">#</span>\n <span class=\"letters\"> </span>\n </button>\n </div>\n\n <div class=\"actions\">\n <button type=\"submit\" class=\"call-btn-main\" [disabled]=\"!this.dialForm.valid\">\n <svg viewBox=\"0 0 512 512\" width=\"22px\" height=\"22px\" fill=\"currentColor\" aria-hidden=\"true\">\n <path\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n </div>\n</form>\n", styles: [".phone-shell.classic{display:flex;flex-direction:column;align-items:center;gap:3rem;background:transparent;padding:0 15px}.classic-input{width:100%;display:flex;align-items:center;gap:6px;padding:6px 42px 6px 16px;box-sizing:border-box;position:relative;border:1px solid #dcdcdc;border-radius:12px;background:#fafafa;box-shadow:inset 0 1px 2px #0000000d;margin-bottom:6px}.phonebook-btn{border:none;background:transparent;color:#555;width:32px;height:32px;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;cursor:pointer}.phonebook-btn:hover{background:#0000000d}.phonebook-btn:focus{outline:none;box-shadow:none}.clear-btn{position:absolute;right:8px;top:50%;transform:translateY(-50%);border:none;background:transparent;color:#555;border-radius:6px;padding:6px 8px;cursor:pointer;font-weight:700}.classic-input .phone_number_sd{width:100%}.classic-input .phone_number_sd input{width:100%;border:none!important;box-shadow:none!important;padding:8px 0!important;font-size:15px!important;color:#111}:host ::ng-deep .classic-input .iti{width:100%}:host ::ng-deep .classic-input .iti__flag-container{padding-left:6px}:host ::ng-deep .classic-input .iti__selected-flag{border-right:1px solid #e5e5e5;padding-right:8px}:host ::ng-deep .classic-input .iti.separate-dial-code input{padding-left:130px!important}:host ::ng-deep .classic-input .iti__tel-input{background:transparent;border:none;box-shadow:none;height:32px;padding:0 0 0 6px;font-size:15px}.classic-grid{width:100%;max-width:260px;margin:0 auto;display:grid;grid-template-columns:repeat(3,1fr);gap:12px;justify-items:center}.classic-grid button{width:68px;height:68px;border-radius:50%;border:1.6px solid #c7c7c7;background:transparent;display:flex;flex-direction:column;align-items:center;justify-content:center;font-family:Helvetica Neue,Arial,sans-serif;cursor:pointer}.classic-grid button:focus{outline:none;box-shadow:none}.classic-grid button:active{background:#0000000a}.classic-grid .digit{font-size:24px;font-weight:400;color:#4a4a4a;line-height:24px}.classic-grid .letters{font-size:9px;letter-spacing:.8px;color:#9a9a9a;margin-top:2px}.actions{display:flex;justify-content:center;width:100%;margin-top:6px}.call-btn-main{width:68px;height:68px;border-radius:50%;border:none;background:#28b446;color:#fff;display:inline-flex;align-items:center;justify-content:center;box-shadow:0 4px 12px #28b44659;cursor:pointer}.call-btn-main:disabled{opacity:.4;cursor:not-allowed}\n"], dependencies: [{ kind: "directive", type: i1$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i2$1.NgxIntlTelInputComponent, selector: "ngx-intl-tel-input", inputs: ["value", "preferredCountries", "enablePlaceholder", "customPlaceholder", "numberFormat", "cssClass", "onlyCountries", "enableAutoCountrySelect", "searchCountryFlag", "searchCountryField", "searchCountryPlaceholder", "maxLength", "selectFirstCountry", "selectedCountryISO", "phoneValidation", "inputId", "separateDialCode"], outputs: ["countryChange"] }, { kind: "directive", type: i2$1.NativeElementInjectorDirective, selector: "[ngModel], [formControl], [formControlName]" }] });
|
|
3246
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.9", type: PhoneIdleComponent, isStandalone: false, selector: "app-phone-idle", inputs: { dialForm: "dialForm", contacts: "contacts", showDirectoryPhonebook: "showDirectoryPhonebook", isRinging: "isRinging", CountryISO: "CountryISO", SearchCountryField: "SearchCountryField" }, outputs: { toggleDirectory: "toggleDirectory", clear: "clear", makeCall: "makeCall", keypadInput: "keypadInput", keyboardInput: "keyboardInput" }, ngImport: i0, template: "<form class=\"avaya-ipo-phone-shell avaya-ipo-classic\" [formGroup]=\"dialForm\" (ngSubmit)=\"onMakeCall()\">\n <div class=\"avaya-ipo-input-row avaya-ipo-classic-input\">\n <ngx-intl-tel-input\n formControlName=\"phoneNumber\"\n name=\"phoneNumber\"\n [cssClass]=\"'avaya-ipo-phone_number_sd'\"\n [preferredCountries]=\"['in']\"\n [customPlaceholder]=\"'Phone Number'\"\n [enableAutoCountrySelect]=\"false\"\n [enablePlaceholder]=\"false\"\n [searchCountryFlag]=\"true\"\n [searchCountryField]=\"[SearchCountryField.Iso2, SearchCountryField.Name]\"\n [selectFirstCountry]=\"false\"\n [selectedCountryISO]=\"CountryISO.India\"\n [maxLength]=\"15\"\n [phoneValidation]=\"true\"\n [separateDialCode]=\"true\"\n (keydown)=\"onKeyboardInput($event)\"\n >\n </ngx-intl-tel-input>\n <button type=\"button\" class=\"avaya-ipo-clear-btn\" (click)=\"onClear()\" aria-label=\"Backspace\" title=\"Backspace\">\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M22 3H7c-.69 0-1.23.35-1.59.88L0 12l5.41 8.12c.36.53.9.88 1.59.88h15c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-3 12.59L17.59 17 14 13.41 10.41 17 9 15.59 12.59 12 9 8.41 10.41 7 14 10.59 17.59 7 19 8.41 15.41 12 19 15.59z\" />\n </svg>\n </button>\n </div>\n\n <div class=\"avaya-ipo-dial-cluster\">\n <div class=\"avaya-ipo-keypad avaya-ipo-classic-grid\">\n <button type=\"button\" (click)=\"onKeypadInput('1')\">\n <span class=\"avaya-ipo-digit\">1</span>\n <span class=\"avaya-ipo-letters\"> </span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('2')\">\n <span class=\"avaya-ipo-digit\">2</span>\n <span class=\"avaya-ipo-letters\">ABC</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('3')\">\n <span class=\"avaya-ipo-digit\">3</span>\n <span class=\"avaya-ipo-letters\">DEF</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('4')\">\n <span class=\"avaya-ipo-digit\">4</span>\n <span class=\"avaya-ipo-letters\">GHI</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('5')\">\n <span class=\"avaya-ipo-digit\">5</span>\n <span class=\"avaya-ipo-letters\">JKL</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('6')\">\n <span class=\"avaya-ipo-digit\">6</span>\n <span class=\"avaya-ipo-letters\">MNO</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('7')\">\n <span class=\"avaya-ipo-digit\">7</span>\n <span class=\"avaya-ipo-letters\">PQRS</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('8')\">\n <span class=\"avaya-ipo-digit\">8</span>\n <span class=\"avaya-ipo-letters\">TUV</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('9')\">\n <span class=\"avaya-ipo-digit\">9</span>\n <span class=\"avaya-ipo-letters\">WXYZ</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('*')\">\n <span class=\"avaya-ipo-digit\">*</span>\n <span class=\"avaya-ipo-letters\"> </span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('0')\">\n <span class=\"avaya-ipo-digit\">0</span>\n <span class=\"avaya-ipo-letters\">+</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('#')\">\n <span class=\"avaya-ipo-digit\">#</span>\n <span class=\"avaya-ipo-letters\"> </span>\n </button>\n </div>\n\n <div class=\"avaya-ipo-actions\">\n <button type=\"submit\" class=\"avaya-ipo-call-btn-main\" [disabled]=\"!this.dialForm.valid\">\n <svg viewBox=\"0 0 512 512\" width=\"22px\" height=\"22px\" fill=\"currentColor\" aria-hidden=\"true\">\n <path\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n </div>\n </div>\n</form>\n", styles: [":host{display:flex;flex-direction:column;height:100%;min-height:0}.avaya-ipo-phone-shell.avaya-ipo-classic{--key-size: clamp(40px, min(24cqw, 18cqh - 30px), 88px);--key-gap: calc(var(--key-size) * .16);display:flex;flex-direction:column;align-items:center;justify-content:flex-start;gap:clamp(35px,4.5cqw,30px);background:transparent;width:100%;height:100%;flex:1 1 auto;min-height:0;padding:46px 15px clamp(12px,3cqw,20px);box-sizing:border-box}.avaya-ipo-dial-cluster{flex:1 1 auto;min-height:0;width:100%;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;gap:clamp(10px,2.6cqw,18px)}.avaya-ipo-classic-input{width:100%;display:flex;align-items:center;padding:0;box-sizing:border-box;position:relative;border:1.5px solid var(--sd-input-border);border-radius:var(--sd-radius);background:var(--sd-input);box-shadow:var(--sd-shadow-sm);margin-bottom:0;transition:border-color .18s ease,box-shadow .18s ease}.avaya-ipo-classic-input:focus-within{border-color:var(--sd-accent);box-shadow:var(--sd-focus-ring)}.avaya-ipo-clear-btn{position:absolute;right:clamp(5px,1.6cqw,9px);top:50%;transform:translateY(-50%);width:34px;height:34px;display:inline-flex;align-items:center;justify-content:center;border:none;background:transparent;color:var(--sd-text-subtle);border-radius:50%;padding:0;cursor:pointer;transition:background .15s ease,color .15s ease,transform .1s ease}.avaya-ipo-clear-btn:hover{background:var(--sd-surface-muted);color:var(--sd-accent)}.avaya-ipo-clear-btn:active{transform:translateY(-50%) scale(.9)}.avaya-ipo-clear-btn:focus{outline:none;box-shadow:none}.avaya-ipo-clear-btn:focus-visible{outline:none;box-shadow:var(--sd-focus-ring)}.avaya-ipo-clear-btn svg{display:block}.avaya-ipo-classic-input .avaya-ipo-phone_number_sd{width:100%}.avaya-ipo-classic-input .avaya-ipo-phone_number_sd input{width:100%;border:none!important;box-shadow:none!important;background:transparent!important;padding:clamp(8px,calc(var(--key-size) * .16),15px) 46px clamp(8px,calc(var(--key-size) * .16),15px) 0!important;font-size:clamp(12px,calc(var(--key-size) * .27),20px)!important;font-weight:600;letter-spacing:.4px;color:var(--sd-text)!important}.avaya-ipo-classic-input .avaya-ipo-phone_number_sd input::placeholder{font-weight:400;letter-spacing:normal;color:var(--sd-text-subtle)}:host ::ng-deep .avaya-ipo-classic-input .iti{width:100%}:host ::ng-deep .avaya-ipo-classic-input .iti__selected-flag{padding:0 10px 0 14px;border-right:1px solid var(--sd-border);border-radius:calc(var(--sd-radius) - 2px) 0 0 calc(var(--sd-radius) - 2px);background:transparent;outline:none;transition:background .15s ease}:host ::ng-deep .avaya-ipo-classic-input .iti--allow-dropdown .iti__flag-container:hover .iti__selected-flag{background:var(--sd-surface-muted)}:host ::ng-deep .avaya-ipo-classic-input .selected-dial-code{margin-left:6px;font-size:clamp(12px,calc(var(--key-size) * .18),16px);font-weight:600;color:var(--sd-text)}:host ::ng-deep .avaya-ipo-classic-input .iti__selected-flag:focus,:host ::ng-deep .avaya-ipo-classic-input .iti__tel-input:focus,.avaya-ipo-classic-input .avaya-ipo-phone_number_sd input:focus{outline:none;box-shadow:none}:host ::ng-deep .avaya-ipo-classic-input .iti__tel-input{background:transparent!important;border:none!important;box-shadow:none!important;height:auto;padding:clamp(8px,calc(var(--key-size) * .16),15px) 46px clamp(8px,calc(var(--key-size) * .16),15px) 0;font-size:clamp(12px,calc(var(--key-size) * .27),20px);font-weight:600;letter-spacing:.4px;color:var(--sd-text)}:host ::ng-deep .avaya-ipo-classic-input .iti.separate-dial-code .iti__tel-input{padding-left:102px!important}:host ::ng-deep .avaya-ipo-classic-input .iti__dropdown-content,:host ::ng-deep .avaya-ipo-classic-input .dropdown-menu{z-index:30;min-width:248px;padding:6px;background:var(--sd-surface);border:1px solid var(--sd-border);border-radius:var(--sd-radius);box-shadow:var(--sd-shadow-lg)}:host ::ng-deep .avaya-ipo-classic-input .iti__country-list{max-height:220px;overflow-y:auto;margin:0;padding:0;border:none;box-shadow:none;background:transparent}:host ::ng-deep .avaya-ipo-classic-input .search-container{position:sticky;top:0;z-index:1;padding:0 0 6px;background:var(--sd-surface)}:host ::ng-deep .avaya-ipo-classic-input #country-search-box{width:100%;box-sizing:border-box;margin:0!important;padding:8px 12px!important;font-size:14px!important;font-weight:400!important;letter-spacing:normal!important;color:var(--sd-text)!important;background:var(--sd-input)!important;border:1px solid var(--sd-input-border)!important;border-radius:var(--sd-radius-sm)!important;box-shadow:none!important;height:auto!important;transition:border-color .15s ease,box-shadow .15s ease}:host ::ng-deep .avaya-ipo-classic-input #country-search-box:focus{outline:none!important;border-color:var(--sd-accent)!important;box-shadow:var(--sd-focus-ring)!important}:host ::ng-deep .avaya-ipo-classic-input #country-search-box::placeholder{color:var(--sd-text-subtle)!important}:host ::ng-deep .avaya-ipo-classic-input .iti__country{padding:7px 8px;border-radius:var(--sd-radius-sm);font-size:14px;color:var(--sd-text)}:host ::ng-deep .avaya-ipo-classic-input .iti__country.iti__highlight,:host ::ng-deep .avaya-ipo-classic-input .iti__country:hover{background:var(--sd-surface-muted)}:host ::ng-deep .avaya-ipo-classic-input .iti__country .iti__dial-code{color:var(--sd-text-subtle)}:host ::ng-deep .avaya-ipo-classic-input .iti__divider{border-top:1px solid var(--sd-border);margin:4px 0}.avaya-ipo-classic-grid{width:auto;margin:0 auto;display:grid;grid-template-columns:repeat(3,var(--key-size));gap:var(--key-gap);justify-content:center;flex:0 1 auto}.avaya-ipo-classic-grid button{width:var(--key-size);height:var(--key-size);border-radius:50%;border:1.6px solid var(--sd-border-strong);background:transparent;display:flex;flex-direction:column;align-items:center;justify-content:center;cursor:pointer}.avaya-ipo-classic-grid button:focus{outline:none;box-shadow:none}.avaya-ipo-classic-grid button:focus-visible{outline:none;box-shadow:var(--sd-focus-ring)}.avaya-ipo-classic-grid button:active{background:var(--sd-surface-muted)}.avaya-ipo-classic-grid .avaya-ipo-digit{font-size:clamp(15px,calc(var(--key-size) * .34),26px);font-weight:400;color:var(--sd-text);line-height:1.1}.avaya-ipo-classic-grid .avaya-ipo-letters{font-size:clamp(7px,calc(var(--key-size) * .12),10px);letter-spacing:.8px;color:var(--sd-text-subtle);margin-top:2px}.avaya-ipo-actions{display:flex;justify-content:center;width:100%;margin-top:0}.avaya-ipo-call-btn-main{width:var(--key-size);height:var(--key-size);border-radius:50%;border:none;background:var(--sd-call-accept);color:var(--sd-accent-contrast);display:inline-flex;align-items:center;justify-content:center;box-shadow:var(--sd-shadow-md);cursor:pointer}.avaya-ipo-call-btn-main:disabled{opacity:.4;cursor:not-allowed}\n"], dependencies: [{ kind: "directive", type: i1$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i2$1.NgxIntlTelInputComponent, selector: "ngx-intl-tel-input", inputs: ["value", "preferredCountries", "enablePlaceholder", "customPlaceholder", "numberFormat", "cssClass", "onlyCountries", "enableAutoCountrySelect", "searchCountryFlag", "searchCountryField", "searchCountryPlaceholder", "maxLength", "selectFirstCountry", "selectedCountryISO", "phoneValidation", "inputId", "separateDialCode"], outputs: ["countryChange"] }, { kind: "directive", type: i2$1.NativeElementInjectorDirective, selector: "[ngModel], [formControl], [formControlName]" }] });
|
|
2789
3247
|
}
|
|
2790
3248
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: PhoneIdleComponent, decorators: [{
|
|
2791
3249
|
type: Component,
|
|
2792
|
-
args: [{ selector: 'app-phone-idle', standalone: false, template: "<form class=\"phone-shell classic\" [formGroup]=\"dialForm\" (ngSubmit)=\"onMakeCall()\">\n <div class=\"input-row classic-input\">\n <ngx-intl-tel-input\n formControlName=\"phoneNumber\"\n name=\"phoneNumber\"\n [cssClass]=\"'phone_number_sd'\"\n [preferredCountries]=\"['in']\"\n [customPlaceholder]=\"'Phone Number'\"\n [enableAutoCountrySelect]=\"false\"\n [enablePlaceholder]=\"false\"\n [searchCountryFlag]=\"true\"\n [searchCountryField]=\"[SearchCountryField.Iso2, SearchCountryField.Name]\"\n [selectFirstCountry]=\"false\"\n [selectedCountryISO]=\"CountryISO.India\"\n [maxLength]=\"15\"\n [phoneValidation]=\"true\"\n [separateDialCode]=\"true\"\n (keydown)=\"onKeyboardInput($event)\"\n >\n </ngx-intl-tel-input>\n <button type=\"button\" class=\"clear-btn\" (click)=\"onClear()\">\u232B</button>\n </div>\n\n <div class=\"keypad classic-grid\">\n <button type=\"button\" (click)=\"onKeypadInput('1')\">\n <span class=\"digit\">1</span>\n <span class=\"letters\"> </span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('2')\">\n <span class=\"digit\">2</span>\n <span class=\"letters\">ABC</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('3')\">\n <span class=\"digit\">3</span>\n <span class=\"letters\">DEF</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('4')\">\n <span class=\"digit\">4</span>\n <span class=\"letters\">GHI</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('5')\">\n <span class=\"digit\">5</span>\n <span class=\"letters\">JKL</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('6')\">\n <span class=\"digit\">6</span>\n <span class=\"letters\">MNO</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('7')\">\n <span class=\"digit\">7</span>\n <span class=\"letters\">PQRS</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('8')\">\n <span class=\"digit\">8</span>\n <span class=\"letters\">TUV</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('9')\">\n <span class=\"digit\">9</span>\n <span class=\"letters\">WXYZ</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('*')\">\n <span class=\"digit\">*</span>\n <span class=\"letters\"> </span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('0')\">\n <span class=\"digit\">0</span>\n <span class=\"letters\">+</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('#')\">\n <span class=\"digit\">#</span>\n <span class=\"letters\"> </span>\n </button>\n </div>\n\n <div class=\"actions\">\n <button type=\"submit\" class=\"call-btn-main\" [disabled]=\"!this.dialForm.valid\">\n <svg viewBox=\"0 0 512 512\" width=\"22px\" height=\"22px\" fill=\"currentColor\" aria-hidden=\"true\">\n <path\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n </div>\n</form>\n", styles: [".phone-shell.classic{display:flex;flex-direction:column;align-items:center;gap:3rem;background:transparent;padding:0 15px}.classic-input{width:100%;display:flex;align-items:center;gap:6px;padding:6px 42px 6px 16px;box-sizing:border-box;position:relative;border:1px solid #dcdcdc;border-radius:12px;background:#fafafa;box-shadow:inset 0 1px 2px #0000000d;margin-bottom:6px}.phonebook-btn{border:none;background:transparent;color:#555;width:32px;height:32px;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;cursor:pointer}.phonebook-btn:hover{background:#0000000d}.phonebook-btn:focus{outline:none;box-shadow:none}.clear-btn{position:absolute;right:8px;top:50%;transform:translateY(-50%);border:none;background:transparent;color:#555;border-radius:6px;padding:6px 8px;cursor:pointer;font-weight:700}.classic-input .phone_number_sd{width:100%}.classic-input .phone_number_sd input{width:100%;border:none!important;box-shadow:none!important;padding:8px 0!important;font-size:15px!important;color:#111}:host ::ng-deep .classic-input .iti{width:100%}:host ::ng-deep .classic-input .iti__flag-container{padding-left:6px}:host ::ng-deep .classic-input .iti__selected-flag{border-right:1px solid #e5e5e5;padding-right:8px}:host ::ng-deep .classic-input .iti.separate-dial-code input{padding-left:130px!important}:host ::ng-deep .classic-input .iti__tel-input{background:transparent;border:none;box-shadow:none;height:32px;padding:0 0 0 6px;font-size:15px}.classic-grid{width:100%;max-width:260px;margin:0 auto;display:grid;grid-template-columns:repeat(3,1fr);gap:12px;justify-items:center}.classic-grid button{width:68px;height:68px;border-radius:50%;border:1.6px solid #c7c7c7;background:transparent;display:flex;flex-direction:column;align-items:center;justify-content:center;font-family:Helvetica Neue,Arial,sans-serif;cursor:pointer}.classic-grid button:focus{outline:none;box-shadow:none}.classic-grid button:active{background:#0000000a}.classic-grid .digit{font-size:24px;font-weight:400;color:#4a4a4a;line-height:24px}.classic-grid .letters{font-size:9px;letter-spacing:.8px;color:#9a9a9a;margin-top:2px}.actions{display:flex;justify-content:center;width:100%;margin-top:6px}.call-btn-main{width:68px;height:68px;border-radius:50%;border:none;background:#28b446;color:#fff;display:inline-flex;align-items:center;justify-content:center;box-shadow:0 4px 12px #28b44659;cursor:pointer}.call-btn-main:disabled{opacity:.4;cursor:not-allowed}\n"] }]
|
|
3250
|
+
args: [{ selector: 'app-phone-idle', standalone: false, template: "<form class=\"avaya-ipo-phone-shell avaya-ipo-classic\" [formGroup]=\"dialForm\" (ngSubmit)=\"onMakeCall()\">\n <div class=\"avaya-ipo-input-row avaya-ipo-classic-input\">\n <ngx-intl-tel-input\n formControlName=\"phoneNumber\"\n name=\"phoneNumber\"\n [cssClass]=\"'avaya-ipo-phone_number_sd'\"\n [preferredCountries]=\"['in']\"\n [customPlaceholder]=\"'Phone Number'\"\n [enableAutoCountrySelect]=\"false\"\n [enablePlaceholder]=\"false\"\n [searchCountryFlag]=\"true\"\n [searchCountryField]=\"[SearchCountryField.Iso2, SearchCountryField.Name]\"\n [selectFirstCountry]=\"false\"\n [selectedCountryISO]=\"CountryISO.India\"\n [maxLength]=\"15\"\n [phoneValidation]=\"true\"\n [separateDialCode]=\"true\"\n (keydown)=\"onKeyboardInput($event)\"\n >\n </ngx-intl-tel-input>\n <button type=\"button\" class=\"avaya-ipo-clear-btn\" (click)=\"onClear()\" aria-label=\"Backspace\" title=\"Backspace\">\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M22 3H7c-.69 0-1.23.35-1.59.88L0 12l5.41 8.12c.36.53.9.88 1.59.88h15c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-3 12.59L17.59 17 14 13.41 10.41 17 9 15.59 12.59 12 9 8.41 10.41 7 14 10.59 17.59 7 19 8.41 15.41 12 19 15.59z\" />\n </svg>\n </button>\n </div>\n\n <div class=\"avaya-ipo-dial-cluster\">\n <div class=\"avaya-ipo-keypad avaya-ipo-classic-grid\">\n <button type=\"button\" (click)=\"onKeypadInput('1')\">\n <span class=\"avaya-ipo-digit\">1</span>\n <span class=\"avaya-ipo-letters\"> </span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('2')\">\n <span class=\"avaya-ipo-digit\">2</span>\n <span class=\"avaya-ipo-letters\">ABC</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('3')\">\n <span class=\"avaya-ipo-digit\">3</span>\n <span class=\"avaya-ipo-letters\">DEF</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('4')\">\n <span class=\"avaya-ipo-digit\">4</span>\n <span class=\"avaya-ipo-letters\">GHI</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('5')\">\n <span class=\"avaya-ipo-digit\">5</span>\n <span class=\"avaya-ipo-letters\">JKL</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('6')\">\n <span class=\"avaya-ipo-digit\">6</span>\n <span class=\"avaya-ipo-letters\">MNO</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('7')\">\n <span class=\"avaya-ipo-digit\">7</span>\n <span class=\"avaya-ipo-letters\">PQRS</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('8')\">\n <span class=\"avaya-ipo-digit\">8</span>\n <span class=\"avaya-ipo-letters\">TUV</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('9')\">\n <span class=\"avaya-ipo-digit\">9</span>\n <span class=\"avaya-ipo-letters\">WXYZ</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('*')\">\n <span class=\"avaya-ipo-digit\">*</span>\n <span class=\"avaya-ipo-letters\"> </span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('0')\">\n <span class=\"avaya-ipo-digit\">0</span>\n <span class=\"avaya-ipo-letters\">+</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('#')\">\n <span class=\"avaya-ipo-digit\">#</span>\n <span class=\"avaya-ipo-letters\"> </span>\n </button>\n </div>\n\n <div class=\"avaya-ipo-actions\">\n <button type=\"submit\" class=\"avaya-ipo-call-btn-main\" [disabled]=\"!this.dialForm.valid\">\n <svg viewBox=\"0 0 512 512\" width=\"22px\" height=\"22px\" fill=\"currentColor\" aria-hidden=\"true\">\n <path\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n </div>\n </div>\n</form>\n", styles: [":host{display:flex;flex-direction:column;height:100%;min-height:0}.avaya-ipo-phone-shell.avaya-ipo-classic{--key-size: clamp(40px, min(24cqw, 18cqh - 30px), 88px);--key-gap: calc(var(--key-size) * .16);display:flex;flex-direction:column;align-items:center;justify-content:flex-start;gap:clamp(35px,4.5cqw,30px);background:transparent;width:100%;height:100%;flex:1 1 auto;min-height:0;padding:46px 15px clamp(12px,3cqw,20px);box-sizing:border-box}.avaya-ipo-dial-cluster{flex:1 1 auto;min-height:0;width:100%;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;gap:clamp(10px,2.6cqw,18px)}.avaya-ipo-classic-input{width:100%;display:flex;align-items:center;padding:0;box-sizing:border-box;position:relative;border:1.5px solid var(--sd-input-border);border-radius:var(--sd-radius);background:var(--sd-input);box-shadow:var(--sd-shadow-sm);margin-bottom:0;transition:border-color .18s ease,box-shadow .18s ease}.avaya-ipo-classic-input:focus-within{border-color:var(--sd-accent);box-shadow:var(--sd-focus-ring)}.avaya-ipo-clear-btn{position:absolute;right:clamp(5px,1.6cqw,9px);top:50%;transform:translateY(-50%);width:34px;height:34px;display:inline-flex;align-items:center;justify-content:center;border:none;background:transparent;color:var(--sd-text-subtle);border-radius:50%;padding:0;cursor:pointer;transition:background .15s ease,color .15s ease,transform .1s ease}.avaya-ipo-clear-btn:hover{background:var(--sd-surface-muted);color:var(--sd-accent)}.avaya-ipo-clear-btn:active{transform:translateY(-50%) scale(.9)}.avaya-ipo-clear-btn:focus{outline:none;box-shadow:none}.avaya-ipo-clear-btn:focus-visible{outline:none;box-shadow:var(--sd-focus-ring)}.avaya-ipo-clear-btn svg{display:block}.avaya-ipo-classic-input .avaya-ipo-phone_number_sd{width:100%}.avaya-ipo-classic-input .avaya-ipo-phone_number_sd input{width:100%;border:none!important;box-shadow:none!important;background:transparent!important;padding:clamp(8px,calc(var(--key-size) * .16),15px) 46px clamp(8px,calc(var(--key-size) * .16),15px) 0!important;font-size:clamp(12px,calc(var(--key-size) * .27),20px)!important;font-weight:600;letter-spacing:.4px;color:var(--sd-text)!important}.avaya-ipo-classic-input .avaya-ipo-phone_number_sd input::placeholder{font-weight:400;letter-spacing:normal;color:var(--sd-text-subtle)}:host ::ng-deep .avaya-ipo-classic-input .iti{width:100%}:host ::ng-deep .avaya-ipo-classic-input .iti__selected-flag{padding:0 10px 0 14px;border-right:1px solid var(--sd-border);border-radius:calc(var(--sd-radius) - 2px) 0 0 calc(var(--sd-radius) - 2px);background:transparent;outline:none;transition:background .15s ease}:host ::ng-deep .avaya-ipo-classic-input .iti--allow-dropdown .iti__flag-container:hover .iti__selected-flag{background:var(--sd-surface-muted)}:host ::ng-deep .avaya-ipo-classic-input .selected-dial-code{margin-left:6px;font-size:clamp(12px,calc(var(--key-size) * .18),16px);font-weight:600;color:var(--sd-text)}:host ::ng-deep .avaya-ipo-classic-input .iti__selected-flag:focus,:host ::ng-deep .avaya-ipo-classic-input .iti__tel-input:focus,.avaya-ipo-classic-input .avaya-ipo-phone_number_sd input:focus{outline:none;box-shadow:none}:host ::ng-deep .avaya-ipo-classic-input .iti__tel-input{background:transparent!important;border:none!important;box-shadow:none!important;height:auto;padding:clamp(8px,calc(var(--key-size) * .16),15px) 46px clamp(8px,calc(var(--key-size) * .16),15px) 0;font-size:clamp(12px,calc(var(--key-size) * .27),20px);font-weight:600;letter-spacing:.4px;color:var(--sd-text)}:host ::ng-deep .avaya-ipo-classic-input .iti.separate-dial-code .iti__tel-input{padding-left:102px!important}:host ::ng-deep .avaya-ipo-classic-input .iti__dropdown-content,:host ::ng-deep .avaya-ipo-classic-input .dropdown-menu{z-index:30;min-width:248px;padding:6px;background:var(--sd-surface);border:1px solid var(--sd-border);border-radius:var(--sd-radius);box-shadow:var(--sd-shadow-lg)}:host ::ng-deep .avaya-ipo-classic-input .iti__country-list{max-height:220px;overflow-y:auto;margin:0;padding:0;border:none;box-shadow:none;background:transparent}:host ::ng-deep .avaya-ipo-classic-input .search-container{position:sticky;top:0;z-index:1;padding:0 0 6px;background:var(--sd-surface)}:host ::ng-deep .avaya-ipo-classic-input #country-search-box{width:100%;box-sizing:border-box;margin:0!important;padding:8px 12px!important;font-size:14px!important;font-weight:400!important;letter-spacing:normal!important;color:var(--sd-text)!important;background:var(--sd-input)!important;border:1px solid var(--sd-input-border)!important;border-radius:var(--sd-radius-sm)!important;box-shadow:none!important;height:auto!important;transition:border-color .15s ease,box-shadow .15s ease}:host ::ng-deep .avaya-ipo-classic-input #country-search-box:focus{outline:none!important;border-color:var(--sd-accent)!important;box-shadow:var(--sd-focus-ring)!important}:host ::ng-deep .avaya-ipo-classic-input #country-search-box::placeholder{color:var(--sd-text-subtle)!important}:host ::ng-deep .avaya-ipo-classic-input .iti__country{padding:7px 8px;border-radius:var(--sd-radius-sm);font-size:14px;color:var(--sd-text)}:host ::ng-deep .avaya-ipo-classic-input .iti__country.iti__highlight,:host ::ng-deep .avaya-ipo-classic-input .iti__country:hover{background:var(--sd-surface-muted)}:host ::ng-deep .avaya-ipo-classic-input .iti__country .iti__dial-code{color:var(--sd-text-subtle)}:host ::ng-deep .avaya-ipo-classic-input .iti__divider{border-top:1px solid var(--sd-border);margin:4px 0}.avaya-ipo-classic-grid{width:auto;margin:0 auto;display:grid;grid-template-columns:repeat(3,var(--key-size));gap:var(--key-gap);justify-content:center;flex:0 1 auto}.avaya-ipo-classic-grid button{width:var(--key-size);height:var(--key-size);border-radius:50%;border:1.6px solid var(--sd-border-strong);background:transparent;display:flex;flex-direction:column;align-items:center;justify-content:center;cursor:pointer}.avaya-ipo-classic-grid button:focus{outline:none;box-shadow:none}.avaya-ipo-classic-grid button:focus-visible{outline:none;box-shadow:var(--sd-focus-ring)}.avaya-ipo-classic-grid button:active{background:var(--sd-surface-muted)}.avaya-ipo-classic-grid .avaya-ipo-digit{font-size:clamp(15px,calc(var(--key-size) * .34),26px);font-weight:400;color:var(--sd-text);line-height:1.1}.avaya-ipo-classic-grid .avaya-ipo-letters{font-size:clamp(7px,calc(var(--key-size) * .12),10px);letter-spacing:.8px;color:var(--sd-text-subtle);margin-top:2px}.avaya-ipo-actions{display:flex;justify-content:center;width:100%;margin-top:0}.avaya-ipo-call-btn-main{width:var(--key-size);height:var(--key-size);border-radius:50%;border:none;background:var(--sd-call-accept);color:var(--sd-accent-contrast);display:inline-flex;align-items:center;justify-content:center;box-shadow:var(--sd-shadow-md);cursor:pointer}.avaya-ipo-call-btn-main:disabled{opacity:.4;cursor:not-allowed}\n"] }]
|
|
2793
3251
|
}], propDecorators: { dialForm: [{
|
|
2794
3252
|
type: Input
|
|
2795
3253
|
}], contacts: [{
|
|
@@ -2822,11 +3280,11 @@ class PhoneIncomingComponent {
|
|
|
2822
3280
|
accept = new EventEmitter();
|
|
2823
3281
|
decline = new EventEmitter();
|
|
2824
3282
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: PhoneIncomingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2825
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: PhoneIncomingComponent, isStandalone: false, selector: "app-phone-incoming", inputs: { incomingCallName: "incomingCallName", incomingNameResolved: "incomingNameResolved", incomingCallNumber: "incomingCallNumber" }, outputs: { accept: "accept", decline: "decline" }, ngImport: i0, template: "<div class=\"incoming-screen\">\n <div class=\"incoming-avatar\">\n <img [src]=\"incomingAvatarUrl\" alt=\"Incoming call avatar\" />\n </div>\n\n <div class=\"incoming-title\">\n @if (incomingCallName) {\n {{ incomingCallName }}\n } @else if (incomingNameResolved) {\n Unknown caller\n } @else {\n \n }\n </div>\n <div class=\"incoming-subtitle\">\n {{ incomingCallNumber || 'Unknown number' }}\n </div>\n <div class=\"incoming-status\">CALLING...</div>\n\n <div class=\"incoming-actions\">\n <button type=\"button\" class=\"incoming-btn accept\" (click)=\"accept.emit()\">\n <span class=\"btn-icon\">\n <svg height=\"20\" viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\"\n />\n </svg>\n </span>\n </button>\n <button type=\"button\" class=\"incoming-btn decline\" (click)=\"decline.emit()\">\n <span class=\"btn-icon\">\n <svg height=\"20\" viewBox=\"0 0 640 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M11.7 266.3l41.9 94.3c6.1 13.7 20.8 21.3 35.5 18.4l109.2-21.8c15-3 25.7-16.1 25.7-31.4V240c62.3-20.8 129.7-20.8 192 0v85.8c0 15.3 10.8 28.4 25.7 31.4L550.9 379c14.7 2.9 29.4-4.7 35.5-18.4l41.9-94.3c7.2-16.2 5.1-35.1-7.4-47.7C570.8 168.1 464.2 96 320 96S69.2 168.1 19.1 218.6c-12.5 12.6-14.6 31.5-7.4 47.7z\"\n />\n </svg>\n </span>\n </button>\n </div>\n\n</div>\n", styles: [".incoming-screen{display:flex;flex-direction:column;align-items:center;gap:14px;padding:28px 16px 24px;text-align:center;min-height:100%;height:100%;justify-content:center;color
|
|
3283
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: PhoneIncomingComponent, isStandalone: false, selector: "app-phone-incoming", inputs: { incomingCallName: "incomingCallName", incomingNameResolved: "incomingNameResolved", incomingCallNumber: "incomingCallNumber" }, outputs: { accept: "accept", decline: "decline" }, ngImport: i0, template: "<div class=\"avaya-ipo-incoming-screen\">\n <div class=\"avaya-ipo-incoming-avatar\">\n <img [src]=\"incomingAvatarUrl\" alt=\"Incoming call avatar\" />\n </div>\n\n <div class=\"avaya-ipo-incoming-title\">\n @if (incomingCallName) {\n {{ incomingCallName }}\n } @else if (incomingNameResolved) {\n Unknown caller\n } @else {\n \n }\n </div>\n <div class=\"avaya-ipo-incoming-subtitle\">\n {{ incomingCallNumber || 'Unknown number' }}\n </div>\n <div class=\"avaya-ipo-incoming-status\">CALLING...</div>\n\n <div class=\"avaya-ipo-incoming-actions\">\n <button type=\"button\" class=\"avaya-ipo-incoming-btn avaya-ipo-accept\" (click)=\"accept.emit()\">\n <span class=\"avaya-ipo-btn-icon\">\n <svg height=\"20\" viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\"\n />\n </svg>\n </span>\n </button>\n <button type=\"button\" class=\"avaya-ipo-incoming-btn avaya-ipo-decline\" (click)=\"decline.emit()\">\n <span class=\"avaya-ipo-btn-icon\">\n <svg height=\"20\" viewBox=\"0 0 640 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M11.7 266.3l41.9 94.3c6.1 13.7 20.8 21.3 35.5 18.4l109.2-21.8c15-3 25.7-16.1 25.7-31.4V240c62.3-20.8 129.7-20.8 192 0v85.8c0 15.3 10.8 28.4 25.7 31.4L550.9 379c14.7 2.9 29.4-4.7 35.5-18.4l41.9-94.3c7.2-16.2 5.1-35.1-7.4-47.7C570.8 168.1 464.2 96 320 96S69.2 168.1 19.1 218.6c-12.5 12.6-14.6 31.5-7.4 47.7z\"\n />\n </svg>\n </span>\n </button>\n </div>\n\n</div>\n", styles: [".avaya-ipo-incoming-screen{display:flex;flex-direction:column;align-items:center;gap:14px;padding:28px 16px 24px;text-align:center;min-height:100%;height:100%;justify-content:center;color:var(--sd-text)}.avaya-ipo-incoming-avatar img{width:96px;height:96px;object-fit:cover;border-radius:50%;animation:avatar-pulse 1.8s ease-in-out infinite}.avaya-ipo-incoming-title{font-size:24px;font-weight:700;color:var(--sd-text)}.avaya-ipo-incoming-subtitle{font-size:14px;color:var(--sd-text-muted)}.avaya-ipo-incoming-actions{display:flex;gap:clamp(2.5rem,22%,7rem);margin-top:clamp(1.5rem,8%,5rem)}.avaya-ipo-incoming-btn{border:none;border-radius:50%;width:72px;height:72px;display:inline-flex;align-items:center;justify-content:center;flex-direction:column;gap:4px;font-weight:600;cursor:pointer;background:var(--sd-card);color:var(--sd-text)}.avaya-ipo-incoming-btn .avaya-ipo-btn-icon{display:inline-flex;align-items:center;justify-content:center}.avaya-ipo-incoming-btn.avaya-ipo-accept{background:var(--sd-call-accept);color:var(--sd-accent-contrast);border:none}.avaya-ipo-incoming-btn.avaya-ipo-decline{background:var(--sd-call-end);color:var(--sd-accent-contrast);border:none}.avaya-ipo-incoming-status{letter-spacing:2px;font-size:13px;color:var(--sd-text-muted)}.avaya-ipo-incoming-avatar{position:relative}@keyframes avatar-pulse{0%{box-shadow:0 0 #1aa25159}70%{box-shadow:0 0 0 16px #1aa25100}to{box-shadow:0 0 #1aa25100}}\n"] });
|
|
2826
3284
|
}
|
|
2827
3285
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: PhoneIncomingComponent, decorators: [{
|
|
2828
3286
|
type: Component,
|
|
2829
|
-
args: [{ selector: 'app-phone-incoming', standalone: false, template: "<div class=\"incoming-screen\">\n <div class=\"incoming-avatar\">\n <img [src]=\"incomingAvatarUrl\" alt=\"Incoming call avatar\" />\n </div>\n\n <div class=\"incoming-title\">\n @if (incomingCallName) {\n {{ incomingCallName }}\n } @else if (incomingNameResolved) {\n Unknown caller\n } @else {\n \n }\n </div>\n <div class=\"incoming-subtitle\">\n {{ incomingCallNumber || 'Unknown number' }}\n </div>\n <div class=\"incoming-status\">CALLING...</div>\n\n <div class=\"incoming-actions\">\n <button type=\"button\" class=\"incoming-btn accept\" (click)=\"accept.emit()\">\n <span class=\"btn-icon\">\n <svg height=\"20\" viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\"\n />\n </svg>\n </span>\n </button>\n <button type=\"button\" class=\"incoming-btn decline\" (click)=\"decline.emit()\">\n <span class=\"btn-icon\">\n <svg height=\"20\" viewBox=\"0 0 640 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M11.7 266.3l41.9 94.3c6.1 13.7 20.8 21.3 35.5 18.4l109.2-21.8c15-3 25.7-16.1 25.7-31.4V240c62.3-20.8 129.7-20.8 192 0v85.8c0 15.3 10.8 28.4 25.7 31.4L550.9 379c14.7 2.9 29.4-4.7 35.5-18.4l41.9-94.3c7.2-16.2 5.1-35.1-7.4-47.7C570.8 168.1 464.2 96 320 96S69.2 168.1 19.1 218.6c-12.5 12.6-14.6 31.5-7.4 47.7z\"\n />\n </svg>\n </span>\n </button>\n </div>\n\n</div>\n", styles: [".incoming-screen{display:flex;flex-direction:column;align-items:center;gap:14px;padding:28px 16px 24px;text-align:center;min-height:100%;height:100%;justify-content:center;color
|
|
3287
|
+
args: [{ selector: 'app-phone-incoming', standalone: false, template: "<div class=\"avaya-ipo-incoming-screen\">\n <div class=\"avaya-ipo-incoming-avatar\">\n <img [src]=\"incomingAvatarUrl\" alt=\"Incoming call avatar\" />\n </div>\n\n <div class=\"avaya-ipo-incoming-title\">\n @if (incomingCallName) {\n {{ incomingCallName }}\n } @else if (incomingNameResolved) {\n Unknown caller\n } @else {\n \n }\n </div>\n <div class=\"avaya-ipo-incoming-subtitle\">\n {{ incomingCallNumber || 'Unknown number' }}\n </div>\n <div class=\"avaya-ipo-incoming-status\">CALLING...</div>\n\n <div class=\"avaya-ipo-incoming-actions\">\n <button type=\"button\" class=\"avaya-ipo-incoming-btn avaya-ipo-accept\" (click)=\"accept.emit()\">\n <span class=\"avaya-ipo-btn-icon\">\n <svg height=\"20\" viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\"\n />\n </svg>\n </span>\n </button>\n <button type=\"button\" class=\"avaya-ipo-incoming-btn avaya-ipo-decline\" (click)=\"decline.emit()\">\n <span class=\"avaya-ipo-btn-icon\">\n <svg height=\"20\" viewBox=\"0 0 640 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M11.7 266.3l41.9 94.3c6.1 13.7 20.8 21.3 35.5 18.4l109.2-21.8c15-3 25.7-16.1 25.7-31.4V240c62.3-20.8 129.7-20.8 192 0v85.8c0 15.3 10.8 28.4 25.7 31.4L550.9 379c14.7 2.9 29.4-4.7 35.5-18.4l41.9-94.3c7.2-16.2 5.1-35.1-7.4-47.7C570.8 168.1 464.2 96 320 96S69.2 168.1 19.1 218.6c-12.5 12.6-14.6 31.5-7.4 47.7z\"\n />\n </svg>\n </span>\n </button>\n </div>\n\n</div>\n", styles: [".avaya-ipo-incoming-screen{display:flex;flex-direction:column;align-items:center;gap:14px;padding:28px 16px 24px;text-align:center;min-height:100%;height:100%;justify-content:center;color:var(--sd-text)}.avaya-ipo-incoming-avatar img{width:96px;height:96px;object-fit:cover;border-radius:50%;animation:avatar-pulse 1.8s ease-in-out infinite}.avaya-ipo-incoming-title{font-size:24px;font-weight:700;color:var(--sd-text)}.avaya-ipo-incoming-subtitle{font-size:14px;color:var(--sd-text-muted)}.avaya-ipo-incoming-actions{display:flex;gap:clamp(2.5rem,22%,7rem);margin-top:clamp(1.5rem,8%,5rem)}.avaya-ipo-incoming-btn{border:none;border-radius:50%;width:72px;height:72px;display:inline-flex;align-items:center;justify-content:center;flex-direction:column;gap:4px;font-weight:600;cursor:pointer;background:var(--sd-card);color:var(--sd-text)}.avaya-ipo-incoming-btn .avaya-ipo-btn-icon{display:inline-flex;align-items:center;justify-content:center}.avaya-ipo-incoming-btn.avaya-ipo-accept{background:var(--sd-call-accept);color:var(--sd-accent-contrast);border:none}.avaya-ipo-incoming-btn.avaya-ipo-decline{background:var(--sd-call-end);color:var(--sd-accent-contrast);border:none}.avaya-ipo-incoming-status{letter-spacing:2px;font-size:13px;color:var(--sd-text-muted)}.avaya-ipo-incoming-avatar{position:relative}@keyframes avatar-pulse{0%{box-shadow:0 0 #1aa25159}70%{box-shadow:0 0 0 16px #1aa25100}to{box-shadow:0 0 #1aa25100}}\n"] }]
|
|
2830
3288
|
}], propDecorators: { incomingCallName: [{
|
|
2831
3289
|
type: Input
|
|
2832
3290
|
}], incomingNameResolved: [{
|
|
@@ -2925,11 +3383,11 @@ class PhoneActiveComponent {
|
|
|
2925
3383
|
return `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;
|
|
2926
3384
|
}
|
|
2927
3385
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: PhoneActiveComponent, deps: [{ token: EntitiesSearchService }], target: i0.ɵɵFactoryTarget.Component });
|
|
2928
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: PhoneActiveComponent, isStandalone: false, selector: "app-phone-active", inputs: { tenantId: "tenantId", activeCallName: "activeCallName", activeCallNumber: "activeCallNumber", activeCallDuration: "activeCallDuration", callStatusText: "callStatusText", isConnecting: "isConnecting", isMuted: "isMuted", isHeld: "isHeld" }, outputs: { endCall: "endCall", toggleMute: "toggleMute", toggleHold: "toggleHold", transfer: "transfer", openContacts: "openContacts", openKeypad: "openKeypad", startTranscription: "startTranscription", contactsLoaded: "contactsLoaded" }, ngImport: i0, template: "<div class=\"active-screen\">\n <div class=\"active-avatar\">\n <img [src]=\"activeAvatarUrl\" alt=\"Active call avatar\" />\n </div>\n\n <div class=\"active-title\">{{ activeCallName || 'Unknown' }}</div>\n <div class=\"active-number\">{{ activeCallNumber || '' }}</div>\n <div class=\"active-duration\" [class.is-disconnected]=\"callStatusText === 'Disconnected'\">\n {{ callStatusText || formatDuration(activeCallDuration) }}\n </div>\n\n <div class=\"active-controls\">\n <div class=\"control-item\">\n <button type=\"button\" class=\"control-btn\" aria-label=\"Add call\" [disabled]=\"isConnecting\" [class.is-disabled]=\"isConnecting\" (click)=\"openContacts.emit()\">\n <svg viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M256 48c13.3 0 24 10.7 24 24V200H408c13.3 0 24 10.7 24 24s-10.7 24-24 24H280V376c0 13.3-10.7 24-24 24s-24-10.7-24-24V248H104c-13.3 0-24-10.7-24-24s10.7-24 24-24H232V72c0-13.3 10.7-24 24-24z\"\n />\n </svg>\n </button>\n <span class=\"control-label\">Add Call</span>\n </div>\n <div class=\"control-item\">\n <button type=\"button\" class=\"control-btn\" aria-label=\"Transfer\" [disabled]=\"isConnecting\" [class.is-disabled]=\"isConnecting\" (click)=\"transfer.emit()\">\n <svg viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M352 64c0-17.7 14.3-32 32-32h80c26.5 0 48 21.5 48 48v80c0 17.7-14.3 32-32 32s-32-14.3-32-32V128h-32c-17.7 0-32-14.3-32-32zM32 224c0-26.5 21.5-48 48-48h128c17.7 0 32 14.3 32 32s-14.3 32-32 32H96v96h112c17.7 0 32 14.3 32 32s-14.3 32-32 32H80c-26.5 0-48-21.5-48-48V224zm260.7 14.1 96-96c12.5-12.5 32.8-12.5 45.3 0s12.5 32.8 0 45.3l-41.4 41.4H448c17.7 0 32 14.3 32 32s-14.3 32-32 32h-55.4l41.4 41.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0l-96-96c-12.5-12.5-12.5-32.8 0-45.3z\"\n />\n </svg>\n </button>\n <span class=\"control-label\">Transfer</span>\n </div>\n <div class=\"control-item\">\n <button type=\"button\" class=\"control-btn\" [class.active]=\"isMuted\" aria-label=\"Mute\" [disabled]=\"isConnecting\" [class.is-disabled]=\"isConnecting\" (click)=\"toggleMute.emit()\">\n @if (isMuted) {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M19 11a7 7 0 0 1-1.4 4.2l-1.5-1.5A5 5 0 0 0 17 11h2zm-7 7a7 7 0 0 0 4.2-1.4l1.4 1.4A9 9 0 0 1 12 20a9 9 0 0 1-7.4-3.8l1.5-1.5A7 7 0 0 0 12 18zm0-14a3 3 0 0 1 3 3v3.6l-6-6V7a3 3 0 0 1 3-3zm7.7 16.3-16-16 1.4-1.4 16 16-1.4 1.4z\"\n />\n </svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M12 2a3 3 0 0 1 3 3v6a3 3 0 0 1-6 0V5a3 3 0 0 1 3-3zm5 9a5 5 0 0 1-10 0H5a7 7 0 0 0 14 0h-2zm-5 9a7 7 0 0 0 4.9-2H7.1A7 7 0 0 0 12 20zm-1 2h2v2h-2v-2z\"\n />\n </svg>\n }\n </button>\n <span class=\"control-label\">{{ isMuted ? 'Unmute' : 'Mute' }}</span>\n </div>\n <div class=\"control-item\">\n <button type=\"button\" class=\"control-btn\" [class.active]=\"isHeld\" aria-label=\"Hold\" [disabled]=\"isConnecting\" [class.is-disabled]=\"isConnecting\" (click)=\"toggleHold.emit()\">\n @if (isHeld) {\n <svg viewBox=\"0 0 384 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M73 39C60.6 31.7 45.1 31.7 32.7 39 20.4 46.3 12.7 60.3 12.7 75.5V436.5c0 15.2 7.7 29.2 20 36.5 12.3 7.3 27.9 7.3 40.3 0L329 292.5c12.3-7.3 20-21.3 20-36.5s-7.7-29.2-20-36.5L73 39z\"\n />\n </svg>\n } @else {\n <svg viewBox=\"0 0 320 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M48 64c0-26.5 21.5-48 48-48h32c26.5 0 48 21.5 48 48v384c0 26.5-21.5 48-48 48H96c-26.5 0-48-21.5-48-48V64zm144 0c0-26.5 21.5-48 48-48h32c26.5 0 48 21.5 48 48v384c0 26.5-21.5 48-48 48h-32c-26.5 0-48-21.5-48-48V64z\"\n />\n </svg>\n }\n </button>\n <span class=\"control-label\">{{ isHeld ? 'Unhold' : 'Hold' }}</span>\n </div>\n <div class=\"control-item\">\n <button type=\"button\" class=\"control-btn\" aria-label=\"Keypad\" [disabled]=\"isConnecting\" [class.is-disabled]=\"isConnecting\" (click)=\"openKeypad.emit()\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <circle cx=\"7\" cy=\"7\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"7\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"17\" cy=\"7\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"17\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"17\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"17\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"17\" cy=\"17\" r=\"1.6\" fill=\"currentColor\" />\n </svg>\n </button>\n <span class=\"control-label\">Keypad</span>\n </div>\n <div class=\"control-item\">\n <button type=\"button\" class=\"control-btn\" aria-label=\"Live transcription\" (click)=\"startTranscription.emit()\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M5 4h14a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H9l-4 3v-3H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2zm2 4h10v2H7V8zm0 4h10v2H7v-2z\"\n />\n </svg>\n </button>\n <span class=\"control-label\">Transcript</span>\n </div>\n </div>\n\n <div class=\"active-bottom\">\n <button type=\"button\" class=\"end-call-btn\" (click)=\"endCall.emit()\">\n <span class=\"btn-icon\">\n <svg height=\"20\" viewBox=\"0 0 640 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M11.7 266.3l41.9 94.3c6.1 13.7 20.8 21.3 35.5 18.4l109.2-21.8c15-3 25.7-16.1 25.7-31.4V240c62.3-20.8 129.7-20.8 192 0v85.8c0 15.3 10.8 28.4 25.7 31.4L550.9 379c14.7 2.9 29.4-4.7 35.5-18.4l41.9-94.3c7.2-16.2 5.1-35.1-7.4-47.7C570.8 168.1 464.2 96 320 96S69.2 168.1 19.1 218.6c-12.5 12.6-14.6 31.5-7.4 47.7z\"\n />\n </svg>\n </span>\n </button>\n </div>\n\n</div>\n", styles: [".active-screen{display:flex;flex-direction:column;align-items:center;gap:16px;padding:28px 16px 24px;text-align:center;min-height:100%;height:100%;justify-content:center;color:#1f1f1f}.active-avatar img{width:96px;height:96px;object-fit:cover;border-radius:50%;animation:avatar-pulse-active 2s ease-in-out infinite}@keyframes avatar-pulse-active{0%{box-shadow:0 0 #e33a2e40}70%{box-shadow:0 0 0 14px #e33a2e00}to{box-shadow:0 0 #e33a2e00}}.active-title{font-size:18px;font-weight:600;color:#6b6b6b}.active-number{font-size:16px;font-weight:600;color:#1f1f1f}.active-duration{font-size:14px;color:#6f6f6f}.active-duration.is-disconnected{color:#e23a2e;font-weight:700}.active-controls{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px 24px;margin-top:12px;justify-items:center}.control-item{display:flex;flex-direction:column;align-items:center;gap:6px}.control-btn{width:64px;height:64px;border-radius:50%;border:1px solid #e0e0e0;background:transparent;color:#4a4a4a;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.control-btn:hover{background:#f5f5f5}.control-btn.active{background:#e8f1ff;color:#1b5fbf;border-color:#c6daf7}.control-btn.is-disabled,.control-btn:disabled{opacity:.45;cursor:not-allowed;pointer-events:none}.control-btn svg{width:22px;height:22px}.control-label{font-size:11px;font-weight:600;color:#6b6b6b}.active-bottom{display:flex;align-items:center;justify-content:center;margin-top:22px}.end-call-btn{width:72px;height:72px;border-radius:50%;border:none;background:#e23a2e;color:#fff;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}\n"] });
|
|
3386
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: PhoneActiveComponent, isStandalone: false, selector: "app-phone-active", inputs: { tenantId: "tenantId", activeCallName: "activeCallName", activeCallNumber: "activeCallNumber", activeCallDuration: "activeCallDuration", callStatusText: "callStatusText", isConnecting: "isConnecting", isMuted: "isMuted", isHeld: "isHeld" }, outputs: { endCall: "endCall", toggleMute: "toggleMute", toggleHold: "toggleHold", transfer: "transfer", openContacts: "openContacts", openKeypad: "openKeypad", startTranscription: "startTranscription", contactsLoaded: "contactsLoaded" }, ngImport: i0, template: "<div class=\"avaya-ipo-active-screen\">\n <div class=\"avaya-ipo-active-avatar\">\n <img [src]=\"activeAvatarUrl\" alt=\"Active call avatar\" />\n </div>\n\n <div class=\"avaya-ipo-active-title\">{{ activeCallName || 'Unknown' }}</div>\n <div class=\"avaya-ipo-active-number\">{{ activeCallNumber || '' }}</div>\n <div class=\"avaya-ipo-active-duration\" [class.avaya-ipo-is-disconnected]=\"callStatusText === 'Disconnected'\">\n {{ callStatusText || formatDuration(activeCallDuration) }}\n </div>\n\n <div class=\"avaya-ipo-active-controls\">\n <div class=\"avaya-ipo-control-item\">\n <button type=\"button\" class=\"avaya-ipo-control-btn\" aria-label=\"Add call\" [disabled]=\"isConnecting\" [class.avaya-ipo-is-disabled]=\"isConnecting\" (click)=\"openContacts.emit()\">\n <svg viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M256 48c13.3 0 24 10.7 24 24V200H408c13.3 0 24 10.7 24 24s-10.7 24-24 24H280V376c0 13.3-10.7 24-24 24s-24-10.7-24-24V248H104c-13.3 0-24-10.7-24-24s10.7-24 24-24H232V72c0-13.3 10.7-24 24-24z\"\n />\n </svg>\n </button>\n <span class=\"avaya-ipo-control-label\">Add Call</span>\n </div>\n <div class=\"avaya-ipo-control-item\">\n <button type=\"button\" class=\"avaya-ipo-control-btn\" aria-label=\"Transfer\" [disabled]=\"isConnecting\" [class.avaya-ipo-is-disabled]=\"isConnecting\" (click)=\"transfer.emit()\">\n <svg viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M352 64c0-17.7 14.3-32 32-32h80c26.5 0 48 21.5 48 48v80c0 17.7-14.3 32-32 32s-32-14.3-32-32V128h-32c-17.7 0-32-14.3-32-32zM32 224c0-26.5 21.5-48 48-48h128c17.7 0 32 14.3 32 32s-14.3 32-32 32H96v96h112c17.7 0 32 14.3 32 32s-14.3 32-32 32H80c-26.5 0-48-21.5-48-48V224zm260.7 14.1 96-96c12.5-12.5 32.8-12.5 45.3 0s12.5 32.8 0 45.3l-41.4 41.4H448c17.7 0 32 14.3 32 32s-14.3 32-32 32h-55.4l41.4 41.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0l-96-96c-12.5-12.5-12.5-32.8 0-45.3z\"\n />\n </svg>\n </button>\n <span class=\"avaya-ipo-control-label\">Transfer</span>\n </div>\n <div class=\"avaya-ipo-control-item\">\n <button type=\"button\" class=\"avaya-ipo-control-btn\" [class.avaya-ipo-active]=\"isMuted\" aria-label=\"Mute\" [disabled]=\"isConnecting\" [class.avaya-ipo-is-disabled]=\"isConnecting\" (click)=\"toggleMute.emit()\">\n @if (isMuted) {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M19 11a7 7 0 0 1-1.4 4.2l-1.5-1.5A5 5 0 0 0 17 11h2zm-7 7a7 7 0 0 0 4.2-1.4l1.4 1.4A9 9 0 0 1 12 20a9 9 0 0 1-7.4-3.8l1.5-1.5A7 7 0 0 0 12 18zm0-14a3 3 0 0 1 3 3v3.6l-6-6V7a3 3 0 0 1 3-3zm7.7 16.3-16-16 1.4-1.4 16 16-1.4 1.4z\"\n />\n </svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M12 2a3 3 0 0 1 3 3v6a3 3 0 0 1-6 0V5a3 3 0 0 1 3-3zm5 9a5 5 0 0 1-10 0H5a7 7 0 0 0 14 0h-2zm-5 9a7 7 0 0 0 4.9-2H7.1A7 7 0 0 0 12 20zm-1 2h2v2h-2v-2z\"\n />\n </svg>\n }\n </button>\n <span class=\"avaya-ipo-control-label\">{{ isMuted ? 'Unmute' : 'Mute' }}</span>\n </div>\n <div class=\"avaya-ipo-control-item\">\n <button type=\"button\" class=\"avaya-ipo-control-btn\" [class.avaya-ipo-active]=\"isHeld\" aria-label=\"Hold\" [disabled]=\"isConnecting\" [class.avaya-ipo-is-disabled]=\"isConnecting\" (click)=\"toggleHold.emit()\">\n @if (isHeld) {\n <svg viewBox=\"0 0 384 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M73 39C60.6 31.7 45.1 31.7 32.7 39 20.4 46.3 12.7 60.3 12.7 75.5V436.5c0 15.2 7.7 29.2 20 36.5 12.3 7.3 27.9 7.3 40.3 0L329 292.5c12.3-7.3 20-21.3 20-36.5s-7.7-29.2-20-36.5L73 39z\"\n />\n </svg>\n } @else {\n <svg viewBox=\"0 0 320 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M48 64c0-26.5 21.5-48 48-48h32c26.5 0 48 21.5 48 48v384c0 26.5-21.5 48-48 48H96c-26.5 0-48-21.5-48-48V64zm144 0c0-26.5 21.5-48 48-48h32c26.5 0 48 21.5 48 48v384c0 26.5-21.5 48-48 48h-32c-26.5 0-48-21.5-48-48V64z\"\n />\n </svg>\n }\n </button>\n <span class=\"avaya-ipo-control-label\">{{ isHeld ? 'Unhold' : 'Hold' }}</span>\n </div>\n <div class=\"avaya-ipo-control-item\">\n <button type=\"button\" class=\"avaya-ipo-control-btn\" aria-label=\"Keypad\" [disabled]=\"isConnecting\" [class.avaya-ipo-is-disabled]=\"isConnecting\" (click)=\"openKeypad.emit()\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <circle cx=\"7\" cy=\"7\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"7\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"17\" cy=\"7\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"17\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"17\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"17\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"17\" cy=\"17\" r=\"1.6\" fill=\"currentColor\" />\n </svg>\n </button>\n <span class=\"avaya-ipo-control-label\">Keypad</span>\n </div>\n <div class=\"avaya-ipo-control-item\">\n <button type=\"button\" class=\"avaya-ipo-control-btn\" aria-label=\"Live transcription\" (click)=\"startTranscription.emit()\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M5 4h14a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H9l-4 3v-3H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2zm2 4h10v2H7V8zm0 4h10v2H7v-2z\"\n />\n </svg>\n </button>\n <span class=\"avaya-ipo-control-label\">Transcript</span>\n </div>\n </div>\n\n <div class=\"avaya-ipo-active-bottom\">\n <button type=\"button\" class=\"avaya-ipo-end-call-btn\" (click)=\"endCall.emit()\">\n <span class=\"avaya-ipo-btn-icon\">\n <svg height=\"20\" viewBox=\"0 0 640 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M11.7 266.3l41.9 94.3c6.1 13.7 20.8 21.3 35.5 18.4l109.2-21.8c15-3 25.7-16.1 25.7-31.4V240c62.3-20.8 129.7-20.8 192 0v85.8c0 15.3 10.8 28.4 25.7 31.4L550.9 379c14.7 2.9 29.4-4.7 35.5-18.4l41.9-94.3c7.2-16.2 5.1-35.1-7.4-47.7C570.8 168.1 464.2 96 320 96S69.2 168.1 19.1 218.6c-12.5 12.6-14.6 31.5-7.4 47.7z\"\n />\n </svg>\n </span>\n </button>\n </div>\n\n</div>\n", styles: [".avaya-ipo-active-screen{display:flex;flex-direction:column;align-items:center;gap:16px;padding:28px 16px 24px;text-align:center;min-height:100%;height:100%;justify-content:center;color:var(--sd-text)}.avaya-ipo-active-avatar img{width:96px;height:96px;object-fit:cover;border-radius:50%;animation:avatar-pulse-active 2s ease-in-out infinite}@keyframes avatar-pulse-active{0%{box-shadow:0 0 #e5484d40}70%{box-shadow:0 0 0 14px #e5484d00}to{box-shadow:0 0 #e5484d00}}.avaya-ipo-active-title{font-size:18px;font-weight:600;color:var(--sd-text-muted)}.avaya-ipo-active-number{font-size:16px;font-weight:600;color:var(--sd-text)}.avaya-ipo-active-duration{font-size:14px;color:var(--sd-text-muted)}.avaya-ipo-active-duration.avaya-ipo-is-disconnected{color:var(--sd-call-end);font-weight:700}.avaya-ipo-active-controls{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:clamp(12px,4%,18px) clamp(14px,6%,24px);margin-top:12px;justify-items:center}.avaya-ipo-control-item{display:flex;flex-direction:column;align-items:center;gap:6px}.avaya-ipo-control-btn{width:clamp(52px,16%,64px);aspect-ratio:1;height:auto;border-radius:50%;border:1px solid var(--sd-border);background:transparent;color:var(--sd-text-muted);display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.avaya-ipo-control-btn:hover{background:var(--sd-surface-muted)}.avaya-ipo-control-btn:focus-visible{outline:none;box-shadow:var(--sd-focus-ring)}.avaya-ipo-control-btn.avaya-ipo-active{background:var(--sd-accent-soft);color:var(--sd-accent);border-color:var(--sd-accent)}.avaya-ipo-control-btn.avaya-ipo-is-disabled,.avaya-ipo-control-btn:disabled{opacity:.45;cursor:not-allowed;pointer-events:none}.avaya-ipo-control-btn svg{width:22px;height:22px}.avaya-ipo-control-label{font-size:11px;font-weight:600;color:var(--sd-text-muted)}.avaya-ipo-active-bottom{display:flex;align-items:center;justify-content:center;margin-top:clamp(14px,5%,22px)}.avaya-ipo-end-call-btn{width:72px;height:72px;border-radius:50%;border:none;background:var(--sd-call-end);color:var(--sd-accent-contrast);display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.avaya-ipo-end-call-btn:hover{background:var(--sd-call-end);filter:brightness(.94)}.avaya-ipo-end-call-btn:focus-visible{outline:none;box-shadow:var(--sd-focus-ring)}\n"] });
|
|
2929
3387
|
}
|
|
2930
3388
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: PhoneActiveComponent, decorators: [{
|
|
2931
3389
|
type: Component,
|
|
2932
|
-
args: [{ selector: 'app-phone-active', standalone: false, template: "<div class=\"active-screen\">\n <div class=\"active-avatar\">\n <img [src]=\"activeAvatarUrl\" alt=\"Active call avatar\" />\n </div>\n\n <div class=\"active-title\">{{ activeCallName || 'Unknown' }}</div>\n <div class=\"active-number\">{{ activeCallNumber || '' }}</div>\n <div class=\"active-duration\" [class.is-disconnected]=\"callStatusText === 'Disconnected'\">\n {{ callStatusText || formatDuration(activeCallDuration) }}\n </div>\n\n <div class=\"active-controls\">\n <div class=\"control-item\">\n <button type=\"button\" class=\"control-btn\" aria-label=\"Add call\" [disabled]=\"isConnecting\" [class.is-disabled]=\"isConnecting\" (click)=\"openContacts.emit()\">\n <svg viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M256 48c13.3 0 24 10.7 24 24V200H408c13.3 0 24 10.7 24 24s-10.7 24-24 24H280V376c0 13.3-10.7 24-24 24s-24-10.7-24-24V248H104c-13.3 0-24-10.7-24-24s10.7-24 24-24H232V72c0-13.3 10.7-24 24-24z\"\n />\n </svg>\n </button>\n <span class=\"control-label\">Add Call</span>\n </div>\n <div class=\"control-item\">\n <button type=\"button\" class=\"control-btn\" aria-label=\"Transfer\" [disabled]=\"isConnecting\" [class.is-disabled]=\"isConnecting\" (click)=\"transfer.emit()\">\n <svg viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M352 64c0-17.7 14.3-32 32-32h80c26.5 0 48 21.5 48 48v80c0 17.7-14.3 32-32 32s-32-14.3-32-32V128h-32c-17.7 0-32-14.3-32-32zM32 224c0-26.5 21.5-48 48-48h128c17.7 0 32 14.3 32 32s-14.3 32-32 32H96v96h112c17.7 0 32 14.3 32 32s-14.3 32-32 32H80c-26.5 0-48-21.5-48-48V224zm260.7 14.1 96-96c12.5-12.5 32.8-12.5 45.3 0s12.5 32.8 0 45.3l-41.4 41.4H448c17.7 0 32 14.3 32 32s-14.3 32-32 32h-55.4l41.4 41.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0l-96-96c-12.5-12.5-12.5-32.8 0-45.3z\"\n />\n </svg>\n </button>\n <span class=\"control-label\">Transfer</span>\n </div>\n <div class=\"control-item\">\n <button type=\"button\" class=\"control-btn\" [class.active]=\"isMuted\" aria-label=\"Mute\" [disabled]=\"isConnecting\" [class.is-disabled]=\"isConnecting\" (click)=\"toggleMute.emit()\">\n @if (isMuted) {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M19 11a7 7 0 0 1-1.4 4.2l-1.5-1.5A5 5 0 0 0 17 11h2zm-7 7a7 7 0 0 0 4.2-1.4l1.4 1.4A9 9 0 0 1 12 20a9 9 0 0 1-7.4-3.8l1.5-1.5A7 7 0 0 0 12 18zm0-14a3 3 0 0 1 3 3v3.6l-6-6V7a3 3 0 0 1 3-3zm7.7 16.3-16-16 1.4-1.4 16 16-1.4 1.4z\"\n />\n </svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M12 2a3 3 0 0 1 3 3v6a3 3 0 0 1-6 0V5a3 3 0 0 1 3-3zm5 9a5 5 0 0 1-10 0H5a7 7 0 0 0 14 0h-2zm-5 9a7 7 0 0 0 4.9-2H7.1A7 7 0 0 0 12 20zm-1 2h2v2h-2v-2z\"\n />\n </svg>\n }\n </button>\n <span class=\"control-label\">{{ isMuted ? 'Unmute' : 'Mute' }}</span>\n </div>\n <div class=\"control-item\">\n <button type=\"button\" class=\"control-btn\" [class.active]=\"isHeld\" aria-label=\"Hold\" [disabled]=\"isConnecting\" [class.is-disabled]=\"isConnecting\" (click)=\"toggleHold.emit()\">\n @if (isHeld) {\n <svg viewBox=\"0 0 384 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M73 39C60.6 31.7 45.1 31.7 32.7 39 20.4 46.3 12.7 60.3 12.7 75.5V436.5c0 15.2 7.7 29.2 20 36.5 12.3 7.3 27.9 7.3 40.3 0L329 292.5c12.3-7.3 20-21.3 20-36.5s-7.7-29.2-20-36.5L73 39z\"\n />\n </svg>\n } @else {\n <svg viewBox=\"0 0 320 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M48 64c0-26.5 21.5-48 48-48h32c26.5 0 48 21.5 48 48v384c0 26.5-21.5 48-48 48H96c-26.5 0-48-21.5-48-48V64zm144 0c0-26.5 21.5-48 48-48h32c26.5 0 48 21.5 48 48v384c0 26.5-21.5 48-48 48h-32c-26.5 0-48-21.5-48-48V64z\"\n />\n </svg>\n }\n </button>\n <span class=\"control-label\">{{ isHeld ? 'Unhold' : 'Hold' }}</span>\n </div>\n <div class=\"control-item\">\n <button type=\"button\" class=\"control-btn\" aria-label=\"Keypad\" [disabled]=\"isConnecting\" [class.is-disabled]=\"isConnecting\" (click)=\"openKeypad.emit()\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <circle cx=\"7\" cy=\"7\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"7\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"17\" cy=\"7\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"17\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"17\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"17\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"17\" cy=\"17\" r=\"1.6\" fill=\"currentColor\" />\n </svg>\n </button>\n <span class=\"control-label\">Keypad</span>\n </div>\n <div class=\"control-item\">\n <button type=\"button\" class=\"control-btn\" aria-label=\"Live transcription\" (click)=\"startTranscription.emit()\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M5 4h14a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H9l-4 3v-3H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2zm2 4h10v2H7V8zm0 4h10v2H7v-2z\"\n />\n </svg>\n </button>\n <span class=\"control-label\">Transcript</span>\n </div>\n </div>\n\n <div class=\"active-bottom\">\n <button type=\"button\" class=\"end-call-btn\" (click)=\"endCall.emit()\">\n <span class=\"btn-icon\">\n <svg height=\"20\" viewBox=\"0 0 640 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M11.7 266.3l41.9 94.3c6.1 13.7 20.8 21.3 35.5 18.4l109.2-21.8c15-3 25.7-16.1 25.7-31.4V240c62.3-20.8 129.7-20.8 192 0v85.8c0 15.3 10.8 28.4 25.7 31.4L550.9 379c14.7 2.9 29.4-4.7 35.5-18.4l41.9-94.3c7.2-16.2 5.1-35.1-7.4-47.7C570.8 168.1 464.2 96 320 96S69.2 168.1 19.1 218.6c-12.5 12.6-14.6 31.5-7.4 47.7z\"\n />\n </svg>\n </span>\n </button>\n </div>\n\n</div>\n", styles: [".active-screen{display:flex;flex-direction:column;align-items:center;gap:16px;padding:28px 16px 24px;text-align:center;min-height:100%;height:100%;justify-content:center;color
|
|
3390
|
+
args: [{ selector: 'app-phone-active', standalone: false, template: "<div class=\"avaya-ipo-active-screen\">\n <div class=\"avaya-ipo-active-avatar\">\n <img [src]=\"activeAvatarUrl\" alt=\"Active call avatar\" />\n </div>\n\n <div class=\"avaya-ipo-active-title\">{{ activeCallName || 'Unknown' }}</div>\n <div class=\"avaya-ipo-active-number\">{{ activeCallNumber || '' }}</div>\n <div class=\"avaya-ipo-active-duration\" [class.avaya-ipo-is-disconnected]=\"callStatusText === 'Disconnected'\">\n {{ callStatusText || formatDuration(activeCallDuration) }}\n </div>\n\n <div class=\"avaya-ipo-active-controls\">\n <div class=\"avaya-ipo-control-item\">\n <button type=\"button\" class=\"avaya-ipo-control-btn\" aria-label=\"Add call\" [disabled]=\"isConnecting\" [class.avaya-ipo-is-disabled]=\"isConnecting\" (click)=\"openContacts.emit()\">\n <svg viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M256 48c13.3 0 24 10.7 24 24V200H408c13.3 0 24 10.7 24 24s-10.7 24-24 24H280V376c0 13.3-10.7 24-24 24s-24-10.7-24-24V248H104c-13.3 0-24-10.7-24-24s10.7-24 24-24H232V72c0-13.3 10.7-24 24-24z\"\n />\n </svg>\n </button>\n <span class=\"avaya-ipo-control-label\">Add Call</span>\n </div>\n <div class=\"avaya-ipo-control-item\">\n <button type=\"button\" class=\"avaya-ipo-control-btn\" aria-label=\"Transfer\" [disabled]=\"isConnecting\" [class.avaya-ipo-is-disabled]=\"isConnecting\" (click)=\"transfer.emit()\">\n <svg viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M352 64c0-17.7 14.3-32 32-32h80c26.5 0 48 21.5 48 48v80c0 17.7-14.3 32-32 32s-32-14.3-32-32V128h-32c-17.7 0-32-14.3-32-32zM32 224c0-26.5 21.5-48 48-48h128c17.7 0 32 14.3 32 32s-14.3 32-32 32H96v96h112c17.7 0 32 14.3 32 32s-14.3 32-32 32H80c-26.5 0-48-21.5-48-48V224zm260.7 14.1 96-96c12.5-12.5 32.8-12.5 45.3 0s12.5 32.8 0 45.3l-41.4 41.4H448c17.7 0 32 14.3 32 32s-14.3 32-32 32h-55.4l41.4 41.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0l-96-96c-12.5-12.5-12.5-32.8 0-45.3z\"\n />\n </svg>\n </button>\n <span class=\"avaya-ipo-control-label\">Transfer</span>\n </div>\n <div class=\"avaya-ipo-control-item\">\n <button type=\"button\" class=\"avaya-ipo-control-btn\" [class.avaya-ipo-active]=\"isMuted\" aria-label=\"Mute\" [disabled]=\"isConnecting\" [class.avaya-ipo-is-disabled]=\"isConnecting\" (click)=\"toggleMute.emit()\">\n @if (isMuted) {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M19 11a7 7 0 0 1-1.4 4.2l-1.5-1.5A5 5 0 0 0 17 11h2zm-7 7a7 7 0 0 0 4.2-1.4l1.4 1.4A9 9 0 0 1 12 20a9 9 0 0 1-7.4-3.8l1.5-1.5A7 7 0 0 0 12 18zm0-14a3 3 0 0 1 3 3v3.6l-6-6V7a3 3 0 0 1 3-3zm7.7 16.3-16-16 1.4-1.4 16 16-1.4 1.4z\"\n />\n </svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M12 2a3 3 0 0 1 3 3v6a3 3 0 0 1-6 0V5a3 3 0 0 1 3-3zm5 9a5 5 0 0 1-10 0H5a7 7 0 0 0 14 0h-2zm-5 9a7 7 0 0 0 4.9-2H7.1A7 7 0 0 0 12 20zm-1 2h2v2h-2v-2z\"\n />\n </svg>\n }\n </button>\n <span class=\"avaya-ipo-control-label\">{{ isMuted ? 'Unmute' : 'Mute' }}</span>\n </div>\n <div class=\"avaya-ipo-control-item\">\n <button type=\"button\" class=\"avaya-ipo-control-btn\" [class.avaya-ipo-active]=\"isHeld\" aria-label=\"Hold\" [disabled]=\"isConnecting\" [class.avaya-ipo-is-disabled]=\"isConnecting\" (click)=\"toggleHold.emit()\">\n @if (isHeld) {\n <svg viewBox=\"0 0 384 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M73 39C60.6 31.7 45.1 31.7 32.7 39 20.4 46.3 12.7 60.3 12.7 75.5V436.5c0 15.2 7.7 29.2 20 36.5 12.3 7.3 27.9 7.3 40.3 0L329 292.5c12.3-7.3 20-21.3 20-36.5s-7.7-29.2-20-36.5L73 39z\"\n />\n </svg>\n } @else {\n <svg viewBox=\"0 0 320 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M48 64c0-26.5 21.5-48 48-48h32c26.5 0 48 21.5 48 48v384c0 26.5-21.5 48-48 48H96c-26.5 0-48-21.5-48-48V64zm144 0c0-26.5 21.5-48 48-48h32c26.5 0 48 21.5 48 48v384c0 26.5-21.5 48-48 48h-32c-26.5 0-48-21.5-48-48V64z\"\n />\n </svg>\n }\n </button>\n <span class=\"avaya-ipo-control-label\">{{ isHeld ? 'Unhold' : 'Hold' }}</span>\n </div>\n <div class=\"avaya-ipo-control-item\">\n <button type=\"button\" class=\"avaya-ipo-control-btn\" aria-label=\"Keypad\" [disabled]=\"isConnecting\" [class.avaya-ipo-is-disabled]=\"isConnecting\" (click)=\"openKeypad.emit()\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <circle cx=\"7\" cy=\"7\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"7\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"17\" cy=\"7\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"17\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"17\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"17\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"17\" cy=\"17\" r=\"1.6\" fill=\"currentColor\" />\n </svg>\n </button>\n <span class=\"avaya-ipo-control-label\">Keypad</span>\n </div>\n <div class=\"avaya-ipo-control-item\">\n <button type=\"button\" class=\"avaya-ipo-control-btn\" aria-label=\"Live transcription\" (click)=\"startTranscription.emit()\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M5 4h14a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H9l-4 3v-3H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2zm2 4h10v2H7V8zm0 4h10v2H7v-2z\"\n />\n </svg>\n </button>\n <span class=\"avaya-ipo-control-label\">Transcript</span>\n </div>\n </div>\n\n <div class=\"avaya-ipo-active-bottom\">\n <button type=\"button\" class=\"avaya-ipo-end-call-btn\" (click)=\"endCall.emit()\">\n <span class=\"avaya-ipo-btn-icon\">\n <svg height=\"20\" viewBox=\"0 0 640 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M11.7 266.3l41.9 94.3c6.1 13.7 20.8 21.3 35.5 18.4l109.2-21.8c15-3 25.7-16.1 25.7-31.4V240c62.3-20.8 129.7-20.8 192 0v85.8c0 15.3 10.8 28.4 25.7 31.4L550.9 379c14.7 2.9 29.4-4.7 35.5-18.4l41.9-94.3c7.2-16.2 5.1-35.1-7.4-47.7C570.8 168.1 464.2 96 320 96S69.2 168.1 19.1 218.6c-12.5 12.6-14.6 31.5-7.4 47.7z\"\n />\n </svg>\n </span>\n </button>\n </div>\n\n</div>\n", styles: [".avaya-ipo-active-screen{display:flex;flex-direction:column;align-items:center;gap:16px;padding:28px 16px 24px;text-align:center;min-height:100%;height:100%;justify-content:center;color:var(--sd-text)}.avaya-ipo-active-avatar img{width:96px;height:96px;object-fit:cover;border-radius:50%;animation:avatar-pulse-active 2s ease-in-out infinite}@keyframes avatar-pulse-active{0%{box-shadow:0 0 #e5484d40}70%{box-shadow:0 0 0 14px #e5484d00}to{box-shadow:0 0 #e5484d00}}.avaya-ipo-active-title{font-size:18px;font-weight:600;color:var(--sd-text-muted)}.avaya-ipo-active-number{font-size:16px;font-weight:600;color:var(--sd-text)}.avaya-ipo-active-duration{font-size:14px;color:var(--sd-text-muted)}.avaya-ipo-active-duration.avaya-ipo-is-disconnected{color:var(--sd-call-end);font-weight:700}.avaya-ipo-active-controls{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:clamp(12px,4%,18px) clamp(14px,6%,24px);margin-top:12px;justify-items:center}.avaya-ipo-control-item{display:flex;flex-direction:column;align-items:center;gap:6px}.avaya-ipo-control-btn{width:clamp(52px,16%,64px);aspect-ratio:1;height:auto;border-radius:50%;border:1px solid var(--sd-border);background:transparent;color:var(--sd-text-muted);display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.avaya-ipo-control-btn:hover{background:var(--sd-surface-muted)}.avaya-ipo-control-btn:focus-visible{outline:none;box-shadow:var(--sd-focus-ring)}.avaya-ipo-control-btn.avaya-ipo-active{background:var(--sd-accent-soft);color:var(--sd-accent);border-color:var(--sd-accent)}.avaya-ipo-control-btn.avaya-ipo-is-disabled,.avaya-ipo-control-btn:disabled{opacity:.45;cursor:not-allowed;pointer-events:none}.avaya-ipo-control-btn svg{width:22px;height:22px}.avaya-ipo-control-label{font-size:11px;font-weight:600;color:var(--sd-text-muted)}.avaya-ipo-active-bottom{display:flex;align-items:center;justify-content:center;margin-top:clamp(14px,5%,22px)}.avaya-ipo-end-call-btn{width:72px;height:72px;border-radius:50%;border:none;background:var(--sd-call-end);color:var(--sd-accent-contrast);display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.avaya-ipo-end-call-btn:hover{background:var(--sd-call-end);filter:brightness(.94)}.avaya-ipo-end-call-btn:focus-visible{outline:none;box-shadow:var(--sd-focus-ring)}\n"] }]
|
|
2933
3391
|
}], ctorParameters: () => [{ type: EntitiesSearchService }], propDecorators: { tenantId: [{
|
|
2934
3392
|
type: Input
|
|
2935
3393
|
}], activeCallName: [{
|
|
@@ -2994,6 +3452,9 @@ class PhoneComponent {
|
|
|
2994
3452
|
turnIp;
|
|
2995
3453
|
turnPort;
|
|
2996
3454
|
configurationMode;
|
|
3455
|
+
recordingUploadMode;
|
|
3456
|
+
/** Entity id of the call counterpart (resolved by the shell) — included in recording metadata. */
|
|
3457
|
+
entityId;
|
|
2997
3458
|
makeCallEv = new EventEmitter();
|
|
2998
3459
|
endCallEv = new EventEmitter();
|
|
2999
3460
|
audioElement;
|
|
@@ -3013,7 +3474,6 @@ class PhoneComponent {
|
|
|
3013
3474
|
pendingTranscriptionCallId = null;
|
|
3014
3475
|
pendingTranscriptionAllowBinary = false;
|
|
3015
3476
|
lastPartialIndex = {};
|
|
3016
|
-
pendingIncomingCall = false;
|
|
3017
3477
|
dialForm;
|
|
3018
3478
|
directoryForm;
|
|
3019
3479
|
showDirectoryPhonebook = false;
|
|
@@ -3131,7 +3591,6 @@ class PhoneComponent {
|
|
|
3131
3591
|
}
|
|
3132
3592
|
if (evt.state === CallState.CONNECTED) {
|
|
3133
3593
|
this.isRinging = false;
|
|
3134
|
-
this.pendingIncomingCall = false;
|
|
3135
3594
|
this._isActiveCall = true;
|
|
3136
3595
|
if (evt.callId) {
|
|
3137
3596
|
this.currentCallId = evt.callId;
|
|
@@ -3148,9 +3607,6 @@ class PhoneComponent {
|
|
|
3148
3607
|
this.emitCallScreenState();
|
|
3149
3608
|
}
|
|
3150
3609
|
if (evt.state === CallState.INCOMING || evt.state === CallState.RINGING) {
|
|
3151
|
-
if (evt.callId) {
|
|
3152
|
-
this.startTranscriptionForCall(evt.callId, false);
|
|
3153
|
-
}
|
|
3154
3610
|
// Ring tone is handled by AvayaIPOService.
|
|
3155
3611
|
}
|
|
3156
3612
|
if (evt.state === CallState.DISCONNECTED || evt.state === CallState.FAILED) {
|
|
@@ -3167,7 +3623,6 @@ class PhoneComponent {
|
|
|
3167
3623
|
this.pendingTranscriptionAllowBinary = false;
|
|
3168
3624
|
}
|
|
3169
3625
|
this.isRinging = false;
|
|
3170
|
-
this.pendingIncomingCall = false;
|
|
3171
3626
|
this._isActiveCall = false;
|
|
3172
3627
|
this.isMuted = false;
|
|
3173
3628
|
this.isHeld = false;
|
|
@@ -3254,7 +3709,6 @@ class PhoneComponent {
|
|
|
3254
3709
|
this.pendingTranscriptionAllowBinary = false;
|
|
3255
3710
|
}
|
|
3256
3711
|
this.isRinging = false;
|
|
3257
|
-
this.pendingIncomingCall = false;
|
|
3258
3712
|
this._isActiveCall = false;
|
|
3259
3713
|
this.incomingCallNumber = undefined;
|
|
3260
3714
|
this.currentCallId = null;
|
|
@@ -3267,16 +3721,6 @@ class PhoneComponent {
|
|
|
3267
3721
|
this.cdr.detectChanges();
|
|
3268
3722
|
});
|
|
3269
3723
|
}
|
|
3270
|
-
ngOnChanges(changes) {
|
|
3271
|
-
if (changes['incomingNameResolved'] && this.pendingIncomingCall) {
|
|
3272
|
-
if (this.incomingNameResolved) {
|
|
3273
|
-
this.isRinging = true;
|
|
3274
|
-
this.pendingIncomingCall = false;
|
|
3275
|
-
this.emitCallScreenState();
|
|
3276
|
-
this.cdr.detectChanges();
|
|
3277
|
-
}
|
|
3278
|
-
}
|
|
3279
|
-
}
|
|
3280
3724
|
ngAfterViewInit() {
|
|
3281
3725
|
this.audio = this.audioElement?.nativeElement;
|
|
3282
3726
|
}
|
|
@@ -3382,7 +3826,6 @@ class PhoneComponent {
|
|
|
3382
3826
|
declineAvayaCall() {
|
|
3383
3827
|
this.suppressHangupToneOnce = true;
|
|
3384
3828
|
this.isRinging = false;
|
|
3385
|
-
this.pendingIncomingCall = false;
|
|
3386
3829
|
this._isActiveCall = false;
|
|
3387
3830
|
this.pendingOutgoing = false;
|
|
3388
3831
|
this.avayaIpoService.clearOutgoingDial();
|
|
@@ -3399,7 +3842,6 @@ class PhoneComponent {
|
|
|
3399
3842
|
this.avayaIpoService.answerCall();
|
|
3400
3843
|
// this.headerComponent.showAvayaIpo = true;
|
|
3401
3844
|
this.isRinging = false;
|
|
3402
|
-
this.pendingIncomingCall = false;
|
|
3403
3845
|
this._isActiveCall = true;
|
|
3404
3846
|
this.callStatusText = '';
|
|
3405
3847
|
this.startCallTimer();
|
|
@@ -3415,6 +3857,7 @@ class PhoneComponent {
|
|
|
3415
3857
|
this.avayaIpoService.clearOutgoingDial();
|
|
3416
3858
|
this.isKeypadOpen = false;
|
|
3417
3859
|
this.dtmfBuffer = '';
|
|
3860
|
+
this.transcriptionStreamService.destroyAll();
|
|
3418
3861
|
this.emitCallScreenState();
|
|
3419
3862
|
this.endCallEv.emit();
|
|
3420
3863
|
}
|
|
@@ -3494,8 +3937,10 @@ class PhoneComponent {
|
|
|
3494
3937
|
this.contactSearch = '';
|
|
3495
3938
|
this.directoryForm.reset();
|
|
3496
3939
|
this.callStatusText = '';
|
|
3497
|
-
|
|
3498
|
-
|
|
3940
|
+
// Show the ringing screen IMMEDIATELY — the caller-name lookups resolve in place (the template
|
|
3941
|
+
// shows the number first and fills the name when ready). Holding the screen until
|
|
3942
|
+
// incomingNameResolved meant two network round trips of blank UI while the phone was ringing.
|
|
3943
|
+
this.isRinging = true;
|
|
3499
3944
|
if (this.endToneTimeout) {
|
|
3500
3945
|
clearTimeout(this.endToneTimeout);
|
|
3501
3946
|
this.endToneTimeout = undefined;
|
|
@@ -3988,6 +4433,7 @@ class PhoneComponent {
|
|
|
3988
4433
|
agentId: this.agentId || '',
|
|
3989
4434
|
phoneNumber: this.activeCallNumber || '',
|
|
3990
4435
|
callId,
|
|
4436
|
+
entityId: this.entityId || undefined,
|
|
3991
4437
|
};
|
|
3992
4438
|
if (!hasAudio(local)) {
|
|
3993
4439
|
console.warn('[Phone] Missing local audio, requesting mic', callId);
|
|
@@ -4005,7 +4451,7 @@ class PhoneComponent {
|
|
|
4005
4451
|
}
|
|
4006
4452
|
const remote = this.lastRemoteStream;
|
|
4007
4453
|
if (hasAudio(remote)) {
|
|
4008
|
-
this.recordingManagerService.startRecording(local, remote, metadata);
|
|
4454
|
+
this.recordingManagerService.startRecording(local, remote, metadata, this.resolvedRecordingMode());
|
|
4009
4455
|
return;
|
|
4010
4456
|
}
|
|
4011
4457
|
const remoteSub = this.avayaIpoService.remoteStream$.subscribe((r) => {
|
|
@@ -4020,16 +4466,22 @@ class PhoneComponent {
|
|
|
4020
4466
|
return;
|
|
4021
4467
|
}
|
|
4022
4468
|
console.debug('[Phone] Remote audio ready, restarting recording', callId);
|
|
4023
|
-
this.recordingManagerService.startRecording(freshLocal, r.stream, metadata);
|
|
4469
|
+
this.recordingManagerService.startRecording(freshLocal, r.stream, metadata, this.resolvedRecordingMode());
|
|
4024
4470
|
remoteSub.unsubscribe();
|
|
4025
4471
|
});
|
|
4026
4472
|
}
|
|
4473
|
+
/** Per-embed [recordingUploadMode] wins; otherwise the APP_CONFIG default applies. */
|
|
4474
|
+
resolvedRecordingMode() {
|
|
4475
|
+
return this.recordingUploadMode === 'chunked' || this.recordingUploadMode === 'complete'
|
|
4476
|
+
? this.recordingUploadMode
|
|
4477
|
+
: APP_CONFIG.RECORDING_UPLOAD_MODE;
|
|
4478
|
+
}
|
|
4027
4479
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: PhoneComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1$2.FormBuilder }, { token: AvayaIPOService }, { token: AuthenticationService }, { token: RecordingManagerService }, { token: TranscriptionStreamService }], target: i0.ɵɵFactoryTarget.Component });
|
|
4028
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: PhoneComponent, isStandalone: false, selector: "app-phone", inputs: { contacts: "contacts", tenantId: "tenantId", agentId: "agentId", isActiveCall: "isActiveCall", activeCallNumber: "activeCallNumber", incomingCallName: "incomingCallName", incomingNameResolved: "incomingNameResolved", activeCallName: "activeCallName", serverIp: "serverIp", serverPort: "serverPort", stunIp: "stunIp", stunPort: "stunPort", turnIp: "turnIp", turnPort: "turnPort", configurationMode: "configurationMode" }, outputs: { callScreenChange: "callScreenChange", makeCallEv: "makeCallEv", endCallEv: "endCallEv" }, viewQueries: [{ propertyName: "audioElement", first: true, predicate: ["audioElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"phone-container\">\n <audio id=\"sd_call_ring\" #audioElement></audio>\n\n @if (isRinging) {\n <app-phone-incoming [incomingCallNumber]=\"incomingCallNumber\" [incomingCallName]=\"incomingCallName\" [incomingNameResolved]=\"incomingNameResolved\" (accept)=\"acceptAvayaCAll()\"\n (decline)=\"declineAvayaCall()\"></app-phone-incoming>\n } @else if (isActiveCall) {\n <app-phone-active [tenantId]=\"tenantId\" [activeCallNumber]=\"activeCallNumber\" [activeCallName]=\"activeCallName\"\n [activeCallDuration]=\"activeCallDuration\" [callStatusText]=\"callStatusText\" [isConnecting]=\"isConnecting\"\n [isMuted]=\"isMuted\" [isHeld]=\"isHeld\"\n (toggleMute)=\"toggleMute()\" (toggleHold)=\"toggleHold()\" (transfer)=\"onTransferCall()\"\n (openContacts)=\"onActiveOpenContacts()\" (openKeypad)=\"onActiveOpenKeypad()\"\n (startTranscription)=\"openTranscription()\" (contactsLoaded)=\"onContactsLoaded($event)\"\n (endCall)=\"onEndActiveCall()\"></app-phone-active>\n } @else {\n <app-phone-idle [dialForm]=\"dialForm\" [contacts]=\"contacts\" [showDirectoryPhonebook]=\"showDirectoryPhonebook\"\n [isRinging]=\"isRinging\" [CountryISO]=\"CountryISO\" [SearchCountryField]=\"SearchCountryField\"\n (toggleDirectory)=\"onIdleToggleDirectory()\" (clear)=\"onIdleClear()\" (makeCall)=\"onIdleMakeCall()\"\n (keypadInput)=\"onIdleKeypadInput($event)\" (keyboardInput)=\"onIdleKeyboardInput($event)\"></app-phone-idle>\n }\n</div>\n\n@if (showDirectoryPhonebook) {\n<div class=\"phonebook-overlay\">\n <div class=\"phonebook-sheet\">\n <div class=\"phonebook-header\">\n <button type=\"button\" class=\"phonebook-back\" (click)=\"onClosePhonebook()\">\u2039</button>\n <div class=\"phonebook-titles\">\n <div class=\"phonebook-kicker\">{{ isTransferMode ? 'Transfer Call' : 'Add Call' }}</div>\n <div class=\"phonebook-title\">Directory</div>\n </div>\n <button type=\"button\" class=\"phonebook-add\" disabled>\uFF0B</button>\n </div>\n @if (transferError) {\n <div class=\"phonebook-error\">{{ transferError }}</div>\n }\n @if (transferSuccess) {\n <div class=\"phonebook-success\">{{ transferSuccess }}</div>\n }\n\n <div class=\"phonebook-tabs\">\n <button type=\"button\" class=\"phonebook-tab\" [class.active]=\"directoryTab === 'contacts'\"\n (click)=\"setDirectoryTab('contacts')\">\n Contacts\n </button>\n <button type=\"button\" class=\"phonebook-tab\" [class.active]=\"directoryTab === 'dialpad'\"\n (click)=\"setDirectoryTab('dialpad')\">\n Dialpad\n </button>\n </div>\n\n <div class=\"phonebook-list\">\n @if (directoryTab === 'contacts') {\n <div class=\"phonebook-search\">\n <span class=\"search-icon\">\uD83D\uDD0D</span>\n <input type=\"text\" placeholder=\"Search\" [value]=\"contactSearch\"\n (input)=\"contactSearch = ($any($event.target).value)\" />\n </div>\n\n @if (filteredContacts?.length) {\n @for (contact of filteredContacts; track contact.id ?? contact.phone ?? $index) {\n <button type=\"button\" class=\"phonebook-item\" (click)=\"onSelectContact(contact)\">\n <span class=\"phonebook-avatar\">{{ (contact.name || contact.phone || 'U') | slice:0:2 }}</span>\n <span class=\"phonebook-name\">{{ contact.name || 'Unknown' }}</span>\n <span class=\"phonebook-number\">{{ contact.phone || '' }}</span>\n </button>\n }\n } @else {\n <div class=\"phonebook-empty\">No contacts found</div>\n }\n } @else {\n <div class=\"phonebook-dialpad\">\n <div class=\"dialpad-input\" [formGroup]=\"directoryForm\">\n <ngx-intl-tel-input formControlName=\"phoneNumber\" name=\"phoneNumber\" [cssClass]=\"'phone_number_sd'\"\n [preferredCountries]=\"['in']\" [customPlaceholder]=\"'Phone Number'\" [enableAutoCountrySelect]=\"false\"\n [enablePlaceholder]=\"false\" [searchCountryFlag]=\"true\"\n [searchCountryField]=\"[SearchCountryField.Iso2, SearchCountryField.Name]\" [selectFirstCountry]=\"false\"\n [selectedCountryISO]=\"CountryISO.India\" [maxLength]=\"15\" [phoneValidation]=\"true\" [separateDialCode]=\"true\">\n </ngx-intl-tel-input>\n <button type=\"button\" class=\"dialpad-backspace\" (click)=\"onDirectoryBackspace()\">\u232B</button>\n </div>\n\n <div class=\"dialpad-grid\">\n @for (item of directoryDigits; track item.digit) {\n <button type=\"button\" class=\"dialpad-key\" (click)=\"onDirectoryKeypad(item.digit)\">\n <span class=\"dialpad-digit\">{{ item.digit }}</span>\n <span class=\"dialpad-letters\">{{ item.letters || '\\u00a0' }}</span>\n </button>\n }\n </div>\n\n <button type=\"button\" class=\"dialpad-action\" [disabled]=\"!(directoryForm.valid || directoryNumber)\"\n (click)=\"onDirectoryUseNumber()\">\n {{ isTransferMode ? 'Transfer' : 'Add Call' }}\n </button>\n </div>\n }\n </div>\n </div>\n</div>\n}\n\n@if (isKeypadOpen) {\n<div class=\"phonebook-overlay\">\n <div class=\"phonebook-sheet keypad-sheet\">\n <div class=\"phonebook-header\">\n <button type=\"button\" class=\"phonebook-back\" (click)=\"closeKeypad()\">\u2039</button>\n <div class=\"phonebook-titles\">\n <div class=\"phonebook-kicker\">DTMF</div>\n <div class=\"phonebook-title\">Keypad</div>\n </div>\n <button type=\"button\" class=\"phonebook-add\" disabled>\uFF0B</button>\n </div>\n\n <div class=\"dialpad-input dtmf-input\">\n <div class=\"dtmf-text\">{{ dtmfBuffer || ' ' }}</div>\n </div>\n\n <div class=\"phonebook-dialpad\">\n <div class=\"dialpad-grid\">\n @for (item of directoryDigits; track item.digit) {\n <button type=\"button\" class=\"dialpad-key\" (click)=\"onDtmfDigit(item.digit)\">\n <div class=\"dialpad-digit\">{{ item.digit }}</div>\n @if (item.letters) {\n <div class=\"dialpad-letters\">{{ item.letters }}</div>\n }\n </button>\n }\n </div>\n\n <button type=\"button\" class=\"dialpad-action\" (click)=\"closeKeypad()\">Done</button>\n </div>\n </div>\n</div>\n}\n\n@if (isTranscriptionOpen) {\n<div class=\"phonebook-overlay\">\n <div class=\"phonebook-sheet transcription-sheet\">\n <div class=\"phonebook-header\">\n <button type=\"button\" class=\"phonebook-back\" (click)=\"closeTranscription()\">\u2039</button>\n <div class=\"phonebook-titles\">\n <div class=\"phonebook-title\">Live Transcription</div>\n </div>\n </div>\n <div class=\"transcription-body\">\n @if (transcriptSegments?.length) {\n <div class=\"transcription-split\">\n <div class=\"transcription-panel\">\n <div class=\"transcription-panel-title\">\n Customer\n </div>\n <div class=\"transcription-panel-body\">\n @if (customerTranscriptSegments.length) {\n @for (segment of customerTranscriptSegments; track segment.ts ?? $index) {\n <div class=\"transcription-line\">{{ segment.text }}</div>\n }\n } @else {\n <div class=\"transcription-placeholder\">No customer speech yet.</div>\n }\n </div>\n </div>\n <div class=\"transcription-panel\">\n <div class=\"transcription-panel-title\">\n Agent\n </div>\n <div class=\"transcription-panel-body\">\n @if (agentTranscriptSegments.length) {\n @for (segment of agentTranscriptSegments; track segment.ts ?? $index) {\n <div class=\"transcription-line\">{{ segment.text }}</div>\n }\n } @else {\n <div class=\"transcription-placeholder\">No agent speech yet.</div>\n }\n </div>\n </div>\n </div>\n } @else {\n <div class=\"transcription-placeholder\">Live transcription will appear here.</div>\n }\n </div>\n </div>\n</div>\n}\n", styles: [".phone-container{width:100%;box-sizing:border-box;padding:0;background:transparent;border-radius:0;min-height:100%;height:100%;position:relative}.phonebook-overlay{position:absolute;inset:0;background:#00000059;display:flex;align-items:flex-end;justify-content:center;z-index:100}.phonebook-sheet{width:100%;max-width:100%;height:90%;max-height:100%;background:#f7f7f7;color:#1f1f1f;border-radius:22px 22px 0 0;overflow:hidden;border:1px solid #e6e6e6;display:flex;flex-direction:column;animation:sheet-slide-up .22s ease}.keypad-sheet{height:82%}.transcription-sheet{height:90%}.transcription-body{flex:1 1 auto;padding:12px 18px 20px;overflow-y:auto}.transcription-split{display:flex;flex-direction:column;gap:12px;height:100%}.transcription-panel{flex:1 1 0;border:1px solid #e6e7ea;border-radius:12px;background:#fff;display:flex;flex-direction:column;min-height:0}.transcription-panel-title{font-size:12px;font-weight:700;color:#4b5563;padding:8px 12px;border-bottom:1px solid #eef0f2;background:#f7f8fa}.transcription-panel-body{flex:1 1 auto;padding:10px 12px;overflow-y:auto;display:flex;flex-direction:column;gap:6px}.transcription-line{font-size:14px;color:#1f1f1f;line-height:1.5;white-space:pre-wrap}.transcription-panel .transcription-placeholder{font-size:12px;color:#9aa0a6}.transcription-placeholder{font-size:13px;color:#7a7a7a}.phonebook-header{display:flex;align-items:center;justify-content:space-between;padding:18px 18px 8px}.phonebook-titles{text-align:center;display:flex;flex-direction:column;gap:4px;flex:1 1 auto}.phonebook-kicker{font-size:12px;color:#8a8a8a}.phonebook-title{font-size:18px;font-weight:700;color:#1f1f1f}.phonebook-back,.phonebook-add{width:36px;height:36px;border-radius:50%;border:1px solid #e2e2e2;background:#fff;color:#4a4a4a;font-size:18px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.phonebook-add:disabled{opacity:.4;cursor:default}.phonebook-error{margin:0 16px 8px;padding:8px 10px;border-radius:10px;background:#ffe8ea;color:#b71c1c;font-size:12px;font-weight:600;text-align:center}.phonebook-success{margin:0 16px 8px;padding:8px 10px;border-radius:10px;background:#e8f5e9;color:#1b5e20;font-size:12px;font-weight:600;text-align:center}.phonebook-tabs{margin:4px 16px 8px;display:flex;gap:8px;background:#fff;border:1px solid #e6e6e6;padding:4px;border-radius:16px}.phonebook-tab{flex:1 1 0;border:none;background:transparent;color:#6a6a6a;font-size:13px;padding:8px 0;border-radius:12px;cursor:pointer}.phonebook-tab.active{background:#111;color:#fff}.phonebook-search{margin:8px 16px 14px;display:flex;align-items:center;gap:8px;padding:10px 14px;border-radius:18px;background:#fff;border:1px solid #e6e6e6;color:#1f1f1f}.phonebook-search input{flex:1 1 auto;background:transparent;border:none;outline:none;color:#1f1f1f;font-size:14px}.phonebook-search input::placeholder{color:#9a9a9a}.phonebook-list{flex:1 1 auto;overflow-y:auto}.phonebook-item{width:100%;text-align:left;padding:12px 18px;border:none;background:transparent;display:grid;grid-template-columns:40px 1fr;grid-template-rows:auto auto;column-gap:12px;row-gap:2px;cursor:pointer;border-bottom:1px solid #e9e9e9}.phonebook-item:last-child{border-bottom:none}.phonebook-avatar{width:40px;height:40px;border-radius:50%;background:#e7e7ef;color:#4a4a4a;display:inline-flex;align-items:center;justify-content:center;font-size:14px;font-weight:700;grid-row:span 2}.phonebook-name{font-size:13px;font-weight:600;color:#1f1f1f}.phonebook-number{font-size:12px;color:#7a7a7a}.phonebook-empty{padding:18px;font-size:12px;color:#7a7a7a}.phonebook-dialpad{padding:10px 16px 18px;display:flex;flex-direction:column;gap:14px}.dialpad-input{display:flex;align-items:center;gap:10px;padding:10px 14px;border-radius:14px;border:1px solid #e6e6e6;background:#fff}.dialpad-input .phone_number_sd{width:100%}.dialpad-input input{flex:1 1 auto;border:none;outline:none;font-size:16px;background:transparent}.dialpad-backspace{border:none;background:transparent;font-size:16px;cursor:pointer;color:#4a4a4a}:host ::ng-deep .dialpad-input .iti{width:100%}:host ::ng-deep .dialpad-input .iti__flag-container{padding-left:6px}:host ::ng-deep .dialpad-input .iti__selected-flag{border-right:1px solid #e5e5e5;padding-right:8px}:host ::ng-deep .dialpad-input .iti.separate-dial-code input{padding-left:130px!important}:host ::ng-deep .dialpad-input .iti__tel-input{background:transparent;border:none;box-shadow:none;height:32px;padding:0 0 0 6px;font-size:15px}.dialpad-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;justify-items:center}.dialpad-key{width:68px;height:68px;border-radius:50%;border:1.6px solid #c7c7c7;background:transparent;display:flex;flex-direction:column;align-items:center;justify-content:center;font-family:Helvetica Neue,Arial,sans-serif;cursor:pointer}.dialpad-key:focus{outline:none;box-shadow:none}.dialpad-key:active{background:#0000000a}.dialpad-digit{font-size:24px;font-weight:400;color:#4a4a4a;line-height:24px}.dialpad-letters{font-size:9px;letter-spacing:.8px;color:#9a9a9a;margin-top:2px}.dialpad-action{border:none;border-radius:18px;padding:12px 0;background:#111;color:#fff;font-size:14px;font-weight:600;cursor:pointer}.dialpad-action:disabled{opacity:.5;cursor:default}.dtmf-input{margin:0 16px 6px}.dtmf-text{flex:1 1 auto;text-align:center;font-size:18px;letter-spacing:1px;color:#1f1f1f;min-height:24px}@keyframes sheet-slide-up{0%{transform:translateY(24px);opacity:.6}to{transform:translateY(0);opacity:1}}\n"], dependencies: [{ kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i2$1.NgxIntlTelInputComponent, selector: "ngx-intl-tel-input", inputs: ["value", "preferredCountries", "enablePlaceholder", "customPlaceholder", "numberFormat", "cssClass", "onlyCountries", "enableAutoCountrySelect", "searchCountryFlag", "searchCountryField", "searchCountryPlaceholder", "maxLength", "selectFirstCountry", "selectedCountryISO", "phoneValidation", "inputId", "separateDialCode"], outputs: ["countryChange"] }, { kind: "directive", type: i2$1.NativeElementInjectorDirective, selector: "[ngModel], [formControl], [formControlName]" }, { kind: "component", type: PhoneIdleComponent, selector: "app-phone-idle", inputs: ["dialForm", "contacts", "showDirectoryPhonebook", "isRinging", "CountryISO", "SearchCountryField"], outputs: ["toggleDirectory", "clear", "makeCall", "keypadInput", "keyboardInput"] }, { kind: "component", type: PhoneIncomingComponent, selector: "app-phone-incoming", inputs: ["incomingCallName", "incomingNameResolved", "incomingCallNumber"], outputs: ["accept", "decline"] }, { kind: "component", type: PhoneActiveComponent, selector: "app-phone-active", inputs: ["tenantId", "activeCallName", "activeCallNumber", "activeCallDuration", "callStatusText", "isConnecting", "isMuted", "isHeld"], outputs: ["endCall", "toggleMute", "toggleHold", "transfer", "openContacts", "openKeypad", "startTranscription", "contactsLoaded"] }, { kind: "pipe", type: i2.SlicePipe, name: "slice" }] });
|
|
4480
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: PhoneComponent, isStandalone: false, selector: "app-phone", inputs: { contacts: "contacts", tenantId: "tenantId", agentId: "agentId", isActiveCall: "isActiveCall", activeCallNumber: "activeCallNumber", incomingCallName: "incomingCallName", incomingNameResolved: "incomingNameResolved", activeCallName: "activeCallName", serverIp: "serverIp", serverPort: "serverPort", stunIp: "stunIp", stunPort: "stunPort", turnIp: "turnIp", turnPort: "turnPort", configurationMode: "configurationMode", recordingUploadMode: "recordingUploadMode", entityId: "entityId" }, outputs: { callScreenChange: "callScreenChange", makeCallEv: "makeCallEv", endCallEv: "endCallEv" }, viewQueries: [{ propertyName: "audioElement", first: true, predicate: ["audioElement"], descendants: true }], ngImport: i0, template: "<div class=\"avaya-ipo-phone-container\">\n <audio id=\"sd_call_ring\" #audioElement></audio>\n\n @if (isRinging) {\n <app-phone-incoming [incomingCallNumber]=\"incomingCallNumber\" [incomingCallName]=\"incomingCallName\" [incomingNameResolved]=\"incomingNameResolved\" (accept)=\"acceptAvayaCAll()\"\n (decline)=\"declineAvayaCall()\"></app-phone-incoming>\n } @else if (isActiveCall) {\n <app-phone-active [tenantId]=\"tenantId\" [activeCallNumber]=\"activeCallNumber\" [activeCallName]=\"activeCallName\"\n [activeCallDuration]=\"activeCallDuration\" [callStatusText]=\"callStatusText\" [isConnecting]=\"isConnecting\"\n [isMuted]=\"isMuted\" [isHeld]=\"isHeld\"\n (toggleMute)=\"toggleMute()\" (toggleHold)=\"toggleHold()\" (transfer)=\"onTransferCall()\"\n (openContacts)=\"onActiveOpenContacts()\" (openKeypad)=\"onActiveOpenKeypad()\"\n (startTranscription)=\"openTranscription()\" (contactsLoaded)=\"onContactsLoaded($event)\"\n (endCall)=\"onEndActiveCall()\"></app-phone-active>\n } @else {\n <app-phone-idle [dialForm]=\"dialForm\" [contacts]=\"contacts\" [showDirectoryPhonebook]=\"showDirectoryPhonebook\"\n [isRinging]=\"isRinging\" [CountryISO]=\"CountryISO\" [SearchCountryField]=\"SearchCountryField\"\n (toggleDirectory)=\"onIdleToggleDirectory()\" (clear)=\"onIdleClear()\" (makeCall)=\"onIdleMakeCall()\"\n (keypadInput)=\"onIdleKeypadInput($event)\" (keyboardInput)=\"onIdleKeyboardInput($event)\"></app-phone-idle>\n }\n</div>\n\n@if (showDirectoryPhonebook) {\n<div class=\"avaya-ipo-phonebook-overlay\">\n <div class=\"avaya-ipo-phonebook-sheet\">\n <div class=\"avaya-ipo-phonebook-header\">\n <button type=\"button\" class=\"avaya-ipo-phonebook-back\" (click)=\"onClosePhonebook()\">\u2039</button>\n <div class=\"avaya-ipo-phonebook-titles\">\n <div class=\"avaya-ipo-phonebook-kicker\">{{ isTransferMode ? 'Transfer Call' : 'Add Call' }}</div>\n <div class=\"avaya-ipo-phonebook-title\">Directory</div>\n </div>\n <button type=\"button\" class=\"avaya-ipo-phonebook-add\" disabled>\uFF0B</button>\n </div>\n @if (transferError) {\n <div class=\"avaya-ipo-phonebook-error\">{{ transferError }}</div>\n }\n @if (transferSuccess) {\n <div class=\"avaya-ipo-phonebook-success\">{{ transferSuccess }}</div>\n }\n\n <div class=\"avaya-ipo-phonebook-tabs\">\n <button type=\"button\" class=\"avaya-ipo-phonebook-tab\" [class.avaya-ipo-active]=\"directoryTab === 'contacts'\"\n (click)=\"setDirectoryTab('contacts')\">\n Contacts\n </button>\n <button type=\"button\" class=\"avaya-ipo-phonebook-tab\" [class.avaya-ipo-active]=\"directoryTab === 'dialpad'\"\n (click)=\"setDirectoryTab('dialpad')\">\n Dialpad\n </button>\n </div>\n\n <div class=\"avaya-ipo-phonebook-list\">\n @if (directoryTab === 'contacts') {\n <div class=\"avaya-ipo-phonebook-search\">\n <span class=\"avaya-ipo-search-icon\">\uD83D\uDD0D</span>\n <input type=\"text\" placeholder=\"Search\" [value]=\"contactSearch\"\n (input)=\"contactSearch = ($any($event.target).value)\" />\n </div>\n\n @if (filteredContacts?.length) {\n @for (contact of filteredContacts; track contact.id ?? contact.phone ?? $index) {\n <button type=\"button\" class=\"avaya-ipo-phonebook-item\" (click)=\"onSelectContact(contact)\">\n <span class=\"avaya-ipo-phonebook-avatar\">{{ (contact.name || contact.phone || 'U') | slice:0:2 }}</span>\n <span class=\"avaya-ipo-phonebook-name\">{{ contact.name || 'Unknown' }}</span>\n <span class=\"avaya-ipo-phonebook-number\">{{ contact.phone || '' }}</span>\n </button>\n }\n } @else {\n <div class=\"avaya-ipo-phonebook-empty\">No contacts found</div>\n }\n } @else {\n <div class=\"avaya-ipo-phonebook-dialpad\">\n <div class=\"avaya-ipo-dialpad-input\" [formGroup]=\"directoryForm\">\n <ngx-intl-tel-input formControlName=\"phoneNumber\" name=\"phoneNumber\" [cssClass]=\"'avaya-ipo-phone_number_sd'\"\n [preferredCountries]=\"['in']\" [customPlaceholder]=\"'Phone Number'\" [enableAutoCountrySelect]=\"false\"\n [enablePlaceholder]=\"false\" [searchCountryFlag]=\"true\"\n [searchCountryField]=\"[SearchCountryField.Iso2, SearchCountryField.Name]\" [selectFirstCountry]=\"false\"\n [selectedCountryISO]=\"CountryISO.India\" [maxLength]=\"15\" [phoneValidation]=\"true\" [separateDialCode]=\"true\">\n </ngx-intl-tel-input>\n <button type=\"button\" class=\"avaya-ipo-dialpad-backspace\" (click)=\"onDirectoryBackspace()\">\u232B</button>\n </div>\n\n <div class=\"avaya-ipo-dialpad-grid\">\n @for (item of directoryDigits; track item.digit) {\n <button type=\"button\" class=\"avaya-ipo-dialpad-key\" (click)=\"onDirectoryKeypad(item.digit)\">\n <span class=\"avaya-ipo-dialpad-digit\">{{ item.digit }}</span>\n <span class=\"avaya-ipo-dialpad-letters\">{{ item.letters || '\\u00a0' }}</span>\n </button>\n }\n </div>\n\n <button type=\"button\" class=\"avaya-ipo-dialpad-action\" [disabled]=\"!(directoryForm.valid || directoryNumber)\"\n (click)=\"onDirectoryUseNumber()\">\n {{ isTransferMode ? 'Transfer' : 'Add Call' }}\n </button>\n </div>\n }\n </div>\n </div>\n</div>\n}\n\n@if (isKeypadOpen) {\n<div class=\"avaya-ipo-phonebook-overlay\">\n <div class=\"avaya-ipo-phonebook-sheet avaya-ipo-keypad-sheet\">\n <div class=\"avaya-ipo-phonebook-header\">\n <button type=\"button\" class=\"avaya-ipo-phonebook-back\" (click)=\"closeKeypad()\">\u2039</button>\n <div class=\"avaya-ipo-phonebook-titles\">\n <div class=\"avaya-ipo-phonebook-kicker\">DTMF</div>\n <div class=\"avaya-ipo-phonebook-title\">Keypad</div>\n </div>\n <button type=\"button\" class=\"avaya-ipo-phonebook-add\" disabled>\uFF0B</button>\n </div>\n\n <div class=\"avaya-ipo-dialpad-input avaya-ipo-dtmf-input\">\n <div class=\"avaya-ipo-dtmf-text\">{{ dtmfBuffer || ' ' }}</div>\n </div>\n\n <div class=\"avaya-ipo-phonebook-dialpad\">\n <div class=\"avaya-ipo-dialpad-grid\">\n @for (item of directoryDigits; track item.digit) {\n <button type=\"button\" class=\"avaya-ipo-dialpad-key\" (click)=\"onDtmfDigit(item.digit)\">\n <div class=\"avaya-ipo-dialpad-digit\">{{ item.digit }}</div>\n @if (item.letters) {\n <div class=\"avaya-ipo-dialpad-letters\">{{ item.letters }}</div>\n }\n </button>\n }\n </div>\n\n <button type=\"button\" class=\"avaya-ipo-dialpad-action\" (click)=\"closeKeypad()\">Done</button>\n </div>\n </div>\n</div>\n}\n\n@if (isTranscriptionOpen) {\n<div class=\"avaya-ipo-phonebook-overlay\">\n <div class=\"avaya-ipo-phonebook-sheet avaya-ipo-transcription-sheet\">\n <div class=\"avaya-ipo-phonebook-header\">\n <button type=\"button\" class=\"avaya-ipo-phonebook-back\" (click)=\"closeTranscription()\">\u2039</button>\n <div class=\"avaya-ipo-phonebook-titles\">\n <div class=\"avaya-ipo-phonebook-title\">Live Transcription</div>\n </div>\n </div>\n <div class=\"avaya-ipo-transcription-body\">\n @if (transcriptSegments?.length) {\n <div class=\"avaya-ipo-transcription-split\">\n <div class=\"avaya-ipo-transcription-panel\">\n <div class=\"avaya-ipo-transcription-panel-title\">\n Customer\n </div>\n <div class=\"avaya-ipo-transcription-panel-body\">\n @if (customerTranscriptSegments.length) {\n @for (segment of customerTranscriptSegments; track segment.ts ?? $index) {\n <div class=\"avaya-ipo-transcription-line\">{{ segment.text }}</div>\n }\n } @else {\n <div class=\"avaya-ipo-transcription-placeholder\">No customer speech yet.</div>\n }\n </div>\n </div>\n <div class=\"avaya-ipo-transcription-panel\">\n <div class=\"avaya-ipo-transcription-panel-title\">\n Agent\n </div>\n <div class=\"avaya-ipo-transcription-panel-body\">\n @if (agentTranscriptSegments.length) {\n @for (segment of agentTranscriptSegments; track segment.ts ?? $index) {\n <div class=\"avaya-ipo-transcription-line\">{{ segment.text }}</div>\n }\n } @else {\n <div class=\"avaya-ipo-transcription-placeholder\">No agent speech yet.</div>\n }\n </div>\n </div>\n </div>\n } @else {\n <div class=\"avaya-ipo-transcription-placeholder\">Live transcription will appear here.</div>\n }\n </div>\n </div>\n</div>\n}\n", styles: [":host{display:block;height:100%}.avaya-ipo-phone-container{width:100%;box-sizing:border-box;padding:0;background:transparent;border-radius:0;min-height:100%;height:100%;position:relative;container-type:size}.avaya-ipo-phonebook-overlay{position:absolute;inset:0;background:#00000059;display:flex;align-items:flex-end;justify-content:center;z-index:100}.avaya-ipo-phonebook-sheet{width:100%;max-width:100%;height:90%;max-height:100%;background:var(--sd-surface-muted);color:var(--sd-text);border-radius:var(--sd-radius-lg) var(--sd-radius-lg) 0 0;overflow:hidden;border:1px solid var(--sd-border);display:flex;flex-direction:column;animation:sheet-slide-up .22s ease}.avaya-ipo-keypad-sheet{height:82%}.avaya-ipo-transcription-sheet{height:90%}.avaya-ipo-transcription-body{flex:1 1 auto;padding:12px 18px 20px;overflow-y:auto}.avaya-ipo-transcription-split{display:flex;flex-direction:column;gap:12px;height:100%}.avaya-ipo-transcription-panel{flex:1 1 0;border:1px solid var(--sd-border);border-radius:var(--sd-radius);background:var(--sd-card);display:flex;flex-direction:column;min-height:0}.avaya-ipo-transcription-panel-title{font-size:12px;font-weight:700;color:var(--sd-text-muted);padding:8px 12px;border-bottom:1px solid var(--sd-border);background:var(--sd-surface-muted)}.avaya-ipo-transcription-panel-body{flex:1 1 auto;padding:10px 12px;overflow-y:auto;display:flex;flex-direction:column;gap:6px}.avaya-ipo-transcription-line{font-size:14px;color:var(--sd-text);line-height:1.5;white-space:pre-wrap}.avaya-ipo-transcription-panel .avaya-ipo-transcription-placeholder{font-size:12px;color:var(--sd-text-subtle)}.avaya-ipo-transcription-placeholder{font-size:13px;color:var(--sd-text-muted)}.avaya-ipo-phonebook-header{display:flex;align-items:center;justify-content:space-between;padding:18px 18px 8px}.avaya-ipo-phonebook-titles{text-align:center;display:flex;flex-direction:column;gap:4px;flex:1 1 auto}.avaya-ipo-phonebook-kicker{font-size:12px;color:var(--sd-text-muted)}.avaya-ipo-phonebook-title{font-size:18px;font-weight:700;color:var(--sd-text)}.avaya-ipo-phonebook-back,.avaya-ipo-phonebook-add{width:36px;height:36px;border-radius:50%;border:1px solid var(--sd-border);background:var(--sd-card);color:var(--sd-text-muted);font-size:18px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.avaya-ipo-phonebook-back:hover,.avaya-ipo-phonebook-add:hover{background:var(--sd-surface-muted)}.avaya-ipo-phonebook-add:disabled{opacity:.4;cursor:default}.avaya-ipo-phonebook-error{margin:0 16px 8px;padding:8px 10px;border-radius:var(--sd-radius);background:var(--sd-accent-soft);color:var(--sd-call-end);font-size:12px;font-weight:600;text-align:center}.avaya-ipo-phonebook-success{margin:0 16px 8px;padding:8px 10px;border-radius:var(--sd-radius);background:#1aa2511f;color:var(--sd-call-accept);font-size:12px;font-weight:600;text-align:center}.avaya-ipo-phonebook-tabs{margin:4px 16px 8px;display:flex;gap:8px;background:var(--sd-card);border:1px solid var(--sd-border);padding:4px;border-radius:var(--sd-radius-lg)}.avaya-ipo-phonebook-tab{flex:1 1 0;border:none;background:transparent;color:var(--sd-text-muted);font-size:13px;padding:8px 0;border-radius:var(--sd-radius);cursor:pointer}.avaya-ipo-phonebook-tab.avaya-ipo-active{background:var(--sd-accent);color:var(--sd-accent-contrast)}.avaya-ipo-phonebook-search{margin:8px 16px 14px;display:flex;align-items:center;gap:8px;padding:10px 14px;border-radius:var(--sd-radius-sm);background:var(--sd-input);border:1px solid var(--sd-input-border);color:var(--sd-text)}.avaya-ipo-phonebook-search:focus-within{border-color:var(--sd-accent);box-shadow:var(--sd-focus-ring)}.avaya-ipo-phonebook-search input{flex:1 1 auto;background:transparent;border:none;outline:none;color:var(--sd-text);font-size:14px}.avaya-ipo-phonebook-search input::placeholder{color:var(--sd-text-subtle)}.avaya-ipo-phonebook-list{flex:1 1 auto;overflow-y:auto}.avaya-ipo-phonebook-item{width:100%;text-align:left;padding:12px 18px;border:none;background:transparent;display:grid;grid-template-columns:40px 1fr;grid-template-rows:auto auto;column-gap:12px;row-gap:2px;cursor:pointer;border-bottom:1px solid var(--sd-border)}.avaya-ipo-phonebook-item:hover{background:var(--sd-surface-muted)}.avaya-ipo-phonebook-item:last-child{border-bottom:none}.avaya-ipo-phonebook-avatar{width:40px;height:40px;border-radius:50%;background:var(--sd-avatar);color:var(--sd-text-muted);display:inline-flex;align-items:center;justify-content:center;font-size:14px;font-weight:700;grid-row:span 2}.avaya-ipo-phonebook-name{font-size:13px;font-weight:600;color:var(--sd-text)}.avaya-ipo-phonebook-number{font-size:12px;color:var(--sd-text-muted)}.avaya-ipo-phonebook-empty{padding:18px;font-size:12px;color:var(--sd-text-muted)}.avaya-ipo-phonebook-dialpad{padding:10px 16px 18px;display:flex;flex-direction:column;gap:14px}.avaya-ipo-dialpad-input{display:flex;align-items:center;gap:10px;padding:10px 14px;border-radius:var(--sd-radius-sm);border:1px solid var(--sd-input-border);background:var(--sd-input)}.avaya-ipo-dialpad-input:focus-within{border-color:var(--sd-accent);box-shadow:var(--sd-focus-ring)}.avaya-ipo-dialpad-input .avaya-ipo-phone_number_sd{width:100%}.avaya-ipo-dialpad-input input{flex:1 1 auto;border:none;outline:none;font-size:16px;background:transparent;color:var(--sd-text)}.avaya-ipo-dialpad-backspace{border:none;background:transparent;font-size:16px;cursor:pointer;color:var(--sd-text-muted)}:host ::ng-deep .avaya-ipo-dialpad-input .iti{width:100%}:host ::ng-deep .avaya-ipo-dialpad-input .iti__flag-container{padding-left:6px}:host ::ng-deep .avaya-ipo-dialpad-input .iti__selected-flag{border-right:1px solid var(--sd-border);padding-right:8px}:host ::ng-deep .avaya-ipo-dialpad-input .iti.separate-dial-code input{padding-left:130px!important}:host ::ng-deep .avaya-ipo-dialpad-input .iti__tel-input{background:transparent;border:none;box-shadow:none;height:32px;padding:0 0 0 6px;font-size:15px;color:var(--sd-text)}.avaya-ipo-dialpad-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(8px,3%,12px);justify-items:center}.avaya-ipo-dialpad-key{width:clamp(52px,18%,68px);aspect-ratio:1;height:auto;border-radius:50%;border:1.6px solid var(--sd-border-strong);background:transparent;display:flex;flex-direction:column;align-items:center;justify-content:center;cursor:pointer}.avaya-ipo-dialpad-key:focus{outline:none;box-shadow:none}.avaya-ipo-dialpad-key:focus-visible{outline:none;box-shadow:var(--sd-focus-ring)}.avaya-ipo-dialpad-key:active{background:var(--sd-surface-muted)}.avaya-ipo-dialpad-digit{font-size:24px;font-weight:400;color:var(--sd-text);line-height:24px}.avaya-ipo-dialpad-letters{font-size:9px;letter-spacing:.8px;color:var(--sd-text-subtle);margin-top:2px}.avaya-ipo-dialpad-action{border:none;border-radius:var(--sd-radius);padding:12px 0;background:var(--sd-accent);color:var(--sd-accent-contrast);font-size:14px;font-weight:600;cursor:pointer}.avaya-ipo-dialpad-action:hover{background:var(--sd-accent-strong)}.avaya-ipo-dialpad-action:focus-visible{outline:none;box-shadow:var(--sd-focus-ring)}.avaya-ipo-dialpad-action:disabled{opacity:.5;cursor:default}.avaya-ipo-dtmf-input{margin:0 16px 6px}.avaya-ipo-dtmf-text{flex:1 1 auto;text-align:center;font-size:18px;letter-spacing:1px;color:var(--sd-text);min-height:24px}@keyframes sheet-slide-up{0%{transform:translateY(24px);opacity:.6}to{transform:translateY(0);opacity:1}}\n"], dependencies: [{ kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i2$1.NgxIntlTelInputComponent, selector: "ngx-intl-tel-input", inputs: ["value", "preferredCountries", "enablePlaceholder", "customPlaceholder", "numberFormat", "cssClass", "onlyCountries", "enableAutoCountrySelect", "searchCountryFlag", "searchCountryField", "searchCountryPlaceholder", "maxLength", "selectFirstCountry", "selectedCountryISO", "phoneValidation", "inputId", "separateDialCode"], outputs: ["countryChange"] }, { kind: "directive", type: i2$1.NativeElementInjectorDirective, selector: "[ngModel], [formControl], [formControlName]" }, { kind: "component", type: PhoneIdleComponent, selector: "app-phone-idle", inputs: ["dialForm", "contacts", "showDirectoryPhonebook", "isRinging", "CountryISO", "SearchCountryField"], outputs: ["toggleDirectory", "clear", "makeCall", "keypadInput", "keyboardInput"] }, { kind: "component", type: PhoneIncomingComponent, selector: "app-phone-incoming", inputs: ["incomingCallName", "incomingNameResolved", "incomingCallNumber"], outputs: ["accept", "decline"] }, { kind: "component", type: PhoneActiveComponent, selector: "app-phone-active", inputs: ["tenantId", "activeCallName", "activeCallNumber", "activeCallDuration", "callStatusText", "isConnecting", "isMuted", "isHeld"], outputs: ["endCall", "toggleMute", "toggleHold", "transfer", "openContacts", "openKeypad", "startTranscription", "contactsLoaded"] }, { kind: "pipe", type: i2.SlicePipe, name: "slice" }] });
|
|
4029
4481
|
}
|
|
4030
4482
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: PhoneComponent, decorators: [{
|
|
4031
4483
|
type: Component,
|
|
4032
|
-
args: [{ selector: 'app-phone', standalone: false, template: "<div class=\"phone-container\">\n <audio id=\"sd_call_ring\" #audioElement></audio>\n\n @if (isRinging) {\n <app-phone-incoming [incomingCallNumber]=\"incomingCallNumber\" [incomingCallName]=\"incomingCallName\" [incomingNameResolved]=\"incomingNameResolved\" (accept)=\"acceptAvayaCAll()\"\n (decline)=\"declineAvayaCall()\"></app-phone-incoming>\n } @else if (isActiveCall) {\n <app-phone-active [tenantId]=\"tenantId\" [activeCallNumber]=\"activeCallNumber\" [activeCallName]=\"activeCallName\"\n [activeCallDuration]=\"activeCallDuration\" [callStatusText]=\"callStatusText\" [isConnecting]=\"isConnecting\"\n [isMuted]=\"isMuted\" [isHeld]=\"isHeld\"\n (toggleMute)=\"toggleMute()\" (toggleHold)=\"toggleHold()\" (transfer)=\"onTransferCall()\"\n (openContacts)=\"onActiveOpenContacts()\" (openKeypad)=\"onActiveOpenKeypad()\"\n (startTranscription)=\"openTranscription()\" (contactsLoaded)=\"onContactsLoaded($event)\"\n (endCall)=\"onEndActiveCall()\"></app-phone-active>\n } @else {\n <app-phone-idle [dialForm]=\"dialForm\" [contacts]=\"contacts\" [showDirectoryPhonebook]=\"showDirectoryPhonebook\"\n [isRinging]=\"isRinging\" [CountryISO]=\"CountryISO\" [SearchCountryField]=\"SearchCountryField\"\n (toggleDirectory)=\"onIdleToggleDirectory()\" (clear)=\"onIdleClear()\" (makeCall)=\"onIdleMakeCall()\"\n (keypadInput)=\"onIdleKeypadInput($event)\" (keyboardInput)=\"onIdleKeyboardInput($event)\"></app-phone-idle>\n }\n</div>\n\n@if (showDirectoryPhonebook) {\n<div class=\"phonebook-overlay\">\n <div class=\"phonebook-sheet\">\n <div class=\"phonebook-header\">\n <button type=\"button\" class=\"phonebook-back\" (click)=\"onClosePhonebook()\">\u2039</button>\n <div class=\"phonebook-titles\">\n <div class=\"phonebook-kicker\">{{ isTransferMode ? 'Transfer Call' : 'Add Call' }}</div>\n <div class=\"phonebook-title\">Directory</div>\n </div>\n <button type=\"button\" class=\"phonebook-add\" disabled>\uFF0B</button>\n </div>\n @if (transferError) {\n <div class=\"phonebook-error\">{{ transferError }}</div>\n }\n @if (transferSuccess) {\n <div class=\"phonebook-success\">{{ transferSuccess }}</div>\n }\n\n <div class=\"phonebook-tabs\">\n <button type=\"button\" class=\"phonebook-tab\" [class.active]=\"directoryTab === 'contacts'\"\n (click)=\"setDirectoryTab('contacts')\">\n Contacts\n </button>\n <button type=\"button\" class=\"phonebook-tab\" [class.active]=\"directoryTab === 'dialpad'\"\n (click)=\"setDirectoryTab('dialpad')\">\n Dialpad\n </button>\n </div>\n\n <div class=\"phonebook-list\">\n @if (directoryTab === 'contacts') {\n <div class=\"phonebook-search\">\n <span class=\"search-icon\">\uD83D\uDD0D</span>\n <input type=\"text\" placeholder=\"Search\" [value]=\"contactSearch\"\n (input)=\"contactSearch = ($any($event.target).value)\" />\n </div>\n\n @if (filteredContacts?.length) {\n @for (contact of filteredContacts; track contact.id ?? contact.phone ?? $index) {\n <button type=\"button\" class=\"phonebook-item\" (click)=\"onSelectContact(contact)\">\n <span class=\"phonebook-avatar\">{{ (contact.name || contact.phone || 'U') | slice:0:2 }}</span>\n <span class=\"phonebook-name\">{{ contact.name || 'Unknown' }}</span>\n <span class=\"phonebook-number\">{{ contact.phone || '' }}</span>\n </button>\n }\n } @else {\n <div class=\"phonebook-empty\">No contacts found</div>\n }\n } @else {\n <div class=\"phonebook-dialpad\">\n <div class=\"dialpad-input\" [formGroup]=\"directoryForm\">\n <ngx-intl-tel-input formControlName=\"phoneNumber\" name=\"phoneNumber\" [cssClass]=\"'phone_number_sd'\"\n [preferredCountries]=\"['in']\" [customPlaceholder]=\"'Phone Number'\" [enableAutoCountrySelect]=\"false\"\n [enablePlaceholder]=\"false\" [searchCountryFlag]=\"true\"\n [searchCountryField]=\"[SearchCountryField.Iso2, SearchCountryField.Name]\" [selectFirstCountry]=\"false\"\n [selectedCountryISO]=\"CountryISO.India\" [maxLength]=\"15\" [phoneValidation]=\"true\" [separateDialCode]=\"true\">\n </ngx-intl-tel-input>\n <button type=\"button\" class=\"dialpad-backspace\" (click)=\"onDirectoryBackspace()\">\u232B</button>\n </div>\n\n <div class=\"dialpad-grid\">\n @for (item of directoryDigits; track item.digit) {\n <button type=\"button\" class=\"dialpad-key\" (click)=\"onDirectoryKeypad(item.digit)\">\n <span class=\"dialpad-digit\">{{ item.digit }}</span>\n <span class=\"dialpad-letters\">{{ item.letters || '\\u00a0' }}</span>\n </button>\n }\n </div>\n\n <button type=\"button\" class=\"dialpad-action\" [disabled]=\"!(directoryForm.valid || directoryNumber)\"\n (click)=\"onDirectoryUseNumber()\">\n {{ isTransferMode ? 'Transfer' : 'Add Call' }}\n </button>\n </div>\n }\n </div>\n </div>\n</div>\n}\n\n@if (isKeypadOpen) {\n<div class=\"phonebook-overlay\">\n <div class=\"phonebook-sheet keypad-sheet\">\n <div class=\"phonebook-header\">\n <button type=\"button\" class=\"phonebook-back\" (click)=\"closeKeypad()\">\u2039</button>\n <div class=\"phonebook-titles\">\n <div class=\"phonebook-kicker\">DTMF</div>\n <div class=\"phonebook-title\">Keypad</div>\n </div>\n <button type=\"button\" class=\"phonebook-add\" disabled>\uFF0B</button>\n </div>\n\n <div class=\"dialpad-input dtmf-input\">\n <div class=\"dtmf-text\">{{ dtmfBuffer || ' ' }}</div>\n </div>\n\n <div class=\"phonebook-dialpad\">\n <div class=\"dialpad-grid\">\n @for (item of directoryDigits; track item.digit) {\n <button type=\"button\" class=\"dialpad-key\" (click)=\"onDtmfDigit(item.digit)\">\n <div class=\"dialpad-digit\">{{ item.digit }}</div>\n @if (item.letters) {\n <div class=\"dialpad-letters\">{{ item.letters }}</div>\n }\n </button>\n }\n </div>\n\n <button type=\"button\" class=\"dialpad-action\" (click)=\"closeKeypad()\">Done</button>\n </div>\n </div>\n</div>\n}\n\n@if (isTranscriptionOpen) {\n<div class=\"phonebook-overlay\">\n <div class=\"phonebook-sheet transcription-sheet\">\n <div class=\"phonebook-header\">\n <button type=\"button\" class=\"phonebook-back\" (click)=\"closeTranscription()\">\u2039</button>\n <div class=\"phonebook-titles\">\n <div class=\"phonebook-title\">Live Transcription</div>\n </div>\n </div>\n <div class=\"transcription-body\">\n @if (transcriptSegments?.length) {\n <div class=\"transcription-split\">\n <div class=\"transcription-panel\">\n <div class=\"transcription-panel-title\">\n Customer\n </div>\n <div class=\"transcription-panel-body\">\n @if (customerTranscriptSegments.length) {\n @for (segment of customerTranscriptSegments; track segment.ts ?? $index) {\n <div class=\"transcription-line\">{{ segment.text }}</div>\n }\n } @else {\n <div class=\"transcription-placeholder\">No customer speech yet.</div>\n }\n </div>\n </div>\n <div class=\"transcription-panel\">\n <div class=\"transcription-panel-title\">\n Agent\n </div>\n <div class=\"transcription-panel-body\">\n @if (agentTranscriptSegments.length) {\n @for (segment of agentTranscriptSegments; track segment.ts ?? $index) {\n <div class=\"transcription-line\">{{ segment.text }}</div>\n }\n } @else {\n <div class=\"transcription-placeholder\">No agent speech yet.</div>\n }\n </div>\n </div>\n </div>\n } @else {\n <div class=\"transcription-placeholder\">Live transcription will appear here.</div>\n }\n </div>\n </div>\n</div>\n}\n", styles: [".phone-container{width:100%;box-sizing:border-box;padding:0;background:transparent;border-radius:0;min-height:100%;height:100%;position:relative}.phonebook-overlay{position:absolute;inset:0;background:#00000059;display:flex;align-items:flex-end;justify-content:center;z-index:100}.phonebook-sheet{width:100%;max-width:100%;height:90%;max-height:100%;background:#f7f7f7;color:#1f1f1f;border-radius:22px 22px 0 0;overflow:hidden;border:1px solid #e6e6e6;display:flex;flex-direction:column;animation:sheet-slide-up .22s ease}.keypad-sheet{height:82%}.transcription-sheet{height:90%}.transcription-body{flex:1 1 auto;padding:12px 18px 20px;overflow-y:auto}.transcription-split{display:flex;flex-direction:column;gap:12px;height:100%}.transcription-panel{flex:1 1 0;border:1px solid #e6e7ea;border-radius:12px;background:#fff;display:flex;flex-direction:column;min-height:0}.transcription-panel-title{font-size:12px;font-weight:700;color:#4b5563;padding:8px 12px;border-bottom:1px solid #eef0f2;background:#f7f8fa}.transcription-panel-body{flex:1 1 auto;padding:10px 12px;overflow-y:auto;display:flex;flex-direction:column;gap:6px}.transcription-line{font-size:14px;color:#1f1f1f;line-height:1.5;white-space:pre-wrap}.transcription-panel .transcription-placeholder{font-size:12px;color:#9aa0a6}.transcription-placeholder{font-size:13px;color:#7a7a7a}.phonebook-header{display:flex;align-items:center;justify-content:space-between;padding:18px 18px 8px}.phonebook-titles{text-align:center;display:flex;flex-direction:column;gap:4px;flex:1 1 auto}.phonebook-kicker{font-size:12px;color:#8a8a8a}.phonebook-title{font-size:18px;font-weight:700;color:#1f1f1f}.phonebook-back,.phonebook-add{width:36px;height:36px;border-radius:50%;border:1px solid #e2e2e2;background:#fff;color:#4a4a4a;font-size:18px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.phonebook-add:disabled{opacity:.4;cursor:default}.phonebook-error{margin:0 16px 8px;padding:8px 10px;border-radius:10px;background:#ffe8ea;color:#b71c1c;font-size:12px;font-weight:600;text-align:center}.phonebook-success{margin:0 16px 8px;padding:8px 10px;border-radius:10px;background:#e8f5e9;color:#1b5e20;font-size:12px;font-weight:600;text-align:center}.phonebook-tabs{margin:4px 16px 8px;display:flex;gap:8px;background:#fff;border:1px solid #e6e6e6;padding:4px;border-radius:16px}.phonebook-tab{flex:1 1 0;border:none;background:transparent;color:#6a6a6a;font-size:13px;padding:8px 0;border-radius:12px;cursor:pointer}.phonebook-tab.active{background:#111;color:#fff}.phonebook-search{margin:8px 16px 14px;display:flex;align-items:center;gap:8px;padding:10px 14px;border-radius:18px;background:#fff;border:1px solid #e6e6e6;color:#1f1f1f}.phonebook-search input{flex:1 1 auto;background:transparent;border:none;outline:none;color:#1f1f1f;font-size:14px}.phonebook-search input::placeholder{color:#9a9a9a}.phonebook-list{flex:1 1 auto;overflow-y:auto}.phonebook-item{width:100%;text-align:left;padding:12px 18px;border:none;background:transparent;display:grid;grid-template-columns:40px 1fr;grid-template-rows:auto auto;column-gap:12px;row-gap:2px;cursor:pointer;border-bottom:1px solid #e9e9e9}.phonebook-item:last-child{border-bottom:none}.phonebook-avatar{width:40px;height:40px;border-radius:50%;background:#e7e7ef;color:#4a4a4a;display:inline-flex;align-items:center;justify-content:center;font-size:14px;font-weight:700;grid-row:span 2}.phonebook-name{font-size:13px;font-weight:600;color:#1f1f1f}.phonebook-number{font-size:12px;color:#7a7a7a}.phonebook-empty{padding:18px;font-size:12px;color:#7a7a7a}.phonebook-dialpad{padding:10px 16px 18px;display:flex;flex-direction:column;gap:14px}.dialpad-input{display:flex;align-items:center;gap:10px;padding:10px 14px;border-radius:14px;border:1px solid #e6e6e6;background:#fff}.dialpad-input .phone_number_sd{width:100%}.dialpad-input input{flex:1 1 auto;border:none;outline:none;font-size:16px;background:transparent}.dialpad-backspace{border:none;background:transparent;font-size:16px;cursor:pointer;color:#4a4a4a}:host ::ng-deep .dialpad-input .iti{width:100%}:host ::ng-deep .dialpad-input .iti__flag-container{padding-left:6px}:host ::ng-deep .dialpad-input .iti__selected-flag{border-right:1px solid #e5e5e5;padding-right:8px}:host ::ng-deep .dialpad-input .iti.separate-dial-code input{padding-left:130px!important}:host ::ng-deep .dialpad-input .iti__tel-input{background:transparent;border:none;box-shadow:none;height:32px;padding:0 0 0 6px;font-size:15px}.dialpad-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;justify-items:center}.dialpad-key{width:68px;height:68px;border-radius:50%;border:1.6px solid #c7c7c7;background:transparent;display:flex;flex-direction:column;align-items:center;justify-content:center;font-family:Helvetica Neue,Arial,sans-serif;cursor:pointer}.dialpad-key:focus{outline:none;box-shadow:none}.dialpad-key:active{background:#0000000a}.dialpad-digit{font-size:24px;font-weight:400;color:#4a4a4a;line-height:24px}.dialpad-letters{font-size:9px;letter-spacing:.8px;color:#9a9a9a;margin-top:2px}.dialpad-action{border:none;border-radius:18px;padding:12px 0;background:#111;color:#fff;font-size:14px;font-weight:600;cursor:pointer}.dialpad-action:disabled{opacity:.5;cursor:default}.dtmf-input{margin:0 16px 6px}.dtmf-text{flex:1 1 auto;text-align:center;font-size:18px;letter-spacing:1px;color:#1f1f1f;min-height:24px}@keyframes sheet-slide-up{0%{transform:translateY(24px);opacity:.6}to{transform:translateY(0);opacity:1}}\n"] }]
|
|
4484
|
+
args: [{ selector: 'app-phone', standalone: false, template: "<div class=\"avaya-ipo-phone-container\">\n <audio id=\"sd_call_ring\" #audioElement></audio>\n\n @if (isRinging) {\n <app-phone-incoming [incomingCallNumber]=\"incomingCallNumber\" [incomingCallName]=\"incomingCallName\" [incomingNameResolved]=\"incomingNameResolved\" (accept)=\"acceptAvayaCAll()\"\n (decline)=\"declineAvayaCall()\"></app-phone-incoming>\n } @else if (isActiveCall) {\n <app-phone-active [tenantId]=\"tenantId\" [activeCallNumber]=\"activeCallNumber\" [activeCallName]=\"activeCallName\"\n [activeCallDuration]=\"activeCallDuration\" [callStatusText]=\"callStatusText\" [isConnecting]=\"isConnecting\"\n [isMuted]=\"isMuted\" [isHeld]=\"isHeld\"\n (toggleMute)=\"toggleMute()\" (toggleHold)=\"toggleHold()\" (transfer)=\"onTransferCall()\"\n (openContacts)=\"onActiveOpenContacts()\" (openKeypad)=\"onActiveOpenKeypad()\"\n (startTranscription)=\"openTranscription()\" (contactsLoaded)=\"onContactsLoaded($event)\"\n (endCall)=\"onEndActiveCall()\"></app-phone-active>\n } @else {\n <app-phone-idle [dialForm]=\"dialForm\" [contacts]=\"contacts\" [showDirectoryPhonebook]=\"showDirectoryPhonebook\"\n [isRinging]=\"isRinging\" [CountryISO]=\"CountryISO\" [SearchCountryField]=\"SearchCountryField\"\n (toggleDirectory)=\"onIdleToggleDirectory()\" (clear)=\"onIdleClear()\" (makeCall)=\"onIdleMakeCall()\"\n (keypadInput)=\"onIdleKeypadInput($event)\" (keyboardInput)=\"onIdleKeyboardInput($event)\"></app-phone-idle>\n }\n</div>\n\n@if (showDirectoryPhonebook) {\n<div class=\"avaya-ipo-phonebook-overlay\">\n <div class=\"avaya-ipo-phonebook-sheet\">\n <div class=\"avaya-ipo-phonebook-header\">\n <button type=\"button\" class=\"avaya-ipo-phonebook-back\" (click)=\"onClosePhonebook()\">\u2039</button>\n <div class=\"avaya-ipo-phonebook-titles\">\n <div class=\"avaya-ipo-phonebook-kicker\">{{ isTransferMode ? 'Transfer Call' : 'Add Call' }}</div>\n <div class=\"avaya-ipo-phonebook-title\">Directory</div>\n </div>\n <button type=\"button\" class=\"avaya-ipo-phonebook-add\" disabled>\uFF0B</button>\n </div>\n @if (transferError) {\n <div class=\"avaya-ipo-phonebook-error\">{{ transferError }}</div>\n }\n @if (transferSuccess) {\n <div class=\"avaya-ipo-phonebook-success\">{{ transferSuccess }}</div>\n }\n\n <div class=\"avaya-ipo-phonebook-tabs\">\n <button type=\"button\" class=\"avaya-ipo-phonebook-tab\" [class.avaya-ipo-active]=\"directoryTab === 'contacts'\"\n (click)=\"setDirectoryTab('contacts')\">\n Contacts\n </button>\n <button type=\"button\" class=\"avaya-ipo-phonebook-tab\" [class.avaya-ipo-active]=\"directoryTab === 'dialpad'\"\n (click)=\"setDirectoryTab('dialpad')\">\n Dialpad\n </button>\n </div>\n\n <div class=\"avaya-ipo-phonebook-list\">\n @if (directoryTab === 'contacts') {\n <div class=\"avaya-ipo-phonebook-search\">\n <span class=\"avaya-ipo-search-icon\">\uD83D\uDD0D</span>\n <input type=\"text\" placeholder=\"Search\" [value]=\"contactSearch\"\n (input)=\"contactSearch = ($any($event.target).value)\" />\n </div>\n\n @if (filteredContacts?.length) {\n @for (contact of filteredContacts; track contact.id ?? contact.phone ?? $index) {\n <button type=\"button\" class=\"avaya-ipo-phonebook-item\" (click)=\"onSelectContact(contact)\">\n <span class=\"avaya-ipo-phonebook-avatar\">{{ (contact.name || contact.phone || 'U') | slice:0:2 }}</span>\n <span class=\"avaya-ipo-phonebook-name\">{{ contact.name || 'Unknown' }}</span>\n <span class=\"avaya-ipo-phonebook-number\">{{ contact.phone || '' }}</span>\n </button>\n }\n } @else {\n <div class=\"avaya-ipo-phonebook-empty\">No contacts found</div>\n }\n } @else {\n <div class=\"avaya-ipo-phonebook-dialpad\">\n <div class=\"avaya-ipo-dialpad-input\" [formGroup]=\"directoryForm\">\n <ngx-intl-tel-input formControlName=\"phoneNumber\" name=\"phoneNumber\" [cssClass]=\"'avaya-ipo-phone_number_sd'\"\n [preferredCountries]=\"['in']\" [customPlaceholder]=\"'Phone Number'\" [enableAutoCountrySelect]=\"false\"\n [enablePlaceholder]=\"false\" [searchCountryFlag]=\"true\"\n [searchCountryField]=\"[SearchCountryField.Iso2, SearchCountryField.Name]\" [selectFirstCountry]=\"false\"\n [selectedCountryISO]=\"CountryISO.India\" [maxLength]=\"15\" [phoneValidation]=\"true\" [separateDialCode]=\"true\">\n </ngx-intl-tel-input>\n <button type=\"button\" class=\"avaya-ipo-dialpad-backspace\" (click)=\"onDirectoryBackspace()\">\u232B</button>\n </div>\n\n <div class=\"avaya-ipo-dialpad-grid\">\n @for (item of directoryDigits; track item.digit) {\n <button type=\"button\" class=\"avaya-ipo-dialpad-key\" (click)=\"onDirectoryKeypad(item.digit)\">\n <span class=\"avaya-ipo-dialpad-digit\">{{ item.digit }}</span>\n <span class=\"avaya-ipo-dialpad-letters\">{{ item.letters || '\\u00a0' }}</span>\n </button>\n }\n </div>\n\n <button type=\"button\" class=\"avaya-ipo-dialpad-action\" [disabled]=\"!(directoryForm.valid || directoryNumber)\"\n (click)=\"onDirectoryUseNumber()\">\n {{ isTransferMode ? 'Transfer' : 'Add Call' }}\n </button>\n </div>\n }\n </div>\n </div>\n</div>\n}\n\n@if (isKeypadOpen) {\n<div class=\"avaya-ipo-phonebook-overlay\">\n <div class=\"avaya-ipo-phonebook-sheet avaya-ipo-keypad-sheet\">\n <div class=\"avaya-ipo-phonebook-header\">\n <button type=\"button\" class=\"avaya-ipo-phonebook-back\" (click)=\"closeKeypad()\">\u2039</button>\n <div class=\"avaya-ipo-phonebook-titles\">\n <div class=\"avaya-ipo-phonebook-kicker\">DTMF</div>\n <div class=\"avaya-ipo-phonebook-title\">Keypad</div>\n </div>\n <button type=\"button\" class=\"avaya-ipo-phonebook-add\" disabled>\uFF0B</button>\n </div>\n\n <div class=\"avaya-ipo-dialpad-input avaya-ipo-dtmf-input\">\n <div class=\"avaya-ipo-dtmf-text\">{{ dtmfBuffer || ' ' }}</div>\n </div>\n\n <div class=\"avaya-ipo-phonebook-dialpad\">\n <div class=\"avaya-ipo-dialpad-grid\">\n @for (item of directoryDigits; track item.digit) {\n <button type=\"button\" class=\"avaya-ipo-dialpad-key\" (click)=\"onDtmfDigit(item.digit)\">\n <div class=\"avaya-ipo-dialpad-digit\">{{ item.digit }}</div>\n @if (item.letters) {\n <div class=\"avaya-ipo-dialpad-letters\">{{ item.letters }}</div>\n }\n </button>\n }\n </div>\n\n <button type=\"button\" class=\"avaya-ipo-dialpad-action\" (click)=\"closeKeypad()\">Done</button>\n </div>\n </div>\n</div>\n}\n\n@if (isTranscriptionOpen) {\n<div class=\"avaya-ipo-phonebook-overlay\">\n <div class=\"avaya-ipo-phonebook-sheet avaya-ipo-transcription-sheet\">\n <div class=\"avaya-ipo-phonebook-header\">\n <button type=\"button\" class=\"avaya-ipo-phonebook-back\" (click)=\"closeTranscription()\">\u2039</button>\n <div class=\"avaya-ipo-phonebook-titles\">\n <div class=\"avaya-ipo-phonebook-title\">Live Transcription</div>\n </div>\n </div>\n <div class=\"avaya-ipo-transcription-body\">\n @if (transcriptSegments?.length) {\n <div class=\"avaya-ipo-transcription-split\">\n <div class=\"avaya-ipo-transcription-panel\">\n <div class=\"avaya-ipo-transcription-panel-title\">\n Customer\n </div>\n <div class=\"avaya-ipo-transcription-panel-body\">\n @if (customerTranscriptSegments.length) {\n @for (segment of customerTranscriptSegments; track segment.ts ?? $index) {\n <div class=\"avaya-ipo-transcription-line\">{{ segment.text }}</div>\n }\n } @else {\n <div class=\"avaya-ipo-transcription-placeholder\">No customer speech yet.</div>\n }\n </div>\n </div>\n <div class=\"avaya-ipo-transcription-panel\">\n <div class=\"avaya-ipo-transcription-panel-title\">\n Agent\n </div>\n <div class=\"avaya-ipo-transcription-panel-body\">\n @if (agentTranscriptSegments.length) {\n @for (segment of agentTranscriptSegments; track segment.ts ?? $index) {\n <div class=\"avaya-ipo-transcription-line\">{{ segment.text }}</div>\n }\n } @else {\n <div class=\"avaya-ipo-transcription-placeholder\">No agent speech yet.</div>\n }\n </div>\n </div>\n </div>\n } @else {\n <div class=\"avaya-ipo-transcription-placeholder\">Live transcription will appear here.</div>\n }\n </div>\n </div>\n</div>\n}\n", styles: [":host{display:block;height:100%}.avaya-ipo-phone-container{width:100%;box-sizing:border-box;padding:0;background:transparent;border-radius:0;min-height:100%;height:100%;position:relative;container-type:size}.avaya-ipo-phonebook-overlay{position:absolute;inset:0;background:#00000059;display:flex;align-items:flex-end;justify-content:center;z-index:100}.avaya-ipo-phonebook-sheet{width:100%;max-width:100%;height:90%;max-height:100%;background:var(--sd-surface-muted);color:var(--sd-text);border-radius:var(--sd-radius-lg) var(--sd-radius-lg) 0 0;overflow:hidden;border:1px solid var(--sd-border);display:flex;flex-direction:column;animation:sheet-slide-up .22s ease}.avaya-ipo-keypad-sheet{height:82%}.avaya-ipo-transcription-sheet{height:90%}.avaya-ipo-transcription-body{flex:1 1 auto;padding:12px 18px 20px;overflow-y:auto}.avaya-ipo-transcription-split{display:flex;flex-direction:column;gap:12px;height:100%}.avaya-ipo-transcription-panel{flex:1 1 0;border:1px solid var(--sd-border);border-radius:var(--sd-radius);background:var(--sd-card);display:flex;flex-direction:column;min-height:0}.avaya-ipo-transcription-panel-title{font-size:12px;font-weight:700;color:var(--sd-text-muted);padding:8px 12px;border-bottom:1px solid var(--sd-border);background:var(--sd-surface-muted)}.avaya-ipo-transcription-panel-body{flex:1 1 auto;padding:10px 12px;overflow-y:auto;display:flex;flex-direction:column;gap:6px}.avaya-ipo-transcription-line{font-size:14px;color:var(--sd-text);line-height:1.5;white-space:pre-wrap}.avaya-ipo-transcription-panel .avaya-ipo-transcription-placeholder{font-size:12px;color:var(--sd-text-subtle)}.avaya-ipo-transcription-placeholder{font-size:13px;color:var(--sd-text-muted)}.avaya-ipo-phonebook-header{display:flex;align-items:center;justify-content:space-between;padding:18px 18px 8px}.avaya-ipo-phonebook-titles{text-align:center;display:flex;flex-direction:column;gap:4px;flex:1 1 auto}.avaya-ipo-phonebook-kicker{font-size:12px;color:var(--sd-text-muted)}.avaya-ipo-phonebook-title{font-size:18px;font-weight:700;color:var(--sd-text)}.avaya-ipo-phonebook-back,.avaya-ipo-phonebook-add{width:36px;height:36px;border-radius:50%;border:1px solid var(--sd-border);background:var(--sd-card);color:var(--sd-text-muted);font-size:18px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.avaya-ipo-phonebook-back:hover,.avaya-ipo-phonebook-add:hover{background:var(--sd-surface-muted)}.avaya-ipo-phonebook-add:disabled{opacity:.4;cursor:default}.avaya-ipo-phonebook-error{margin:0 16px 8px;padding:8px 10px;border-radius:var(--sd-radius);background:var(--sd-accent-soft);color:var(--sd-call-end);font-size:12px;font-weight:600;text-align:center}.avaya-ipo-phonebook-success{margin:0 16px 8px;padding:8px 10px;border-radius:var(--sd-radius);background:#1aa2511f;color:var(--sd-call-accept);font-size:12px;font-weight:600;text-align:center}.avaya-ipo-phonebook-tabs{margin:4px 16px 8px;display:flex;gap:8px;background:var(--sd-card);border:1px solid var(--sd-border);padding:4px;border-radius:var(--sd-radius-lg)}.avaya-ipo-phonebook-tab{flex:1 1 0;border:none;background:transparent;color:var(--sd-text-muted);font-size:13px;padding:8px 0;border-radius:var(--sd-radius);cursor:pointer}.avaya-ipo-phonebook-tab.avaya-ipo-active{background:var(--sd-accent);color:var(--sd-accent-contrast)}.avaya-ipo-phonebook-search{margin:8px 16px 14px;display:flex;align-items:center;gap:8px;padding:10px 14px;border-radius:var(--sd-radius-sm);background:var(--sd-input);border:1px solid var(--sd-input-border);color:var(--sd-text)}.avaya-ipo-phonebook-search:focus-within{border-color:var(--sd-accent);box-shadow:var(--sd-focus-ring)}.avaya-ipo-phonebook-search input{flex:1 1 auto;background:transparent;border:none;outline:none;color:var(--sd-text);font-size:14px}.avaya-ipo-phonebook-search input::placeholder{color:var(--sd-text-subtle)}.avaya-ipo-phonebook-list{flex:1 1 auto;overflow-y:auto}.avaya-ipo-phonebook-item{width:100%;text-align:left;padding:12px 18px;border:none;background:transparent;display:grid;grid-template-columns:40px 1fr;grid-template-rows:auto auto;column-gap:12px;row-gap:2px;cursor:pointer;border-bottom:1px solid var(--sd-border)}.avaya-ipo-phonebook-item:hover{background:var(--sd-surface-muted)}.avaya-ipo-phonebook-item:last-child{border-bottom:none}.avaya-ipo-phonebook-avatar{width:40px;height:40px;border-radius:50%;background:var(--sd-avatar);color:var(--sd-text-muted);display:inline-flex;align-items:center;justify-content:center;font-size:14px;font-weight:700;grid-row:span 2}.avaya-ipo-phonebook-name{font-size:13px;font-weight:600;color:var(--sd-text)}.avaya-ipo-phonebook-number{font-size:12px;color:var(--sd-text-muted)}.avaya-ipo-phonebook-empty{padding:18px;font-size:12px;color:var(--sd-text-muted)}.avaya-ipo-phonebook-dialpad{padding:10px 16px 18px;display:flex;flex-direction:column;gap:14px}.avaya-ipo-dialpad-input{display:flex;align-items:center;gap:10px;padding:10px 14px;border-radius:var(--sd-radius-sm);border:1px solid var(--sd-input-border);background:var(--sd-input)}.avaya-ipo-dialpad-input:focus-within{border-color:var(--sd-accent);box-shadow:var(--sd-focus-ring)}.avaya-ipo-dialpad-input .avaya-ipo-phone_number_sd{width:100%}.avaya-ipo-dialpad-input input{flex:1 1 auto;border:none;outline:none;font-size:16px;background:transparent;color:var(--sd-text)}.avaya-ipo-dialpad-backspace{border:none;background:transparent;font-size:16px;cursor:pointer;color:var(--sd-text-muted)}:host ::ng-deep .avaya-ipo-dialpad-input .iti{width:100%}:host ::ng-deep .avaya-ipo-dialpad-input .iti__flag-container{padding-left:6px}:host ::ng-deep .avaya-ipo-dialpad-input .iti__selected-flag{border-right:1px solid var(--sd-border);padding-right:8px}:host ::ng-deep .avaya-ipo-dialpad-input .iti.separate-dial-code input{padding-left:130px!important}:host ::ng-deep .avaya-ipo-dialpad-input .iti__tel-input{background:transparent;border:none;box-shadow:none;height:32px;padding:0 0 0 6px;font-size:15px;color:var(--sd-text)}.avaya-ipo-dialpad-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(8px,3%,12px);justify-items:center}.avaya-ipo-dialpad-key{width:clamp(52px,18%,68px);aspect-ratio:1;height:auto;border-radius:50%;border:1.6px solid var(--sd-border-strong);background:transparent;display:flex;flex-direction:column;align-items:center;justify-content:center;cursor:pointer}.avaya-ipo-dialpad-key:focus{outline:none;box-shadow:none}.avaya-ipo-dialpad-key:focus-visible{outline:none;box-shadow:var(--sd-focus-ring)}.avaya-ipo-dialpad-key:active{background:var(--sd-surface-muted)}.avaya-ipo-dialpad-digit{font-size:24px;font-weight:400;color:var(--sd-text);line-height:24px}.avaya-ipo-dialpad-letters{font-size:9px;letter-spacing:.8px;color:var(--sd-text-subtle);margin-top:2px}.avaya-ipo-dialpad-action{border:none;border-radius:var(--sd-radius);padding:12px 0;background:var(--sd-accent);color:var(--sd-accent-contrast);font-size:14px;font-weight:600;cursor:pointer}.avaya-ipo-dialpad-action:hover{background:var(--sd-accent-strong)}.avaya-ipo-dialpad-action:focus-visible{outline:none;box-shadow:var(--sd-focus-ring)}.avaya-ipo-dialpad-action:disabled{opacity:.5;cursor:default}.avaya-ipo-dtmf-input{margin:0 16px 6px}.avaya-ipo-dtmf-text{flex:1 1 auto;text-align:center;font-size:18px;letter-spacing:1px;color:var(--sd-text);min-height:24px}@keyframes sheet-slide-up{0%{transform:translateY(24px);opacity:.6}to{transform:translateY(0);opacity:1}}\n"] }]
|
|
4033
4485
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1$2.FormBuilder }, { type: AvayaIPOService }, { type: AuthenticationService }, { type: RecordingManagerService }, { type: TranscriptionStreamService }], propDecorators: { contacts: [{
|
|
4034
4486
|
type: Input
|
|
4035
4487
|
}], tenantId: [{
|
|
@@ -4062,6 +4514,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImpor
|
|
|
4062
4514
|
type: Input
|
|
4063
4515
|
}], configurationMode: [{
|
|
4064
4516
|
type: Input
|
|
4517
|
+
}], recordingUploadMode: [{
|
|
4518
|
+
type: Input
|
|
4519
|
+
}], entityId: [{
|
|
4520
|
+
type: Input
|
|
4065
4521
|
}], makeCallEv: [{
|
|
4066
4522
|
type: Output
|
|
4067
4523
|
}], endCallEv: [{
|
|
@@ -4080,10 +4536,26 @@ class AvayaIPOWidgetComponent {
|
|
|
4080
4536
|
entitiesSearchService;
|
|
4081
4537
|
snugdeskAuthService;
|
|
4082
4538
|
hostDarkMode = false;
|
|
4539
|
+
// Mirror displayMode onto the host element as a class (same pattern as dark-mode) so all layout
|
|
4540
|
+
// differences between the two views are pure :host-scoped CSS — the DOM tree is identical in both
|
|
4541
|
+
// modes, which keeps every media-element id / scroll-ref / public API invariant intact by construction.
|
|
4542
|
+
get hostModeStandalone() { return this.displayMode === 'standalone'; }
|
|
4543
|
+
get hostModePopup() { return this.displayMode !== 'standalone'; }
|
|
4083
4544
|
STORAGE_KEY = 'avayaIpoWidgetLogin';
|
|
4084
4545
|
// Public API inputs (kept for compatibility with host apps)
|
|
4085
4546
|
isVisible = true;
|
|
4547
|
+
/**
|
|
4548
|
+
* Render mode for the widget shell:
|
|
4549
|
+
* - 'popup' (default): owns no dimensions — fills whatever box the host gives it (e.g. the snugdesk-app
|
|
4550
|
+
* header popover), with a min-size guard and its own internal scroll. Preserves 100% of current behavior.
|
|
4551
|
+
* - 'standalone': provides its own full-page frame — a centered card on desktop, full-bleed on mobile —
|
|
4552
|
+
* for running the softphone independently.
|
|
4553
|
+
*/
|
|
4554
|
+
displayMode = 'popup';
|
|
4086
4555
|
configurationMode;
|
|
4556
|
+
/** Recording upload strategy: 'complete' (one upload at call end) or 'chunked' (live-streamed
|
|
4557
|
+
* over the recording WebSocket, survives a dead tab). Defaults to APP_CONFIG.RECORDING_UPLOAD_MODE. */
|
|
4558
|
+
recordingUploadMode;
|
|
4087
4559
|
avayaIPOServerIP;
|
|
4088
4560
|
avayaIPOServerPort;
|
|
4089
4561
|
avayaIPOServerStunServerIP;
|
|
@@ -4093,8 +4565,32 @@ class AvayaIPOWidgetComponent {
|
|
|
4093
4565
|
token;
|
|
4094
4566
|
tenantId;
|
|
4095
4567
|
userId;
|
|
4568
|
+
/**
|
|
4569
|
+
* Optional Avaya IP Office credentials. When BOTH `extension` and `password` are supplied (via the
|
|
4570
|
+
* host binding), the widget patches the login form and auto-logs-in once — no manual login needed.
|
|
4571
|
+
* If they are not supplied, the widget falls back to any saved localStorage session, otherwise it
|
|
4572
|
+
* shows the login form as before.
|
|
4573
|
+
*/
|
|
4574
|
+
extension;
|
|
4575
|
+
password;
|
|
4576
|
+
/** Show/hide the History tab. Default true keeps current behavior. */
|
|
4577
|
+
showHistory = true;
|
|
4578
|
+
/** Show/hide the Contacts tab. Default true keeps current behavior. */
|
|
4579
|
+
showContacts = true;
|
|
4580
|
+
/**
|
|
4581
|
+
* The bottom tab bar only earns its space when at least one of History/Contacts is visible.
|
|
4582
|
+
* With both hidden only Keypad (the default view) would remain, so the whole bar is hidden.
|
|
4583
|
+
*/
|
|
4584
|
+
get showTabBar() {
|
|
4585
|
+
return this.showHistory || this.showContacts;
|
|
4586
|
+
}
|
|
4096
4587
|
notificationEvent = new EventEmitter();
|
|
4097
|
-
|
|
4588
|
+
/**
|
|
4589
|
+
* Fires when an inbound call starts ringing, so the host app can open/focus the widget popover.
|
|
4590
|
+
* Payload: the call id, the caller's number, and the resolved caller name (null if not yet known).
|
|
4591
|
+
*/
|
|
4592
|
+
incomingCall = new EventEmitter();
|
|
4593
|
+
widgetVersion = APP_CONFIG.WIDGET_VERSION;
|
|
4098
4594
|
isReconnectingInProgress = false;
|
|
4099
4595
|
isFailoverInProgress = false;
|
|
4100
4596
|
isFailbackInProgress = false;
|
|
@@ -4108,18 +4604,23 @@ class AvayaIPOWidgetComponent {
|
|
|
4108
4604
|
awlScriptPromise;
|
|
4109
4605
|
loginForm;
|
|
4110
4606
|
activeTab = 'keypad';
|
|
4607
|
+
previousTab = 'keypad';
|
|
4111
4608
|
loginSub;
|
|
4112
4609
|
incomingCallSub;
|
|
4113
4610
|
callStateSub;
|
|
4114
4611
|
hideTabs = false;
|
|
4115
4612
|
darkModeEnabled = false;
|
|
4116
4613
|
activeCallNumber = null;
|
|
4614
|
+
/** Entity id of the current call's counterpart (resolved via OpenSearch); sent with the
|
|
4615
|
+
* chunked-recording socket so chunks land under <tenantId>/<entityId>/avaya-ipo-chunks/. */
|
|
4616
|
+
activeCallEntityId = null;
|
|
4117
4617
|
incomingCallName = null;
|
|
4118
4618
|
incomingNameResolved = false;
|
|
4119
4619
|
activeCallName = null;
|
|
4120
4620
|
authErrorMessage = '';
|
|
4121
4621
|
authLoading = true;
|
|
4122
4622
|
hasInitialized = false;
|
|
4623
|
+
autoLoginAttempted = false;
|
|
4123
4624
|
callLogIndex = new Map();
|
|
4124
4625
|
pendingDisconnectSide = null;
|
|
4125
4626
|
callStartTimes = new Map();
|
|
@@ -4139,6 +4640,22 @@ class AvayaIPOWidgetComponent {
|
|
|
4139
4640
|
this.initAfterAuth();
|
|
4140
4641
|
}
|
|
4141
4642
|
}
|
|
4643
|
+
ngOnChanges(changes) {
|
|
4644
|
+
// If the host supplies/updates credentials after init, attempt the input-based auto-login.
|
|
4645
|
+
if ((changes['extension'] || changes['password']) && this.hasInitialized) {
|
|
4646
|
+
this.tryAutoLoginFromInputs();
|
|
4647
|
+
}
|
|
4648
|
+
// If the currently-active tab gets hidden by the host, fall back to the keypad.
|
|
4649
|
+
if (changes['showHistory'] || changes['showContacts']) {
|
|
4650
|
+
this.ensureVisibleTab();
|
|
4651
|
+
}
|
|
4652
|
+
}
|
|
4653
|
+
ensureVisibleTab() {
|
|
4654
|
+
if ((this.activeTab === 'history' && !this.showHistory) ||
|
|
4655
|
+
(this.activeTab === 'contacts' && !this.showContacts)) {
|
|
4656
|
+
this.activeTab = 'keypad';
|
|
4657
|
+
}
|
|
4658
|
+
}
|
|
4142
4659
|
initAfterAuth() {
|
|
4143
4660
|
if (this.hasInitialized) {
|
|
4144
4661
|
return;
|
|
@@ -4159,6 +4676,7 @@ class AvayaIPOWidgetComponent {
|
|
|
4159
4676
|
this.activeTab = 'keypad';
|
|
4160
4677
|
const phoneNumber = (farEndNumber ?? '').toString();
|
|
4161
4678
|
this.activeCallNumber = phoneNumber;
|
|
4679
|
+
this.activeCallEntityId = null;
|
|
4162
4680
|
this.incomingCallName = null;
|
|
4163
4681
|
this.incomingNameResolved = false;
|
|
4164
4682
|
this.activeCallName = null;
|
|
@@ -4169,6 +4687,8 @@ class AvayaIPOWidgetComponent {
|
|
|
4169
4687
|
this.activeCallName = cachedName;
|
|
4170
4688
|
this.incomingNameResolved = true;
|
|
4171
4689
|
}
|
|
4690
|
+
// Signal the host app immediately so it can open/focus the widget popover.
|
|
4691
|
+
this.incomingCall.emit({ callId, number: phoneNumber, name: this.incomingCallName });
|
|
4172
4692
|
const [lookupResult, callerName] = await Promise.all([
|
|
4173
4693
|
this.getLookupPhoneNumber(phoneNumber),
|
|
4174
4694
|
this.getOpenSearchCallerName(normalizedSearch),
|
|
@@ -4195,6 +4715,7 @@ class AvayaIPOWidgetComponent {
|
|
|
4195
4715
|
});
|
|
4196
4716
|
const callLogPayload = {
|
|
4197
4717
|
tenantId: this.tenantId,
|
|
4718
|
+
userId: this.userId,
|
|
4198
4719
|
agentId: this.loginForm.value.ipoExtensionNo ?? '',
|
|
4199
4720
|
callId,
|
|
4200
4721
|
phoneNumber: phonePayload,
|
|
@@ -4222,12 +4743,14 @@ class AvayaIPOWidgetComponent {
|
|
|
4222
4743
|
this.callStartTimes.set(callId, Date.now());
|
|
4223
4744
|
const callLogPayload = {
|
|
4224
4745
|
tenantId: this.tenantId,
|
|
4746
|
+
userId: this.userId,
|
|
4225
4747
|
agentId: this.loginForm.value.ipoExtensionNo ?? '',
|
|
4226
4748
|
callId,
|
|
4227
4749
|
phoneNumber: meta.phoneNumber,
|
|
4228
4750
|
direction: meta.direction,
|
|
4229
4751
|
duration: 0,
|
|
4230
4752
|
status: 'connected',
|
|
4753
|
+
connected: true,
|
|
4231
4754
|
timestamp: new Date().toISOString(),
|
|
4232
4755
|
callinginfo: 'calling',
|
|
4233
4756
|
};
|
|
@@ -4251,12 +4774,14 @@ class AvayaIPOWidgetComponent {
|
|
|
4251
4774
|
: 0;
|
|
4252
4775
|
const callLogPayload = {
|
|
4253
4776
|
tenantId: this.tenantId,
|
|
4777
|
+
userId: this.userId,
|
|
4254
4778
|
agentId: this.loginForm.value.ipoExtensionNo ?? '',
|
|
4255
4779
|
callId,
|
|
4256
4780
|
phoneNumber: meta.phoneNumber,
|
|
4257
4781
|
direction: meta.direction,
|
|
4258
4782
|
duration,
|
|
4259
4783
|
status,
|
|
4784
|
+
connected: meta.connected,
|
|
4260
4785
|
timestamp: new Date().toISOString(),
|
|
4261
4786
|
callinginfo: 'disconnected',
|
|
4262
4787
|
disconnectSide,
|
|
@@ -4271,11 +4796,15 @@ class AvayaIPOWidgetComponent {
|
|
|
4271
4796
|
if (this.avayaIPOService.activeCallId === callId) {
|
|
4272
4797
|
this.activeCallNumber = null;
|
|
4273
4798
|
this.activeCallName = null;
|
|
4799
|
+
this.activeCallEntityId = null;
|
|
4274
4800
|
this.incomingCallName = null;
|
|
4275
4801
|
}
|
|
4276
4802
|
}
|
|
4277
4803
|
});
|
|
4278
|
-
|
|
4804
|
+
// Prefer host-provided credentials (auto-login); otherwise fall back to a saved localStorage session.
|
|
4805
|
+
if (!this.tryAutoLoginFromInputs()) {
|
|
4806
|
+
this.restoreSession();
|
|
4807
|
+
}
|
|
4279
4808
|
}
|
|
4280
4809
|
async authenticateWithToken() {
|
|
4281
4810
|
this.authLoading = true;
|
|
@@ -4448,8 +4977,16 @@ class AvayaIPOWidgetComponent {
|
|
|
4448
4977
|
}
|
|
4449
4978
|
}
|
|
4450
4979
|
selectTab(tab) {
|
|
4980
|
+
if (tab === 'settings' && this.activeTab !== 'settings') {
|
|
4981
|
+
this.previousTab = this.activeTab;
|
|
4982
|
+
}
|
|
4451
4983
|
this.activeTab = tab;
|
|
4452
4984
|
}
|
|
4985
|
+
/** Leave Settings and return to the screen the user came from (guards against a now-hidden tab). */
|
|
4986
|
+
closeSettings() {
|
|
4987
|
+
this.activeTab = this.previousTab;
|
|
4988
|
+
this.ensureVisibleTab();
|
|
4989
|
+
}
|
|
4453
4990
|
onHistoryMakeCall(payload) {
|
|
4454
4991
|
this.triggerCall(payload);
|
|
4455
4992
|
}
|
|
@@ -4459,6 +4996,27 @@ class AvayaIPOWidgetComponent {
|
|
|
4459
4996
|
onContactsMakeCall(payload) {
|
|
4460
4997
|
this.triggerCall(payload);
|
|
4461
4998
|
}
|
|
4999
|
+
/**
|
|
5000
|
+
* Public API — place an outbound call programmatically (e.g. click-to-call from the host app).
|
|
5001
|
+
* Switches to the keypad view and dials `number`. Requires the widget to be registered;
|
|
5002
|
+
* if it is still on the login screen the call is skipped with a warning.
|
|
5003
|
+
*
|
|
5004
|
+
* Usage from the host app (via @ViewChild(AvayaIPOWidgetComponent)):
|
|
5005
|
+
* this.avayaWidget?.makeCall('9876543210');
|
|
5006
|
+
*/
|
|
5007
|
+
makeCall(number) {
|
|
5008
|
+
const dial = (number ?? '').toString().trim();
|
|
5009
|
+
if (!dial) {
|
|
5010
|
+
console.warn('[avaya-ipo] makeCall: no number provided');
|
|
5011
|
+
return;
|
|
5012
|
+
}
|
|
5013
|
+
if (this.showLoginForm) {
|
|
5014
|
+
console.warn('[avaya-ipo] makeCall: widget is not registered yet; cannot place call');
|
|
5015
|
+
return;
|
|
5016
|
+
}
|
|
5017
|
+
this.activeTab = 'keypad';
|
|
5018
|
+
void this.triggerCall(dial);
|
|
5019
|
+
}
|
|
4462
5020
|
onPhoneEndCall() {
|
|
4463
5021
|
try {
|
|
4464
5022
|
this.pendingDisconnectSide = 'AGENT';
|
|
@@ -4470,12 +5028,14 @@ class AvayaIPOWidgetComponent {
|
|
|
4470
5028
|
if (meta && !meta.connected) {
|
|
4471
5029
|
const callLogPayload = {
|
|
4472
5030
|
tenantId: this.tenantId,
|
|
5031
|
+
userId: this.userId,
|
|
4473
5032
|
agentId: this.loginForm.value.ipoExtensionNo ?? '',
|
|
4474
5033
|
callId: targetCallId,
|
|
4475
5034
|
phoneNumber: meta.phoneNumber,
|
|
4476
5035
|
direction: meta.direction,
|
|
4477
5036
|
duration: 0,
|
|
4478
5037
|
status: 'disconnected',
|
|
5038
|
+
connected: false,
|
|
4479
5039
|
timestamp: new Date().toISOString(),
|
|
4480
5040
|
callinginfo: 'calling',
|
|
4481
5041
|
disconnectSide: 'AGENT',
|
|
@@ -4525,6 +5085,7 @@ class AvayaIPOWidgetComponent {
|
|
|
4525
5085
|
}
|
|
4526
5086
|
this.activeTab = 'keypad';
|
|
4527
5087
|
this.activeCallNumber = destination;
|
|
5088
|
+
this.activeCallEntityId = null;
|
|
4528
5089
|
this.activeCallName = providedName || null;
|
|
4529
5090
|
const normalizedSearch = this.normalizePhoneForSearch(destination);
|
|
4530
5091
|
if (!providedName) {
|
|
@@ -4535,9 +5096,12 @@ class AvayaIPOWidgetComponent {
|
|
|
4535
5096
|
}
|
|
4536
5097
|
this.avayaIPOService.notifyOutgoingDial(destination);
|
|
4537
5098
|
try {
|
|
5099
|
+
// Always run the entity lookup — even when the caller name is already known (contacts/history)
|
|
5100
|
+
// we still need the entity ID for the recording socket payload. The provided name keeps display
|
|
5101
|
+
// priority below.
|
|
4538
5102
|
const [lookupResult, callerName] = await Promise.all([
|
|
4539
5103
|
this.getLookupPhoneNumber(destination),
|
|
4540
|
-
|
|
5104
|
+
this.getOpenSearchCallerName(normalizedSearch),
|
|
4541
5105
|
]);
|
|
4542
5106
|
const mapNumber = lookupResult?.lookupPhoneNumber?.['local-number']?.replace(/\s+/g, '') ||
|
|
4543
5107
|
lookupResult?.normalizedPhoneNumber ||
|
|
@@ -4568,6 +5132,7 @@ class AvayaIPOWidgetComponent {
|
|
|
4568
5132
|
});
|
|
4569
5133
|
const callLogPayload = {
|
|
4570
5134
|
tenantId: this.tenantId,
|
|
5135
|
+
userId: this.userId,
|
|
4571
5136
|
agentId: this.loginForm.value.ipoExtensionNo ?? '',
|
|
4572
5137
|
callId,
|
|
4573
5138
|
phoneNumber: phonePayload,
|
|
@@ -4645,7 +5210,11 @@ class AvayaIPOWidgetComponent {
|
|
|
4645
5210
|
return null;
|
|
4646
5211
|
}
|
|
4647
5212
|
try {
|
|
4648
|
-
|
|
5213
|
+
const entity = await this.entitiesSearchService.lookupEntityByPhone(tenantId, phoneNumber);
|
|
5214
|
+
// Remember the entity for the recording socket payload (chunks live under its folder).
|
|
5215
|
+
this.activeCallEntityId = entity.id;
|
|
5216
|
+
console.debug(`[avaya-ipo] entity lookup for ${phoneNumber}: id=${entity.id || 'NONE'} name=${entity.name || 'NONE'}`);
|
|
5217
|
+
return entity.name;
|
|
4649
5218
|
}
|
|
4650
5219
|
catch (err) {
|
|
4651
5220
|
console.warn('OpenSearch lookup failed:', err);
|
|
@@ -4689,6 +5258,29 @@ class AvayaIPOWidgetComponent {
|
|
|
4689
5258
|
console.warn('Unable to persist login session', err);
|
|
4690
5259
|
}
|
|
4691
5260
|
}
|
|
5261
|
+
hasInputCredentials() {
|
|
5262
|
+
return !!(this.extension && this.extension.trim() && this.password && this.password.trim());
|
|
5263
|
+
}
|
|
5264
|
+
/**
|
|
5265
|
+
* Auto-login when both `extension` and `password` are supplied via @Input. Fires at most once for the
|
|
5266
|
+
* widget's lifetime (so a manual logout is respected and we never loop). Returns true if it kicked off
|
|
5267
|
+
* a login, so the caller can skip the localStorage fallback.
|
|
5268
|
+
*/
|
|
5269
|
+
tryAutoLoginFromInputs() {
|
|
5270
|
+
if (this.autoLoginAttempted || !this.loginForm || !this.showLoginForm || !this.hasInputCredentials()) {
|
|
5271
|
+
return false;
|
|
5272
|
+
}
|
|
5273
|
+
this.autoLoginAttempted = true;
|
|
5274
|
+
this.loginForm.patchValue({
|
|
5275
|
+
ipoExtensionNo: this.extension.trim(),
|
|
5276
|
+
ipoPassword: this.password.trim(),
|
|
5277
|
+
});
|
|
5278
|
+
this.showLoginForm = false;
|
|
5279
|
+
this.showLoginLoader = true;
|
|
5280
|
+
// Brief tick so the view/SDK are ready before we trigger the login.
|
|
5281
|
+
setTimeout(() => this.onLogin(), 0);
|
|
5282
|
+
return true;
|
|
5283
|
+
}
|
|
4692
5284
|
restoreSession() {
|
|
4693
5285
|
try {
|
|
4694
5286
|
const raw = localStorage.getItem(this.STORAGE_KEY);
|
|
@@ -4760,18 +5352,28 @@ class AvayaIPOWidgetComponent {
|
|
|
4760
5352
|
return this.awlScriptPromise;
|
|
4761
5353
|
}
|
|
4762
5354
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: AvayaIPOWidgetComponent, deps: [{ token: i1$2.FormBuilder }, { token: AvayaIPOService }, { token: i0.ChangeDetectorRef }, { token: CountryService }, { token: PhoneNumberLookupService }, { token: EntitiesSearchService }, { token: i1$1.SnugdeskAuthenticationService }], target: i0.ɵɵFactoryTarget.Component });
|
|
4763
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: AvayaIPOWidgetComponent, isStandalone: false, selector: "snugdesk-avaya-ipo-widget", inputs: { isVisible: "isVisible", configurationMode: "configurationMode", avayaIPOServerIP: "avayaIPOServerIP", avayaIPOServerPort: "avayaIPOServerPort", avayaIPOServerStunServerIP: "avayaIPOServerStunServerIP", avayaIPOServerStunServerPort: "avayaIPOServerStunServerPort", avayaIPOServerTurnServerIP: "avayaIPOServerTurnServerIP", avayaIPOServerTurnServerPort: "avayaIPOServerTurnServerPort", token: "token", tenantId: "tenantId", userId: "userId" }, outputs: { notificationEvent: "notificationEvent" }, host: { properties: { "class.dark-mode": "this.hostDarkMode" } }, ngImport: i0, template: "<div class=\"media-elements\">\n <audio id=\"rmtAudio\" autoplay></audio>\n <audio id=\"lclAudio\" autoplay></audio>\n <video id=\"rmtVideo\" autoplay playsinline></video>\n <video id=\"lclVideo\" autoplay playsinline muted></video>\n</div>\n\n@if (authLoading) {\n <div class=\"auth-loading-screen\">\n <div class=\"auth-loading-card\">\n <div class=\"spinner\" aria-hidden=\"true\"></div>\n <div class=\"auth-loading-title\">Checking authentication</div>\n <div class=\"auth-loading-message\">Please wait...</div>\n </div>\n </div>\n} @else if (authErrorMessage) {\n <div class=\"auth-error-screen\">\n <div class=\"auth-error-card\">\n <div class=\"auth-error-icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M12 2a7 7 0 0 1 7 7v3a2 2 0 0 1 2 2v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-6a2 2 0 0 1 2-2V9a7 7 0 0 1 7-7zm5 10V9a5 5 0 0 0-10 0v3h10zm-5 3a2 2 0 0 0-1 3.732V20h2v-1.268A2 2 0 0 0 12 15z\"\n />\n </svg>\n </div>\n <div class=\"auth-error-title\">Authentication Required</div>\n <div class=\"auth-error-message\">{{ authErrorMessage }}</div>\n </div>\n </div>\n} @else {\n@if (isReconnectingInProgress || isFailoverInProgress || isFailbackInProgress) {\n <div class=\"container_connection_status_overlay\">\n <div class=\"container_connection_status\">\n <i class=\"fa-solid fa-circle-dot\"></i>\n @if (isReconnectingInProgress) { <span>Reconnecting to the server...</span> }\n @if (isFailoverInProgress) { <span>Failover in progress...</span> }\n @if (isFailbackInProgress) { <span>Failback in progress...</span> }\n </div>\n </div>\n}\n\n@if (showLoginForm) {\n <app-avaya-ipo-login\n [loginForm]=\"loginForm\"\n [showLoginLoader]=\"showLoginLoader\"\n [hasAvayaSocketError]=\"hasAvayaSocketError\"\n [hasAvayaLoginError]=\"hasAvayaLoginError\"\n [hasAvayaLoginFailedGeneral]=\"hasAvayaLoginFailedGeneral\"\n [hasAvayaLoginConflictError]=\"hasAvayaLoginConflictError\"\n [hasAvayaDeviceError]=\"hasAvayaDeviceError\"\n (login)=\"onLogin()\"\n ></app-avaya-ipo-login>\n} @else {\n <div class=\"widget-body\">\n <div class=\"widget-content\">\n @if (activeTab === 'history') {\n @if (!hideTabs) {\n <div class=\"page-heading\">\n <span>History</span>\n <button type=\"button\" class=\"settings-btn\" (click)=\"selectTab('settings')\">\n <svg width=\"18px\" viewBox=\"-0.03 0 16.079 16.079\" aria-hidden=\"true\" focusable=\"false\">\n <g>\n <path fill=\"currentColor\"\n d=\"M8.182 1.083a6.99 6.99 0 0 0-6.248 3.493c-1.929 3.342-.776 7.629 2.57 9.562 3.346 1.934 7.634.792 9.562-2.55 1.929-3.343.776-7.634-2.57-9.567a6.98 6.98 0 0 0-3.314-.938zM8 2.08a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6z\" />\n <path fill=\"currentColor\"\n d=\"M9.322 0L6.69.393v1.354a6.49 6.477 43.146 0 1 2.632.005V0zM3.937 1.19L1.93 2.897l.988 1.177a6.49 6.477 43.146 0 1 2.017-1.69zm8.128.013l-.993 1.184a6.49 6.477 43.146 0 1 .17.09 6.49 6.477 43.146 0 1 1.845 1.603l1.006-1.197zM.455 5.42l-.44 2.596 1.515.267a6.49 6.477 43.146 0 1 .455-2.593zm15.086.003l-1.523.269a6.49 6.477 43.146 0 1 .464 2.59l1.533-.27zM1.858 10.118l-1.351.78 1.33 2.271 1.339-.772a6.49 6.477 43.146 0 1-1.317-2.28zm12.301.003a6.49 6.477 43.146 0 1-.534 1.215 6.49 6.477 43.146 0 1-.774 1.069l1.338.773 1.302-2.288zm-9.557 3.471l-.534 1.47 2.48.884.525-1.446a6.49 6.477 43.146 0 1-2.303-.8 6.49 6.477 43.146 0 1-.168-.108zm6.814.016a6.49 6.477 43.146 0 1-2.475.897l.53 1.457 2.468-.917z\" />\n <path fill=\"currentColor\"\n d=\"M7.648 3.093a4.989 4.989 0 0 0-3.982 2.483 5.013 5.013 0 0 0 1.836 6.834 5.002 5.002 0 0 0 6.83-1.827 5.01 5.01 0 0 0-1.836-6.832 4.976 4.976 0 0 0-2.848-.658zM8 4.08a4 4 0 0 1 4 4 4 4 0 0 1-4 4 4 4 0 0 1-4-4 4 4 0 0 1 4-4z\" />\n </g>\n </svg>\n </button>\n </div>\n }\n <app-call-history\n [tenantId]=\"tenantId\"\n [agentId]=\"loginForm?.value?.ipoExtensionNo || userId\"\n (makeCallEv)=\"onHistoryMakeCall($event)\"\n ></app-call-history>\n } @else if (activeTab === 'contacts') {\n @if (!hideTabs) {\n <div class=\"page-heading\">\n <span>Contacts</span>\n <button type=\"button\" class=\"settings-btn\" (click)=\"selectTab('settings')\">\n <svg width=\"18px\" viewBox=\"-0.03 0 16.079 16.079\" aria-hidden=\"true\" focusable=\"false\">\n <g>\n <path fill=\"currentColor\"\n d=\"M8.182 1.083a6.99 6.99 0 0 0-6.248 3.493c-1.929 3.342-.776 7.629 2.57 9.562 3.346 1.934 7.634.792 9.562-2.55 1.929-3.343.776-7.634-2.57-9.567a6.98 6.98 0 0 0-3.314-.938zM8 2.08a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6z\" />\n <path fill=\"currentColor\"\n d=\"M9.322 0L6.69.393v1.354a6.49 6.477 43.146 0 1 2.632.005V0zM3.937 1.19L1.93 2.897l.988 1.177a6.49 6.477 43.146 0 1 2.017-1.69zm8.128.013l-.993 1.184a6.49 6.477 43.146 0 1 .17.09 6.49 6.477 43.146 0 1 1.845 1.603l1.006-1.197zM.455 5.42l-.44 2.596 1.515.267a6.49 6.477 43.146 0 1 .455-2.593zm15.086.003l-1.523.269a6.49 6.477 43.146 0 1 .464 2.59l1.533-.27zM1.858 10.118l-1.351.78 1.33 2.271 1.339-.772a6.49 6.477 43.146 0 1-1.317-2.28zm12.301.003a6.49 6.477 43.146 0 1-.534 1.215 6.49 6.477 43.146 0 1-.774 1.069l1.338.773 1.302-2.288zm-9.557 3.471l-.534 1.47 2.48.884.525-1.446a6.49 6.477 43.146 0 1-2.303-.8 6.49 6.477 43.146 0 1-.168-.108zm6.814.016a6.49 6.477 43.146 0 1-2.475.897l.53 1.457 2.468-.917z\" />\n <path fill=\"currentColor\"\n d=\"M7.648 3.093a4.989 4.989 0 0 0-3.982 2.483 5.013 5.013 0 0 0 1.836 6.834 5.002 5.002 0 0 0 6.83-1.827 5.01 5.01 0 0 0-1.836-6.832 4.976 4.976 0 0 0-2.848-.658zM8 4.08a4 4 0 0 1 4 4 4 4 0 0 1-4 4 4 4 0 0 1-4-4 4 4 0 0 1 4-4z\" />\n </g>\n </svg>\n </button>\n </div>\n }\n <app-contacts [tenantId]=\"tenantId\" (makeCallEv)=\"onContactsMakeCall($event)\"></app-contacts>\n } @else if (activeTab === 'settings') {\n @if (!hideTabs) {\n <div class=\"page-heading\">\n <span>Settings</span>\n <button type=\"button\" class=\"settings-btn is-active\" disabled>\n <svg width=\"18px\" viewBox=\"-0.03 0 16.079 16.079\" aria-hidden=\"true\" focusable=\"false\">\n <g>\n <path fill=\"currentColor\"\n d=\"M8.182 1.083a6.99 6.99 0 0 0-6.248 3.493c-1.929 3.342-.776 7.629 2.57 9.562 3.346 1.934 7.634.792 9.562-2.55 1.929-3.343.776-7.634-2.57-9.567a6.98 6.98 0 0 0-3.314-.938zM8 2.08a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6z\" />\n <path fill=\"currentColor\"\n d=\"M9.322 0L6.69.393v1.354a6.49 6.477 43.146 0 1 2.632.005V0zM3.937 1.19L1.93 2.897l.988 1.177a6.49 6.477 43.146 0 1 2.017-1.69zm8.128.013l-.993 1.184a6.49 6.477 43.146 0 1 .17.09 6.49 6.477 43.146 0 1 1.845 1.603l1.006-1.197zM.455 5.42l-.44 2.596 1.515.267a6.49 6.477 43.146 0 1 .455-2.593zm15.086.003l-1.523.269a6.49 6.477 43.146 0 1 .464 2.59l1.533-.27zM1.858 10.118l-1.351.78 1.33 2.271 1.339-.772a6.49 6.477 43.146 0 1-1.317-2.28zm12.301.003a6.49 6.477 43.146 0 1-.534 1.215 6.49 6.477 43.146 0 1-.774 1.069l1.338.773 1.302-2.288zm-9.557 3.471l-.534 1.47 2.48.884.525-1.446a6.49 6.477 43.146 0 1-2.303-.8 6.49 6.477 43.146 0 1-.168-.108zm6.814.016a6.49 6.477 43.146 0 1-2.475.897l.53 1.457 2.468-.917z\" />\n <path fill=\"currentColor\"\n d=\"M7.648 3.093a4.989 4.989 0 0 0-3.982 2.483 5.013 5.013 0 0 0 1.836 6.834 5.002 5.002 0 0 0 6.83-1.827 5.01 5.01 0 0 0-1.836-6.832 4.976 4.976 0 0 0-2.848-.658zM8 4.08a4 4 0 0 1 4 4 4 4 0 0 1-4 4 4 4 0 0 1-4-4 4 4 0 0 1 4-4z\" />\n </g>\n </svg>\n </button>\n </div>\n }\n <app-settings\n [extensionId]=\"loginForm?.value?.ipoExtensionNo || userId\"\n [darkMode]=\"darkModeEnabled\"\n (darkModeChange)=\"onThemeToggle($event)\"\n (change)=\"onDeviceChange($event)\"\n (logout)=\"onLogout()\"\n ></app-settings>\n } @else {\n @if (!hideTabs) {\n <div class=\"page-heading\">\n <span>Keypad</span>\n <button type=\"button\" class=\"settings-btn\" (click)=\"selectTab('settings')\">\n <svg width=\"18px\" viewBox=\"-0.03 0 16.079 16.079\" aria-hidden=\"true\" focusable=\"false\">\n <g>\n <path fill=\"currentColor\"\n d=\"M8.182 1.083a6.99 6.99 0 0 0-6.248 3.493c-1.929 3.342-.776 7.629 2.57 9.562 3.346 1.934 7.634.792 9.562-2.55 1.929-3.343.776-7.634-2.57-9.567a6.98 6.98 0 0 0-3.314-.938zM8 2.08a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6z\" />\n <path fill=\"currentColor\"\n d=\"M9.322 0L6.69.393v1.354a6.49 6.477 43.146 0 1 2.632.005V0zM3.937 1.19L1.93 2.897l.988 1.177a6.49 6.477 43.146 0 1 2.017-1.69zm8.128.013l-.993 1.184a6.49 6.477 43.146 0 1 .17.09 6.49 6.477 43.146 0 1 1.845 1.603l1.006-1.197zM.455 5.42l-.44 2.596 1.515.267a6.49 6.477 43.146 0 1 .455-2.593zm15.086.003l-1.523.269a6.49 6.477 43.146 0 1 .464 2.59l1.533-.27zM1.858 10.118l-1.351.78 1.33 2.271 1.339-.772a6.49 6.477 43.146 0 1-1.317-2.28zm12.301.003a6.49 6.477 43.146 0 1-.534 1.215 6.49 6.477 43.146 0 1-.774 1.069l1.338.773 1.302-2.288zm-9.557 3.471l-.534 1.47 2.48.884.525-1.446a6.49 6.477 43.146 0 1-2.303-.8 6.49 6.477 43.146 0 1-.168-.108zm6.814.016a6.49 6.477 43.146 0 1-2.475.897l.53 1.457 2.468-.917z\" />\n <path fill=\"currentColor\"\n d=\"M7.648 3.093a4.989 4.989 0 0 0-3.982 2.483 5.013 5.013 0 0 0 1.836 6.834 5.002 5.002 0 0 0 6.83-1.827 5.01 5.01 0 0 0-1.836-6.832 4.976 4.976 0 0 0-2.848-.658zM8 4.08a4 4 0 0 1 4 4 4 4 0 0 1-4 4 4 4 0 0 1-4-4 4 4 0 0 1 4-4z\" />\n </g>\n </svg>\n </button>\n </div>\n }\n <app-phone\n [tenantId]=\"tenantId\"\n [agentId]=\"loginForm?.value?.ipoExtensionNo || userId\"\n [activeCallNumber]=\"activeCallNumber\"\n [incomingCallName]=\"incomingCallName\"\n [incomingNameResolved]=\"incomingNameResolved\"\n [activeCallName]=\"activeCallName\"\n [serverIp]=\"avayaIPOServerIP\"\n [serverPort]=\"avayaIPOServerPort\"\n [stunIp]=\"avayaIPOServerStunServerIP\"\n [stunPort]=\"avayaIPOServerStunServerPort\"\n [turnIp]=\"avayaIPOServerTurnServerIP\"\n [turnPort]=\"avayaIPOServerTurnServerPort\"\n [configurationMode]=\"configurationMode\"\n (makeCallEv)=\"onPhoneMakeCall($event)\"\n (endCallEv)=\"onPhoneEndCall()\"\n (callScreenChange)=\"onCallScreenChange($event)\"\n ></app-phone>\n }\n </div>\n </div>\n\n @if (showLoginLoader) {\n <div class=\"global-loader\">\n <div class=\"spinner\"></div>\n <div class=\"loader-text\">Connecting to phone service...</div>\n </div>\n }\n\n @if (!hideTabs) {\n <nav class=\"tabs\">\n <button type=\"button\" class=\"tab-btn\" [class.active]=\"activeTab === 'history'\" (click)=\"selectTab('history')\">\n <span class=\"tab-icon\">\n <svg width=\"19px\" viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\"\n d=\"M464 256A208 208 0 1 1 48 256a208 208 0 1 1 416 0zM0 256a256 256 0 1 0 512 0A256 256 0 1 0 0 256zM232 120l0 136c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2 280 120c0-13.3-10.7-24-24-24s-24 10.7-24 24z\" />\n </svg>\n </span>\n <span class=\"tab-text\">History</span>\n </button>\n <button type=\"button\" class=\"tab-btn\" [class.active]=\"activeTab === 'contacts'\" (click)=\"selectTab('contacts')\">\n <span class=\"tab-icon\">\n <svg width=\"18px\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\"\n d=\"M12 12a4 4 0 1 0-4-4 4 4 0 0 0 4 4zm0 2c-4.4 0-8 2.2-8 5v2h16v-2c0-2.8-3.6-5-8-5z\" />\n </svg>\n </span>\n <span class=\"tab-text\">Contacts</span>\n </button>\n <button type=\"button\" class=\"tab-btn\" [class.active]=\"activeTab === 'keypad'\" (click)=\"selectTab('keypad')\">\n <span class=\"tab-icon\">\n <svg width=\"20px\" viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\" d=\"M256,400a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M256,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M256,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M256,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M384,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M384,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M384,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M128,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M128,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M128,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n </svg>\n </span>\n <span class=\"tab-text\">Keypad</span>\n </button>\n </nav>\n }\n}\n}\n", styles: [":host{display:flex;flex-direction:column;width:100%;max-width:100%;margin:0;font-family:Open Sans,Helvetica Neue,Arial,sans-serif;min-height:100%;height:100%;background:var(--sd-surface);color:var(--sd-text);--sd-tabs-height: 60px;--sd-surface: #ffffff;--sd-surface-muted: #f7f7f7;--sd-text: #1f1f1f;--sd-text-muted: #666666;--sd-border: #e5e5e5;--sd-card: #ffffff;--sd-avatar: #f0f0f0;--sd-input: #ffffff;--sd-input-border: #dddddd}:host.dark-mode{--sd-surface: #0f1115;--sd-surface-muted: #151a22;--sd-text: #f2f4f8;--sd-text-muted: #aab0bb;--sd-border: #2a2f3a;--sd-card: #161b24;--sd-avatar: #222833;--sd-input: #1c222c;--sd-input-border: #2a2f3a}.container_connection_status_overlay{width:100%;position:relative;background-color:#6666661a;padding:10px;box-sizing:border-box}.container_connection_status{width:100%;background:#fff;padding:8px 10px;border-radius:8px;font-size:13px;font-weight:600;color:#666;display:flex;gap:8px;align-items:center;box-shadow:0 4px 10px #00000014}.container_connection_status .fa-circle-dot{color:#f66060}.simple-placeholder{padding:20px;text-align:center;color:#444;font-weight:600}.auth-error-screen,.auth-loading-screen{min-height:100%;display:flex;align-items:center;justify-content:center;padding:24px;background:radial-gradient(circle at top,#fff,#f2f4f7 65%,#e9edf3)}.auth-loading-card{width:min(320px,100%);padding:24px;border-radius:16px;background:#fff;border:1px solid #e5e7eb;box-shadow:0 16px 40px #0f172a1f;display:flex;flex-direction:column;gap:10px;text-align:center;align-items:center}.auth-loading-title{font-size:16px;font-weight:800;color:#111827}.auth-loading-message{font-size:12px;color:#6b7280}.auth-error-card{width:min(360px,100%);padding:24px;border-radius:16px;background:#fff;border:1px solid #e5e7eb;box-shadow:0 16px 40px #0f172a1f;display:flex;flex-direction:column;gap:10px;text-align:center}.auth-error-icon{width:56px;height:56px;margin:0 auto 4px;display:inline-flex;align-items:center;justify-content:center;border-radius:14px;background:#111827;color:#fff}.auth-error-icon svg{width:28px;height:28px}.auth-error-title{font-size:18px;font-weight:800;color:#111827}.auth-error-message{font-size:13px;color:#374151}.auth-error-hint{font-size:12px;color:#6b7280}.media-elements{display:none}.widget-body{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;position:relative;height:100%;padding-bottom:0;overflow-y:auto;-webkit-overflow-scrolling:touch}.logout-btn{border:none;background:#e3000f;color:#fff;padding:8px 12px;border-radius:6px;cursor:pointer;font-weight:600}.logout-btn:hover{background:#c0000d}.widget-content{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;gap:1rem;padding-bottom:0;height:100%}.page-heading{display:flex;align-items:center;justify-content:space-between;font-size:25px;font-weight:800;color:#1f1f1f;padding:15px;z-index:5;background:var(--sd-surface)}.settings-btn{width:34px;height:34px;border:none;background:transparent;color:#4a4a4a;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.settings-btn.is-active{color:#e3000f;border-color:#f0c4c8;background:#fff5f6}.settings-btn:disabled{cursor:default;opacity:.75}.tabs{position:sticky;bottom:0;left:0;right:0;display:flex;gap:6px;padding:8px 12px;background:#f7f7f7;border-top:1px solid #e0e0e0;box-sizing:border-box;z-index:10;height:var(--sd-tabs-height)}.tab-btn{flex:1 1 0;height:44px;border:none;background:transparent;font-weight:600;color:#666;border-radius:8px;cursor:pointer;transition:background .12s ease,color .12s ease;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;font-size:12px;box-shadow:none}.tab-btn.active{background:transparent;color:#e3000f;box-shadow:none}.tab-icon{display:flex;align-items:center;justify-content:center;font-size:16px}.tab-btn.active .tab-icon{color:#e3000f}.global-loader{position:absolute;inset:0;background:#ffffffd9;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;z-index:1000;color:#333;font-weight:700}.spinner{width:48px;height:48px;border:4px solid #f0f0f0;border-top-color:#e3000f;border-radius:50%;animation:spin .9s linear infinite}.loader-text{font-size:14px}@keyframes spin{to{transform:rotate(360deg)}}:host ::ng-deep .widget-body,:host ::ng-deep .widget-content{background:var(--sd-surface);color:var(--sd-text)}:host ::ng-deep .page-heading{color:var(--sd-text)}:host ::ng-deep .settings-btn{color:var(--sd-text)}:host ::ng-deep .tabs{background:var(--sd-surface-muted);border-top-color:var(--sd-border)}:host ::ng-deep .tab-btn{color:var(--sd-text-muted)}:host ::ng-deep .tab-btn.active{color:#e3000f;background:transparent}:host ::ng-deep .tab-btn.active .tab-icon{color:#e3000f}:host ::ng-deep .history_item,:host ::ng-deep .contact-card{border-bottom-color:var(--sd-border)}:host ::ng-deep .history_avatar,:host ::ng-deep .skeleton_avatar,:host ::ng-deep .contact-avatar{background:var(--sd-avatar);color:var(--sd-text)}:host ::ng-deep .history_name,:host ::ng-deep .contact-name{color:var(--sd-text)}:host ::ng-deep .history_time,:host ::ng-deep .history_meta,:host ::ng-deep .history_group_label,:host ::ng-deep .contact-phone,:host ::ng-deep .contacts-state{color:var(--sd-text-muted)}:host.dark-mode ::ng-deep .history_group_label{background:#151a22eb}:host.dark-mode ::ng-deep .history_item:hover{background:#1a202b}:host.dark-mode ::ng-deep .contacts-search input{background:var(--sd-input);border-color:var(--sd-input-border);color:var(--sd-text)}:host.dark-mode ::ng-deep .contacts-search input::placeholder{color:var(--sd-text-muted)}:host.dark-mode ::ng-deep .contact-call{background:#1e2b22;color:#79d48a}:host.dark-mode ::ng-deep .contact-back{background:#141922;border-color:var(--sd-border);color:var(--sd-text)}:host.dark-mode ::ng-deep .contact-call-btn{background:#1f2530;border-color:#1f2530;color:#79d48a}:host.dark-mode ::ng-deep .global-loader{background:#0f1115e6;color:var(--sd-text)}:host.dark-mode ::ng-deep .spinner{border-color:#2a2f3a;border-top-color:#e3000f}\n"], dependencies: [{ kind: "component", type: CallHistoryComponent, selector: "app-call-history", inputs: ["mode", "tenantId", "agentId"], outputs: ["makeCallEv", "transferEv"] }, { kind: "component", type: ContactsComponent, selector: "app-contacts", inputs: ["tenantId"], outputs: ["makeCallEv"] }, { kind: "component", type: SettingsComponent, selector: "app-settings", inputs: ["selectedAudioInputId", "selectedAudioOutputId", "extensionId", "darkMode"], outputs: ["change", "darkModeChange", "logout"] }, { kind: "component", type: AvayaIpoLoginComponent, selector: "app-avaya-ipo-login", inputs: ["loginForm", "showLoginLoader", "hasAvayaSocketError", "hasAvayaLoginError", "hasAvayaLoginFailedGeneral", "hasAvayaLoginConflictError", "hasAvayaDeviceError"], outputs: ["login"] }, { kind: "component", type: PhoneComponent, selector: "app-phone", inputs: ["contacts", "tenantId", "agentId", "isActiveCall", "activeCallNumber", "incomingCallName", "incomingNameResolved", "activeCallName", "serverIp", "serverPort", "stunIp", "stunPort", "turnIp", "turnPort", "configurationMode"], outputs: ["callScreenChange", "makeCallEv", "endCallEv"] }] });
|
|
5355
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: AvayaIPOWidgetComponent, isStandalone: false, selector: "snugdesk-avaya-ipo-widget", inputs: { isVisible: "isVisible", displayMode: "displayMode", configurationMode: "configurationMode", recordingUploadMode: "recordingUploadMode", avayaIPOServerIP: "avayaIPOServerIP", avayaIPOServerPort: "avayaIPOServerPort", avayaIPOServerStunServerIP: "avayaIPOServerStunServerIP", avayaIPOServerStunServerPort: "avayaIPOServerStunServerPort", avayaIPOServerTurnServerIP: "avayaIPOServerTurnServerIP", avayaIPOServerTurnServerPort: "avayaIPOServerTurnServerPort", token: "token", tenantId: "tenantId", userId: "userId", extension: "extension", password: "password", showHistory: "showHistory", showContacts: "showContacts" }, outputs: { notificationEvent: "notificationEvent", incomingCall: "incomingCall" }, host: { properties: { "class.avaya-ipo-dark-mode": "this.hostDarkMode", "class.avaya-ipo-mode-standalone": "this.hostModeStandalone", "class.avaya-ipo-mode-popup": "this.hostModePopup" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"avaya-ipo-media-elements\">\n <audio id=\"rmtAudio\" autoplay></audio>\n <audio id=\"lclAudio\" autoplay></audio>\n <video id=\"rmtVideo\" autoplay playsinline></video>\n <video id=\"lclVideo\" autoplay playsinline muted></video>\n</div>\n\n@if (authLoading) {\n <div class=\"avaya-ipo-auth-loading-screen\">\n <div class=\"avaya-ipo-auth-loading-card\">\n <div class=\"avaya-ipo-spinner\" aria-hidden=\"true\"></div>\n <div class=\"avaya-ipo-auth-loading-title\">Checking authentication</div>\n <div class=\"avaya-ipo-auth-loading-message\">Please wait...</div>\n </div>\n </div>\n} @else if (authErrorMessage) {\n <div class=\"avaya-ipo-auth-error-screen\">\n <div class=\"avaya-ipo-auth-error-card\">\n <div class=\"avaya-ipo-auth-error-icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M12 2a7 7 0 0 1 7 7v3a2 2 0 0 1 2 2v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-6a2 2 0 0 1 2-2V9a7 7 0 0 1 7-7zm5 10V9a5 5 0 0 0-10 0v3h10zm-5 3a2 2 0 0 0-1 3.732V20h2v-1.268A2 2 0 0 0 12 15z\"\n />\n </svg>\n </div>\n <div class=\"avaya-ipo-auth-error-title\">Authentication Required</div>\n <div class=\"avaya-ipo-auth-error-message\">{{ authErrorMessage }}</div>\n </div>\n </div>\n} @else {\n@if (isReconnectingInProgress || isFailoverInProgress || isFailbackInProgress) {\n <div class=\"avaya-ipo-container_connection_status_overlay\">\n <div class=\"avaya-ipo-container_connection_status\">\n <i class=\"fa-solid fa-circle-dot\"></i>\n @if (isReconnectingInProgress) { <span>Reconnecting to the server...</span> }\n @if (isFailoverInProgress) { <span>Failover in progress...</span> }\n @if (isFailbackInProgress) { <span>Failback in progress...</span> }\n </div>\n </div>\n}\n\n@if (showLoginForm) {\n <app-avaya-ipo-login\n [loginForm]=\"loginForm\"\n [showLoginLoader]=\"showLoginLoader\"\n [hasAvayaSocketError]=\"hasAvayaSocketError\"\n [hasAvayaLoginError]=\"hasAvayaLoginError\"\n [hasAvayaLoginFailedGeneral]=\"hasAvayaLoginFailedGeneral\"\n [hasAvayaLoginConflictError]=\"hasAvayaLoginConflictError\"\n [hasAvayaDeviceError]=\"hasAvayaDeviceError\"\n (login)=\"onLogin()\"\n ></app-avaya-ipo-login>\n} @else {\n <div class=\"avaya-ipo-widget-body\">\n <div class=\"avaya-ipo-widget-content\">\n @if (activeTab === 'history') {\n @if (!hideTabs) {\n <div class=\"avaya-ipo-page-heading avaya-ipo-heading-right\">\n <span>History</span>\n <button type=\"button\" class=\"avaya-ipo-settings-btn\" (click)=\"selectTab('settings')\">\n <svg width=\"18px\" viewBox=\"-0.03 0 16.079 16.079\" aria-hidden=\"true\" focusable=\"false\">\n <g>\n <path fill=\"currentColor\"\n d=\"M8.182 1.083a6.99 6.99 0 0 0-6.248 3.493c-1.929 3.342-.776 7.629 2.57 9.562 3.346 1.934 7.634.792 9.562-2.55 1.929-3.343.776-7.634-2.57-9.567a6.98 6.98 0 0 0-3.314-.938zM8 2.08a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6z\" />\n <path fill=\"currentColor\"\n d=\"M9.322 0L6.69.393v1.354a6.49 6.477 43.146 0 1 2.632.005V0zM3.937 1.19L1.93 2.897l.988 1.177a6.49 6.477 43.146 0 1 2.017-1.69zm8.128.013l-.993 1.184a6.49 6.477 43.146 0 1 .17.09 6.49 6.477 43.146 0 1 1.845 1.603l1.006-1.197zM.455 5.42l-.44 2.596 1.515.267a6.49 6.477 43.146 0 1 .455-2.593zm15.086.003l-1.523.269a6.49 6.477 43.146 0 1 .464 2.59l1.533-.27zM1.858 10.118l-1.351.78 1.33 2.271 1.339-.772a6.49 6.477 43.146 0 1-1.317-2.28zm12.301.003a6.49 6.477 43.146 0 1-.534 1.215 6.49 6.477 43.146 0 1-.774 1.069l1.338.773 1.302-2.288zm-9.557 3.471l-.534 1.47 2.48.884.525-1.446a6.49 6.477 43.146 0 1-2.303-.8 6.49 6.477 43.146 0 1-.168-.108zm6.814.016a6.49 6.477 43.146 0 1-2.475.897l.53 1.457 2.468-.917z\" />\n <path fill=\"currentColor\"\n d=\"M7.648 3.093a4.989 4.989 0 0 0-3.982 2.483 5.013 5.013 0 0 0 1.836 6.834 5.002 5.002 0 0 0 6.83-1.827 5.01 5.01 0 0 0-1.836-6.832 4.976 4.976 0 0 0-2.848-.658zM8 4.08a4 4 0 0 1 4 4 4 4 0 0 1-4 4 4 4 0 0 1-4-4 4 4 0 0 1 4-4z\" />\n </g>\n </svg>\n </button>\n </div>\n }\n <app-call-history\n [tenantId]=\"tenantId\"\n [agentId]=\"loginForm?.value?.ipoExtensionNo || userId\"\n (makeCallEv)=\"onHistoryMakeCall($event)\"\n ></app-call-history>\n } @else if (activeTab === 'contacts') {\n @if (!hideTabs) {\n <div class=\"avaya-ipo-page-heading\">\n <span>Contacts</span>\n <button type=\"button\" class=\"avaya-ipo-settings-btn\" (click)=\"selectTab('settings')\">\n <svg width=\"18px\" viewBox=\"-0.03 0 16.079 16.079\" aria-hidden=\"true\" focusable=\"false\">\n <g>\n <path fill=\"currentColor\"\n d=\"M8.182 1.083a6.99 6.99 0 0 0-6.248 3.493c-1.929 3.342-.776 7.629 2.57 9.562 3.346 1.934 7.634.792 9.562-2.55 1.929-3.343.776-7.634-2.57-9.567a6.98 6.98 0 0 0-3.314-.938zM8 2.08a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6z\" />\n <path fill=\"currentColor\"\n d=\"M9.322 0L6.69.393v1.354a6.49 6.477 43.146 0 1 2.632.005V0zM3.937 1.19L1.93 2.897l.988 1.177a6.49 6.477 43.146 0 1 2.017-1.69zm8.128.013l-.993 1.184a6.49 6.477 43.146 0 1 .17.09 6.49 6.477 43.146 0 1 1.845 1.603l1.006-1.197zM.455 5.42l-.44 2.596 1.515.267a6.49 6.477 43.146 0 1 .455-2.593zm15.086.003l-1.523.269a6.49 6.477 43.146 0 1 .464 2.59l1.533-.27zM1.858 10.118l-1.351.78 1.33 2.271 1.339-.772a6.49 6.477 43.146 0 1-1.317-2.28zm12.301.003a6.49 6.477 43.146 0 1-.534 1.215 6.49 6.477 43.146 0 1-.774 1.069l1.338.773 1.302-2.288zm-9.557 3.471l-.534 1.47 2.48.884.525-1.446a6.49 6.477 43.146 0 1-2.303-.8 6.49 6.477 43.146 0 1-.168-.108zm6.814.016a6.49 6.477 43.146 0 1-2.475.897l.53 1.457 2.468-.917z\" />\n <path fill=\"currentColor\"\n d=\"M7.648 3.093a4.989 4.989 0 0 0-3.982 2.483 5.013 5.013 0 0 0 1.836 6.834 5.002 5.002 0 0 0 6.83-1.827 5.01 5.01 0 0 0-1.836-6.832 4.976 4.976 0 0 0-2.848-.658zM8 4.08a4 4 0 0 1 4 4 4 4 0 0 1-4 4 4 4 0 0 1-4-4 4 4 0 0 1 4-4z\" />\n </g>\n </svg>\n </button>\n </div>\n }\n <app-contacts [tenantId]=\"tenantId\" (makeCallEv)=\"onContactsMakeCall($event)\"></app-contacts>\n } @else if (activeTab === 'settings') {\n @if (!hideTabs) {\n <div class=\"avaya-ipo-page-heading\">\n <span class=\"avaya-ipo-heading-with-back\">\n <button type=\"button\" class=\"avaya-ipo-settings-btn avaya-ipo-back-btn\" (click)=\"closeSettings()\" aria-label=\"Go back\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M15 18l-6-6 6-6\" />\n </svg>\n </button>\n <span>Settings</span>\n </span>\n </div>\n }\n <app-settings\n [extensionId]=\"loginForm?.value?.ipoExtensionNo || userId\"\n [darkMode]=\"darkModeEnabled\"\n (darkModeChange)=\"onThemeToggle($event)\"\n (change)=\"onDeviceChange($event)\"\n (logout)=\"onLogout()\"\n ></app-settings>\n } @else {\n @if (!hideTabs) {\n <button type=\"button\" class=\"avaya-ipo-settings-btn avaya-ipo-settings-btn-floating\" (click)=\"selectTab('settings')\" aria-label=\"Settings\">\n <svg width=\"18px\" viewBox=\"-0.03 0 16.079 16.079\" aria-hidden=\"true\" focusable=\"false\">\n <g>\n <path fill=\"currentColor\"\n d=\"M8.182 1.083a6.99 6.99 0 0 0-6.248 3.493c-1.929 3.342-.776 7.629 2.57 9.562 3.346 1.934 7.634.792 9.562-2.55 1.929-3.343.776-7.634-2.57-9.567a6.98 6.98 0 0 0-3.314-.938zM8 2.08a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6z\" />\n <path fill=\"currentColor\"\n d=\"M9.322 0L6.69.393v1.354a6.49 6.477 43.146 0 1 2.632.005V0zM3.937 1.19L1.93 2.897l.988 1.177a6.49 6.477 43.146 0 1 2.017-1.69zm8.128.013l-.993 1.184a6.49 6.477 43.146 0 1 .17.09 6.49 6.477 43.146 0 1 1.845 1.603l1.006-1.197zM.455 5.42l-.44 2.596 1.515.267a6.49 6.477 43.146 0 1 .455-2.593zm15.086.003l-1.523.269a6.49 6.477 43.146 0 1 .464 2.59l1.533-.27zM1.858 10.118l-1.351.78 1.33 2.271 1.339-.772a6.49 6.477 43.146 0 1-1.317-2.28zm12.301.003a6.49 6.477 43.146 0 1-.534 1.215 6.49 6.477 43.146 0 1-.774 1.069l1.338.773 1.302-2.288zm-9.557 3.471l-.534 1.47 2.48.884.525-1.446a6.49 6.477 43.146 0 1-2.303-.8 6.49 6.477 43.146 0 1-.168-.108zm6.814.016a6.49 6.477 43.146 0 1-2.475.897l.53 1.457 2.468-.917z\" />\n <path fill=\"currentColor\"\n d=\"M7.648 3.093a4.989 4.989 0 0 0-3.982 2.483 5.013 5.013 0 0 0 1.836 6.834 5.002 5.002 0 0 0 6.83-1.827 5.01 5.01 0 0 0-1.836-6.832 4.976 4.976 0 0 0-2.848-.658zM8 4.08a4 4 0 0 1 4 4 4 4 0 0 1-4 4 4 4 0 0 1-4-4 4 4 0 0 1 4-4z\" />\n </g>\n </svg>\n </button>\n }\n <app-phone\n [tenantId]=\"tenantId\"\n [agentId]=\"loginForm?.value?.ipoExtensionNo || userId\"\n [activeCallNumber]=\"activeCallNumber\"\n [incomingCallName]=\"incomingCallName\"\n [incomingNameResolved]=\"incomingNameResolved\"\n [activeCallName]=\"activeCallName\"\n [serverIp]=\"avayaIPOServerIP\"\n [serverPort]=\"avayaIPOServerPort\"\n [stunIp]=\"avayaIPOServerStunServerIP\"\n [stunPort]=\"avayaIPOServerStunServerPort\"\n [turnIp]=\"avayaIPOServerTurnServerIP\"\n [turnPort]=\"avayaIPOServerTurnServerPort\"\n [configurationMode]=\"configurationMode\"\n [recordingUploadMode]=\"recordingUploadMode\"\n [entityId]=\"activeCallEntityId\"\n (makeCallEv)=\"onPhoneMakeCall($event)\"\n (endCallEv)=\"onPhoneEndCall()\"\n (callScreenChange)=\"onCallScreenChange($event)\"\n ></app-phone>\n }\n </div>\n </div>\n\n @if (showLoginLoader) {\n <div class=\"avaya-ipo-global-loader\">\n <div class=\"avaya-ipo-spinner\"></div>\n <div class=\"avaya-ipo-loader-text\">Connecting to phone service...</div>\n </div>\n }\n\n @if (!hideTabs && showTabBar) {\n <nav class=\"avaya-ipo-tabs\">\n @if (showHistory) {\n <button type=\"button\" class=\"avaya-ipo-tab-btn\" [class.avaya-ipo-active]=\"activeTab === 'history'\" (click)=\"selectTab('history')\">\n <span class=\"avaya-ipo-tab-icon\">\n <svg width=\"19px\" viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\"\n d=\"M464 256A208 208 0 1 1 48 256a208 208 0 1 1 416 0zM0 256a256 256 0 1 0 512 0A256 256 0 1 0 0 256zM232 120l0 136c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2 280 120c0-13.3-10.7-24-24-24s-24 10.7-24 24z\" />\n </svg>\n </span>\n <span class=\"avaya-ipo-tab-text\">History</span>\n </button>\n }\n @if (showContacts) {\n <button type=\"button\" class=\"avaya-ipo-tab-btn\" [class.avaya-ipo-active]=\"activeTab === 'contacts'\" (click)=\"selectTab('contacts')\">\n <span class=\"avaya-ipo-tab-icon\">\n <svg width=\"18px\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\"\n d=\"M12 12a4 4 0 1 0-4-4 4 4 0 0 0 4 4zm0 2c-4.4 0-8 2.2-8 5v2h16v-2c0-2.8-3.6-5-8-5z\" />\n </svg>\n </span>\n <span class=\"avaya-ipo-tab-text\">Contacts</span>\n </button>\n }\n <button type=\"button\" class=\"avaya-ipo-tab-btn\" [class.avaya-ipo-active]=\"activeTab === 'keypad'\" (click)=\"selectTab('keypad')\">\n <span class=\"avaya-ipo-tab-icon\">\n <svg width=\"20px\" viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\" d=\"M256,400a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M256,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M256,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M256,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M384,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M384,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M384,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M128,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M128,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M128,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n </svg>\n </span>\n <span class=\"avaya-ipo-tab-text\">Keypad</span>\n </button>\n </nav>\n }\n\n @if (activeTab !== 'keypad') {\n <div class=\"avaya-ipo-widget-version-footer\">v{{ widgetVersion }}</div>\n }\n}\n}\n", styles: [":host{display:flex;flex-direction:column;width:100%;max-width:100%;margin:0;font-family:Open Sans,Helvetica Neue,Arial,sans-serif;min-height:100%;height:100%;background:var(--sd-surface);color:var(--sd-text);box-sizing:border-box;--sd-tabs-height: 60px;--sd-radius-sm: 8px;--sd-radius: 10px;--sd-radius-lg: 14px;--sd-radius-pill: 999px;--sd-shadow-sm: 0 1px 2px rgba(16, 24, 40, .06);--sd-shadow-md: 0 6px 16px rgba(16, 24, 40, .1);--sd-shadow-lg: 0 16px 40px rgba(16, 24, 40, .14);--sd-accent: var(--app-color, #ff6633);--sd-accent-strong: var(--app-color-dark, #ff5805);--sd-accent-soft: #fff1ea;--sd-accent-contrast: #ffffff;--sd-call-accept: #1aa251;--sd-call-end: #e5484d;--sd-surface: var(--background-color, #ffffff);--sd-surface-muted: var(--background-color-dark, #f7f7f7);--sd-surface-sunken: var(--background-color-dark-light, #e8e8e8);--sd-text: var(--header-text-primary, #333333);--sd-text-muted: var(--header-text-secondary, #5f6368);--sd-text-subtle: var(--header-text-muted, #9ca3af);--sd-border: var(--dropdown-border, #e3e3e3);--sd-border-strong: var(--border-color, #c9c9c9);--sd-card: var(--background-color, #ffffff);--sd-avatar: #eceff3;--sd-input: var(--background-color, #ffffff);--sd-input-border: var(--border-color, #c9c9c9);--sd-focus-ring: 0 0 0 3px rgba(255, 102, 51, .22)}:host.avaya-ipo-dark-mode{--sd-accent: #ff7a4d;--sd-accent-strong: #ff6633;--sd-accent-soft: rgba(255, 122, 77, .14);--sd-accent-contrast: #1a1109;--sd-call-accept: #34c759;--sd-call-end: #ff5b5b;--sd-surface: #0f1115;--sd-surface-muted: #151a22;--sd-surface-sunken: #1c222c;--sd-text: #f2f4f8;--sd-text-muted: #aab0bb;--sd-text-subtle: #7e8794;--sd-border: #2a2f3a;--sd-border-strong: #353b47;--sd-card: #161b24;--sd-avatar: #222833;--sd-input: #1c222c;--sd-input-border: #2a2f3a;--sd-focus-ring: 0 0 0 3px rgba(255, 122, 77, .25)}:host.avaya-ipo-mode-popup{min-width:320px;height:100%}:host.avaya-ipo-mode-standalone{width:100%;max-width:460px;height:100dvh;min-height:100dvh;margin-inline:auto;border-inline:1px solid var(--sd-border);box-shadow:var(--sd-shadow-lg);overflow:hidden}@media (max-width: 768px){:host.avaya-ipo-mode-standalone{max-width:100%;border-inline:0;box-shadow:none}}.avaya-ipo-container_connection_status_overlay{width:100%;position:relative;background-color:#7f7f7f1a;padding:10px;box-sizing:border-box}.avaya-ipo-container_connection_status{width:100%;background:var(--sd-card);padding:8px 10px;border-radius:var(--sd-radius-sm);font-size:13px;font-weight:600;color:var(--sd-text-muted);display:flex;gap:8px;align-items:center;box-shadow:var(--sd-shadow-md)}.avaya-ipo-container_connection_status .fa-circle-dot{color:var(--sd-accent)}.avaya-ipo-simple-placeholder{padding:20px;text-align:center;color:var(--sd-text);font-weight:600}.avaya-ipo-auth-error-screen,.avaya-ipo-auth-loading-screen{min-height:100%;flex:1 1 auto;display:flex;align-items:center;justify-content:center;padding:24px;box-sizing:border-box;background:var(--sd-surface)}.avaya-ipo-auth-loading-card{width:min(320px,100%);padding:24px;border-radius:var(--sd-radius-lg);background:var(--sd-card);border:1px solid var(--sd-border);box-shadow:var(--sd-shadow-lg);display:flex;flex-direction:column;gap:10px;text-align:center;align-items:center}.avaya-ipo-auth-loading-title{font-size:16px;font-weight:800;color:var(--sd-text)}.avaya-ipo-auth-loading-message{font-size:12px;color:var(--sd-text-muted)}.avaya-ipo-auth-error-card{width:min(360px,100%);padding:24px;border-radius:var(--sd-radius-lg);background:var(--sd-card);border:1px solid var(--sd-border);box-shadow:var(--sd-shadow-lg);display:flex;flex-direction:column;gap:10px;text-align:center}.avaya-ipo-auth-error-icon{width:56px;height:56px;margin:0 auto 4px;display:inline-flex;align-items:center;justify-content:center;border-radius:var(--sd-radius-lg);background:var(--sd-accent);color:var(--sd-accent-contrast)}.avaya-ipo-auth-error-icon svg{width:28px;height:28px}.avaya-ipo-auth-error-title{font-size:18px;font-weight:800;color:var(--sd-text)}.avaya-ipo-auth-error-message{font-size:13px;color:var(--sd-text-muted)}.avaya-ipo-auth-error-hint{font-size:12px;color:var(--sd-text-subtle)}.avaya-ipo-media-elements{display:none}.avaya-ipo-widget-body{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;position:relative;height:100%;padding-bottom:0;overflow-y:auto;-webkit-overflow-scrolling:touch}.avaya-ipo-logout-btn{border:none;background:var(--sd-call-end);color:#fff;padding:8px 12px;border-radius:var(--sd-radius-sm);cursor:pointer;font-weight:600}.avaya-ipo-logout-btn:hover{filter:brightness(.94)}.avaya-ipo-widget-content{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;gap:1rem;padding-bottom:0;height:100%}.avaya-ipo-page-heading{display:flex;align-items:center;justify-content:space-between;font-size:22px;font-weight:800;color:var(--sd-text);padding:15px;z-index:5;background:var(--sd-surface)}.avaya-ipo-settings-btn{width:34px;height:34px;border-radius:var(--sd-radius-sm);border:none;background:transparent;color:var(--sd-text-muted);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:background .12s ease,color .12s ease}.avaya-ipo-settings-btn:hover{background:var(--sd-surface-muted)}.avaya-ipo-settings-btn.avaya-ipo-is-active{color:var(--sd-accent);background:var(--sd-accent-soft)}.avaya-ipo-settings-btn:disabled{cursor:default;opacity:.75}.avaya-ipo-settings-btn-floating{position:absolute;top:8px;right:8px;z-index:6}.avaya-ipo-heading-with-back{display:inline-flex;align-items:center;gap:4px}.avaya-ipo-settings-btn.avaya-ipo-back-btn{color:var(--sd-text)}.avaya-ipo-tabs{position:sticky;bottom:0;left:0;right:0;display:flex;gap:6px;padding:8px 12px;background:var(--sd-surface-muted);border-top:1px solid var(--sd-border);box-sizing:border-box;z-index:10;height:var(--sd-tabs-height)}.avaya-ipo-tab-btn{flex:1 1 0;height:44px;border:none;background:transparent;font-weight:600;color:var(--sd-text-muted);border-radius:var(--sd-radius-sm);cursor:pointer;transition:background .12s ease,color .12s ease;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;font-size:12px;box-shadow:none}.avaya-ipo-tab-btn:hover{color:var(--sd-text)}.avaya-ipo-tab-btn.avaya-ipo-active{background:var(--sd-accent-soft);color:var(--sd-accent);box-shadow:none}.avaya-ipo-tab-icon{display:flex;align-items:center;justify-content:center;font-size:16px}.avaya-ipo-tab-btn.avaya-ipo-active .avaya-ipo-tab-icon{color:var(--sd-accent)}.avaya-ipo-global-loader{position:absolute;inset:0;background:color-mix(in srgb,var(--sd-surface) 85%,transparent);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;z-index:1000;color:var(--sd-text);font-weight:700}.avaya-ipo-spinner{width:48px;height:48px;border:4px solid var(--sd-surface-sunken);border-top-color:var(--sd-accent);border-radius:50%;animation:spin .9s linear infinite}.avaya-ipo-loader-text{font-size:14px}@keyframes spin{to{transform:rotate(360deg)}}:host ::ng-deep .avaya-ipo-widget-body,:host ::ng-deep .avaya-ipo-widget-content{background:var(--sd-surface);color:var(--sd-text)}:host ::ng-deep .avaya-ipo-page-heading{color:var(--sd-text)}:host ::ng-deep .avaya-ipo-settings-btn{color:var(--sd-text-muted)}:host ::ng-deep .avaya-ipo-tabs{background:var(--sd-surface-muted);border-top-color:var(--sd-border)}:host ::ng-deep .avaya-ipo-tab-btn{color:var(--sd-text-muted)}:host ::ng-deep .avaya-ipo-tab-btn.avaya-ipo-active{color:var(--sd-accent);background:var(--sd-accent-soft)}:host ::ng-deep .avaya-ipo-tab-btn.avaya-ipo-active .avaya-ipo-tab-icon{color:var(--sd-accent)}:host ::ng-deep .avaya-ipo-history_item,:host ::ng-deep .avaya-ipo-contact-card{border-bottom-color:var(--sd-border)}:host ::ng-deep .avaya-ipo-history_avatar,:host ::ng-deep .avaya-ipo-skeleton_avatar,:host ::ng-deep .avaya-ipo-contact-avatar{background:var(--sd-avatar);color:var(--sd-text)}:host ::ng-deep .avaya-ipo-history_name,:host ::ng-deep .avaya-ipo-contact-name{color:var(--sd-text)}:host ::ng-deep .avaya-ipo-history_time,:host ::ng-deep .avaya-ipo-history_meta,:host ::ng-deep .avaya-ipo-history_group_label,:host ::ng-deep .avaya-ipo-contact-phone,:host ::ng-deep .avaya-ipo-contacts-state{color:var(--sd-text-muted)}:host.avaya-ipo-dark-mode ::ng-deep .avaya-ipo-history_group_label{background:#151a22eb}:host.avaya-ipo-dark-mode ::ng-deep .avaya-ipo-history_item:hover{background:#1a202b}:host.avaya-ipo-dark-mode ::ng-deep .avaya-ipo-contacts-search input{background:var(--sd-input);border-color:var(--sd-input-border);color:var(--sd-text)}:host.avaya-ipo-dark-mode ::ng-deep .avaya-ipo-contacts-search input::placeholder{color:var(--sd-text-muted)}:host.avaya-ipo-dark-mode ::ng-deep .avaya-ipo-contact-call{background:#1e2b22;color:#79d48a}:host.avaya-ipo-dark-mode ::ng-deep .avaya-ipo-contact-back{background:#141922;border-color:var(--sd-border);color:var(--sd-text)}:host.avaya-ipo-dark-mode ::ng-deep .avaya-ipo-contact-call-btn{background:#1f2530;border-color:#1f2530;color:#79d48a}:host.avaya-ipo-dark-mode ::ng-deep .avaya-ipo-global-loader{background:#0f1115e6;color:var(--sd-text)}:host.avaya-ipo-dark-mode ::ng-deep .avaya-ipo-spinner{border-color:#2a2f3a;border-top-color:var(--sd-accent)}.avaya-ipo-widget-version-footer{flex:0 0 auto;padding:2px 8px 4px;text-align:center;font-size:10px;line-height:1.2;letter-spacing:.02em;color:var(--sd-text-muted);background:var(--sd-surface);border-top:1px solid var(--sd-border);-webkit-user-select:text;user-select:text}\n"], dependencies: [{ kind: "component", type: CallHistoryComponent, selector: "app-call-history", inputs: ["mode", "tenantId", "agentId"], outputs: ["makeCallEv", "transferEv"] }, { kind: "component", type: ContactsComponent, selector: "app-contacts", inputs: ["tenantId"], outputs: ["makeCallEv"] }, { kind: "component", type: SettingsComponent, selector: "app-settings", inputs: ["selectedAudioInputId", "selectedAudioOutputId", "extensionId", "darkMode"], outputs: ["change", "darkModeChange", "logout"] }, { kind: "component", type: AvayaIpoLoginComponent, selector: "app-avaya-ipo-login", inputs: ["loginForm", "showLoginLoader", "hasAvayaSocketError", "hasAvayaLoginError", "hasAvayaLoginFailedGeneral", "hasAvayaLoginConflictError", "hasAvayaDeviceError"], outputs: ["login"] }, { kind: "component", type: PhoneComponent, selector: "app-phone", inputs: ["contacts", "tenantId", "agentId", "isActiveCall", "activeCallNumber", "incomingCallName", "incomingNameResolved", "activeCallName", "serverIp", "serverPort", "stunIp", "stunPort", "turnIp", "turnPort", "configurationMode", "recordingUploadMode", "entityId"], outputs: ["callScreenChange", "makeCallEv", "endCallEv"] }] });
|
|
4764
5356
|
}
|
|
4765
5357
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: AvayaIPOWidgetComponent, decorators: [{
|
|
4766
5358
|
type: Component,
|
|
4767
|
-
args: [{ selector: 'snugdesk-avaya-ipo-widget', standalone: false, template: "<div class=\"media-elements\">\n <audio id=\"rmtAudio\" autoplay></audio>\n <audio id=\"lclAudio\" autoplay></audio>\n <video id=\"rmtVideo\" autoplay playsinline></video>\n <video id=\"lclVideo\" autoplay playsinline muted></video>\n</div>\n\n@if (authLoading) {\n <div class=\"auth-loading-screen\">\n <div class=\"auth-loading-card\">\n <div class=\"spinner\" aria-hidden=\"true\"></div>\n <div class=\"auth-loading-title\">Checking authentication</div>\n <div class=\"auth-loading-message\">Please wait...</div>\n </div>\n </div>\n} @else if (authErrorMessage) {\n <div class=\"auth-error-screen\">\n <div class=\"auth-error-card\">\n <div class=\"auth-error-icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M12 2a7 7 0 0 1 7 7v3a2 2 0 0 1 2 2v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-6a2 2 0 0 1 2-2V9a7 7 0 0 1 7-7zm5 10V9a5 5 0 0 0-10 0v3h10zm-5 3a2 2 0 0 0-1 3.732V20h2v-1.268A2 2 0 0 0 12 15z\"\n />\n </svg>\n </div>\n <div class=\"auth-error-title\">Authentication Required</div>\n <div class=\"auth-error-message\">{{ authErrorMessage }}</div>\n </div>\n </div>\n} @else {\n@if (isReconnectingInProgress || isFailoverInProgress || isFailbackInProgress) {\n <div class=\"container_connection_status_overlay\">\n <div class=\"container_connection_status\">\n <i class=\"fa-solid fa-circle-dot\"></i>\n @if (isReconnectingInProgress) { <span>Reconnecting to the server...</span> }\n @if (isFailoverInProgress) { <span>Failover in progress...</span> }\n @if (isFailbackInProgress) { <span>Failback in progress...</span> }\n </div>\n </div>\n}\n\n@if (showLoginForm) {\n <app-avaya-ipo-login\n [loginForm]=\"loginForm\"\n [showLoginLoader]=\"showLoginLoader\"\n [hasAvayaSocketError]=\"hasAvayaSocketError\"\n [hasAvayaLoginError]=\"hasAvayaLoginError\"\n [hasAvayaLoginFailedGeneral]=\"hasAvayaLoginFailedGeneral\"\n [hasAvayaLoginConflictError]=\"hasAvayaLoginConflictError\"\n [hasAvayaDeviceError]=\"hasAvayaDeviceError\"\n (login)=\"onLogin()\"\n ></app-avaya-ipo-login>\n} @else {\n <div class=\"widget-body\">\n <div class=\"widget-content\">\n @if (activeTab === 'history') {\n @if (!hideTabs) {\n <div class=\"page-heading\">\n <span>History</span>\n <button type=\"button\" class=\"settings-btn\" (click)=\"selectTab('settings')\">\n <svg width=\"18px\" viewBox=\"-0.03 0 16.079 16.079\" aria-hidden=\"true\" focusable=\"false\">\n <g>\n <path fill=\"currentColor\"\n d=\"M8.182 1.083a6.99 6.99 0 0 0-6.248 3.493c-1.929 3.342-.776 7.629 2.57 9.562 3.346 1.934 7.634.792 9.562-2.55 1.929-3.343.776-7.634-2.57-9.567a6.98 6.98 0 0 0-3.314-.938zM8 2.08a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6z\" />\n <path fill=\"currentColor\"\n d=\"M9.322 0L6.69.393v1.354a6.49 6.477 43.146 0 1 2.632.005V0zM3.937 1.19L1.93 2.897l.988 1.177a6.49 6.477 43.146 0 1 2.017-1.69zm8.128.013l-.993 1.184a6.49 6.477 43.146 0 1 .17.09 6.49 6.477 43.146 0 1 1.845 1.603l1.006-1.197zM.455 5.42l-.44 2.596 1.515.267a6.49 6.477 43.146 0 1 .455-2.593zm15.086.003l-1.523.269a6.49 6.477 43.146 0 1 .464 2.59l1.533-.27zM1.858 10.118l-1.351.78 1.33 2.271 1.339-.772a6.49 6.477 43.146 0 1-1.317-2.28zm12.301.003a6.49 6.477 43.146 0 1-.534 1.215 6.49 6.477 43.146 0 1-.774 1.069l1.338.773 1.302-2.288zm-9.557 3.471l-.534 1.47 2.48.884.525-1.446a6.49 6.477 43.146 0 1-2.303-.8 6.49 6.477 43.146 0 1-.168-.108zm6.814.016a6.49 6.477 43.146 0 1-2.475.897l.53 1.457 2.468-.917z\" />\n <path fill=\"currentColor\"\n d=\"M7.648 3.093a4.989 4.989 0 0 0-3.982 2.483 5.013 5.013 0 0 0 1.836 6.834 5.002 5.002 0 0 0 6.83-1.827 5.01 5.01 0 0 0-1.836-6.832 4.976 4.976 0 0 0-2.848-.658zM8 4.08a4 4 0 0 1 4 4 4 4 0 0 1-4 4 4 4 0 0 1-4-4 4 4 0 0 1 4-4z\" />\n </g>\n </svg>\n </button>\n </div>\n }\n <app-call-history\n [tenantId]=\"tenantId\"\n [agentId]=\"loginForm?.value?.ipoExtensionNo || userId\"\n (makeCallEv)=\"onHistoryMakeCall($event)\"\n ></app-call-history>\n } @else if (activeTab === 'contacts') {\n @if (!hideTabs) {\n <div class=\"page-heading\">\n <span>Contacts</span>\n <button type=\"button\" class=\"settings-btn\" (click)=\"selectTab('settings')\">\n <svg width=\"18px\" viewBox=\"-0.03 0 16.079 16.079\" aria-hidden=\"true\" focusable=\"false\">\n <g>\n <path fill=\"currentColor\"\n d=\"M8.182 1.083a6.99 6.99 0 0 0-6.248 3.493c-1.929 3.342-.776 7.629 2.57 9.562 3.346 1.934 7.634.792 9.562-2.55 1.929-3.343.776-7.634-2.57-9.567a6.98 6.98 0 0 0-3.314-.938zM8 2.08a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6z\" />\n <path fill=\"currentColor\"\n d=\"M9.322 0L6.69.393v1.354a6.49 6.477 43.146 0 1 2.632.005V0zM3.937 1.19L1.93 2.897l.988 1.177a6.49 6.477 43.146 0 1 2.017-1.69zm8.128.013l-.993 1.184a6.49 6.477 43.146 0 1 .17.09 6.49 6.477 43.146 0 1 1.845 1.603l1.006-1.197zM.455 5.42l-.44 2.596 1.515.267a6.49 6.477 43.146 0 1 .455-2.593zm15.086.003l-1.523.269a6.49 6.477 43.146 0 1 .464 2.59l1.533-.27zM1.858 10.118l-1.351.78 1.33 2.271 1.339-.772a6.49 6.477 43.146 0 1-1.317-2.28zm12.301.003a6.49 6.477 43.146 0 1-.534 1.215 6.49 6.477 43.146 0 1-.774 1.069l1.338.773 1.302-2.288zm-9.557 3.471l-.534 1.47 2.48.884.525-1.446a6.49 6.477 43.146 0 1-2.303-.8 6.49 6.477 43.146 0 1-.168-.108zm6.814.016a6.49 6.477 43.146 0 1-2.475.897l.53 1.457 2.468-.917z\" />\n <path fill=\"currentColor\"\n d=\"M7.648 3.093a4.989 4.989 0 0 0-3.982 2.483 5.013 5.013 0 0 0 1.836 6.834 5.002 5.002 0 0 0 6.83-1.827 5.01 5.01 0 0 0-1.836-6.832 4.976 4.976 0 0 0-2.848-.658zM8 4.08a4 4 0 0 1 4 4 4 4 0 0 1-4 4 4 4 0 0 1-4-4 4 4 0 0 1 4-4z\" />\n </g>\n </svg>\n </button>\n </div>\n }\n <app-contacts [tenantId]=\"tenantId\" (makeCallEv)=\"onContactsMakeCall($event)\"></app-contacts>\n } @else if (activeTab === 'settings') {\n @if (!hideTabs) {\n <div class=\"page-heading\">\n <span>Settings</span>\n <button type=\"button\" class=\"settings-btn is-active\" disabled>\n <svg width=\"18px\" viewBox=\"-0.03 0 16.079 16.079\" aria-hidden=\"true\" focusable=\"false\">\n <g>\n <path fill=\"currentColor\"\n d=\"M8.182 1.083a6.99 6.99 0 0 0-6.248 3.493c-1.929 3.342-.776 7.629 2.57 9.562 3.346 1.934 7.634.792 9.562-2.55 1.929-3.343.776-7.634-2.57-9.567a6.98 6.98 0 0 0-3.314-.938zM8 2.08a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6z\" />\n <path fill=\"currentColor\"\n d=\"M9.322 0L6.69.393v1.354a6.49 6.477 43.146 0 1 2.632.005V0zM3.937 1.19L1.93 2.897l.988 1.177a6.49 6.477 43.146 0 1 2.017-1.69zm8.128.013l-.993 1.184a6.49 6.477 43.146 0 1 .17.09 6.49 6.477 43.146 0 1 1.845 1.603l1.006-1.197zM.455 5.42l-.44 2.596 1.515.267a6.49 6.477 43.146 0 1 .455-2.593zm15.086.003l-1.523.269a6.49 6.477 43.146 0 1 .464 2.59l1.533-.27zM1.858 10.118l-1.351.78 1.33 2.271 1.339-.772a6.49 6.477 43.146 0 1-1.317-2.28zm12.301.003a6.49 6.477 43.146 0 1-.534 1.215 6.49 6.477 43.146 0 1-.774 1.069l1.338.773 1.302-2.288zm-9.557 3.471l-.534 1.47 2.48.884.525-1.446a6.49 6.477 43.146 0 1-2.303-.8 6.49 6.477 43.146 0 1-.168-.108zm6.814.016a6.49 6.477 43.146 0 1-2.475.897l.53 1.457 2.468-.917z\" />\n <path fill=\"currentColor\"\n d=\"M7.648 3.093a4.989 4.989 0 0 0-3.982 2.483 5.013 5.013 0 0 0 1.836 6.834 5.002 5.002 0 0 0 6.83-1.827 5.01 5.01 0 0 0-1.836-6.832 4.976 4.976 0 0 0-2.848-.658zM8 4.08a4 4 0 0 1 4 4 4 4 0 0 1-4 4 4 4 0 0 1-4-4 4 4 0 0 1 4-4z\" />\n </g>\n </svg>\n </button>\n </div>\n }\n <app-settings\n [extensionId]=\"loginForm?.value?.ipoExtensionNo || userId\"\n [darkMode]=\"darkModeEnabled\"\n (darkModeChange)=\"onThemeToggle($event)\"\n (change)=\"onDeviceChange($event)\"\n (logout)=\"onLogout()\"\n ></app-settings>\n } @else {\n @if (!hideTabs) {\n <div class=\"page-heading\">\n <span>Keypad</span>\n <button type=\"button\" class=\"settings-btn\" (click)=\"selectTab('settings')\">\n <svg width=\"18px\" viewBox=\"-0.03 0 16.079 16.079\" aria-hidden=\"true\" focusable=\"false\">\n <g>\n <path fill=\"currentColor\"\n d=\"M8.182 1.083a6.99 6.99 0 0 0-6.248 3.493c-1.929 3.342-.776 7.629 2.57 9.562 3.346 1.934 7.634.792 9.562-2.55 1.929-3.343.776-7.634-2.57-9.567a6.98 6.98 0 0 0-3.314-.938zM8 2.08a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6z\" />\n <path fill=\"currentColor\"\n d=\"M9.322 0L6.69.393v1.354a6.49 6.477 43.146 0 1 2.632.005V0zM3.937 1.19L1.93 2.897l.988 1.177a6.49 6.477 43.146 0 1 2.017-1.69zm8.128.013l-.993 1.184a6.49 6.477 43.146 0 1 .17.09 6.49 6.477 43.146 0 1 1.845 1.603l1.006-1.197zM.455 5.42l-.44 2.596 1.515.267a6.49 6.477 43.146 0 1 .455-2.593zm15.086.003l-1.523.269a6.49 6.477 43.146 0 1 .464 2.59l1.533-.27zM1.858 10.118l-1.351.78 1.33 2.271 1.339-.772a6.49 6.477 43.146 0 1-1.317-2.28zm12.301.003a6.49 6.477 43.146 0 1-.534 1.215 6.49 6.477 43.146 0 1-.774 1.069l1.338.773 1.302-2.288zm-9.557 3.471l-.534 1.47 2.48.884.525-1.446a6.49 6.477 43.146 0 1-2.303-.8 6.49 6.477 43.146 0 1-.168-.108zm6.814.016a6.49 6.477 43.146 0 1-2.475.897l.53 1.457 2.468-.917z\" />\n <path fill=\"currentColor\"\n d=\"M7.648 3.093a4.989 4.989 0 0 0-3.982 2.483 5.013 5.013 0 0 0 1.836 6.834 5.002 5.002 0 0 0 6.83-1.827 5.01 5.01 0 0 0-1.836-6.832 4.976 4.976 0 0 0-2.848-.658zM8 4.08a4 4 0 0 1 4 4 4 4 0 0 1-4 4 4 4 0 0 1-4-4 4 4 0 0 1 4-4z\" />\n </g>\n </svg>\n </button>\n </div>\n }\n <app-phone\n [tenantId]=\"tenantId\"\n [agentId]=\"loginForm?.value?.ipoExtensionNo || userId\"\n [activeCallNumber]=\"activeCallNumber\"\n [incomingCallName]=\"incomingCallName\"\n [incomingNameResolved]=\"incomingNameResolved\"\n [activeCallName]=\"activeCallName\"\n [serverIp]=\"avayaIPOServerIP\"\n [serverPort]=\"avayaIPOServerPort\"\n [stunIp]=\"avayaIPOServerStunServerIP\"\n [stunPort]=\"avayaIPOServerStunServerPort\"\n [turnIp]=\"avayaIPOServerTurnServerIP\"\n [turnPort]=\"avayaIPOServerTurnServerPort\"\n [configurationMode]=\"configurationMode\"\n (makeCallEv)=\"onPhoneMakeCall($event)\"\n (endCallEv)=\"onPhoneEndCall()\"\n (callScreenChange)=\"onCallScreenChange($event)\"\n ></app-phone>\n }\n </div>\n </div>\n\n @if (showLoginLoader) {\n <div class=\"global-loader\">\n <div class=\"spinner\"></div>\n <div class=\"loader-text\">Connecting to phone service...</div>\n </div>\n }\n\n @if (!hideTabs) {\n <nav class=\"tabs\">\n <button type=\"button\" class=\"tab-btn\" [class.active]=\"activeTab === 'history'\" (click)=\"selectTab('history')\">\n <span class=\"tab-icon\">\n <svg width=\"19px\" viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\"\n d=\"M464 256A208 208 0 1 1 48 256a208 208 0 1 1 416 0zM0 256a256 256 0 1 0 512 0A256 256 0 1 0 0 256zM232 120l0 136c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2 280 120c0-13.3-10.7-24-24-24s-24 10.7-24 24z\" />\n </svg>\n </span>\n <span class=\"tab-text\">History</span>\n </button>\n <button type=\"button\" class=\"tab-btn\" [class.active]=\"activeTab === 'contacts'\" (click)=\"selectTab('contacts')\">\n <span class=\"tab-icon\">\n <svg width=\"18px\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\"\n d=\"M12 12a4 4 0 1 0-4-4 4 4 0 0 0 4 4zm0 2c-4.4 0-8 2.2-8 5v2h16v-2c0-2.8-3.6-5-8-5z\" />\n </svg>\n </span>\n <span class=\"tab-text\">Contacts</span>\n </button>\n <button type=\"button\" class=\"tab-btn\" [class.active]=\"activeTab === 'keypad'\" (click)=\"selectTab('keypad')\">\n <span class=\"tab-icon\">\n <svg width=\"20px\" viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\" d=\"M256,400a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M256,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M256,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M256,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M384,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M384,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M384,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M128,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M128,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M128,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n </svg>\n </span>\n <span class=\"tab-text\">Keypad</span>\n </button>\n </nav>\n }\n}\n}\n", styles: [":host{display:flex;flex-direction:column;width:100%;max-width:100%;margin:0;font-family:Open Sans,Helvetica Neue,Arial,sans-serif;min-height:100%;height:100%;background:var(--sd-surface);color:var(--sd-text);--sd-tabs-height: 60px;--sd-surface: #ffffff;--sd-surface-muted: #f7f7f7;--sd-text: #1f1f1f;--sd-text-muted: #666666;--sd-border: #e5e5e5;--sd-card: #ffffff;--sd-avatar: #f0f0f0;--sd-input: #ffffff;--sd-input-border: #dddddd}:host.dark-mode{--sd-surface: #0f1115;--sd-surface-muted: #151a22;--sd-text: #f2f4f8;--sd-text-muted: #aab0bb;--sd-border: #2a2f3a;--sd-card: #161b24;--sd-avatar: #222833;--sd-input: #1c222c;--sd-input-border: #2a2f3a}.container_connection_status_overlay{width:100%;position:relative;background-color:#6666661a;padding:10px;box-sizing:border-box}.container_connection_status{width:100%;background:#fff;padding:8px 10px;border-radius:8px;font-size:13px;font-weight:600;color:#666;display:flex;gap:8px;align-items:center;box-shadow:0 4px 10px #00000014}.container_connection_status .fa-circle-dot{color:#f66060}.simple-placeholder{padding:20px;text-align:center;color:#444;font-weight:600}.auth-error-screen,.auth-loading-screen{min-height:100%;display:flex;align-items:center;justify-content:center;padding:24px;background:radial-gradient(circle at top,#fff,#f2f4f7 65%,#e9edf3)}.auth-loading-card{width:min(320px,100%);padding:24px;border-radius:16px;background:#fff;border:1px solid #e5e7eb;box-shadow:0 16px 40px #0f172a1f;display:flex;flex-direction:column;gap:10px;text-align:center;align-items:center}.auth-loading-title{font-size:16px;font-weight:800;color:#111827}.auth-loading-message{font-size:12px;color:#6b7280}.auth-error-card{width:min(360px,100%);padding:24px;border-radius:16px;background:#fff;border:1px solid #e5e7eb;box-shadow:0 16px 40px #0f172a1f;display:flex;flex-direction:column;gap:10px;text-align:center}.auth-error-icon{width:56px;height:56px;margin:0 auto 4px;display:inline-flex;align-items:center;justify-content:center;border-radius:14px;background:#111827;color:#fff}.auth-error-icon svg{width:28px;height:28px}.auth-error-title{font-size:18px;font-weight:800;color:#111827}.auth-error-message{font-size:13px;color:#374151}.auth-error-hint{font-size:12px;color:#6b7280}.media-elements{display:none}.widget-body{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;position:relative;height:100%;padding-bottom:0;overflow-y:auto;-webkit-overflow-scrolling:touch}.logout-btn{border:none;background:#e3000f;color:#fff;padding:8px 12px;border-radius:6px;cursor:pointer;font-weight:600}.logout-btn:hover{background:#c0000d}.widget-content{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;gap:1rem;padding-bottom:0;height:100%}.page-heading{display:flex;align-items:center;justify-content:space-between;font-size:25px;font-weight:800;color:#1f1f1f;padding:15px;z-index:5;background:var(--sd-surface)}.settings-btn{width:34px;height:34px;border:none;background:transparent;color:#4a4a4a;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.settings-btn.is-active{color:#e3000f;border-color:#f0c4c8;background:#fff5f6}.settings-btn:disabled{cursor:default;opacity:.75}.tabs{position:sticky;bottom:0;left:0;right:0;display:flex;gap:6px;padding:8px 12px;background:#f7f7f7;border-top:1px solid #e0e0e0;box-sizing:border-box;z-index:10;height:var(--sd-tabs-height)}.tab-btn{flex:1 1 0;height:44px;border:none;background:transparent;font-weight:600;color:#666;border-radius:8px;cursor:pointer;transition:background .12s ease,color .12s ease;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;font-size:12px;box-shadow:none}.tab-btn.active{background:transparent;color:#e3000f;box-shadow:none}.tab-icon{display:flex;align-items:center;justify-content:center;font-size:16px}.tab-btn.active .tab-icon{color:#e3000f}.global-loader{position:absolute;inset:0;background:#ffffffd9;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;z-index:1000;color:#333;font-weight:700}.spinner{width:48px;height:48px;border:4px solid #f0f0f0;border-top-color:#e3000f;border-radius:50%;animation:spin .9s linear infinite}.loader-text{font-size:14px}@keyframes spin{to{transform:rotate(360deg)}}:host ::ng-deep .widget-body,:host ::ng-deep .widget-content{background:var(--sd-surface);color:var(--sd-text)}:host ::ng-deep .page-heading{color:var(--sd-text)}:host ::ng-deep .settings-btn{color:var(--sd-text)}:host ::ng-deep .tabs{background:var(--sd-surface-muted);border-top-color:var(--sd-border)}:host ::ng-deep .tab-btn{color:var(--sd-text-muted)}:host ::ng-deep .tab-btn.active{color:#e3000f;background:transparent}:host ::ng-deep .tab-btn.active .tab-icon{color:#e3000f}:host ::ng-deep .history_item,:host ::ng-deep .contact-card{border-bottom-color:var(--sd-border)}:host ::ng-deep .history_avatar,:host ::ng-deep .skeleton_avatar,:host ::ng-deep .contact-avatar{background:var(--sd-avatar);color:var(--sd-text)}:host ::ng-deep .history_name,:host ::ng-deep .contact-name{color:var(--sd-text)}:host ::ng-deep .history_time,:host ::ng-deep .history_meta,:host ::ng-deep .history_group_label,:host ::ng-deep .contact-phone,:host ::ng-deep .contacts-state{color:var(--sd-text-muted)}:host.dark-mode ::ng-deep .history_group_label{background:#151a22eb}:host.dark-mode ::ng-deep .history_item:hover{background:#1a202b}:host.dark-mode ::ng-deep .contacts-search input{background:var(--sd-input);border-color:var(--sd-input-border);color:var(--sd-text)}:host.dark-mode ::ng-deep .contacts-search input::placeholder{color:var(--sd-text-muted)}:host.dark-mode ::ng-deep .contact-call{background:#1e2b22;color:#79d48a}:host.dark-mode ::ng-deep .contact-back{background:#141922;border-color:var(--sd-border);color:var(--sd-text)}:host.dark-mode ::ng-deep .contact-call-btn{background:#1f2530;border-color:#1f2530;color:#79d48a}:host.dark-mode ::ng-deep .global-loader{background:#0f1115e6;color:var(--sd-text)}:host.dark-mode ::ng-deep .spinner{border-color:#2a2f3a;border-top-color:#e3000f}\n"] }]
|
|
5359
|
+
args: [{ selector: 'snugdesk-avaya-ipo-widget', standalone: false, template: "<div class=\"avaya-ipo-media-elements\">\n <audio id=\"rmtAudio\" autoplay></audio>\n <audio id=\"lclAudio\" autoplay></audio>\n <video id=\"rmtVideo\" autoplay playsinline></video>\n <video id=\"lclVideo\" autoplay playsinline muted></video>\n</div>\n\n@if (authLoading) {\n <div class=\"avaya-ipo-auth-loading-screen\">\n <div class=\"avaya-ipo-auth-loading-card\">\n <div class=\"avaya-ipo-spinner\" aria-hidden=\"true\"></div>\n <div class=\"avaya-ipo-auth-loading-title\">Checking authentication</div>\n <div class=\"avaya-ipo-auth-loading-message\">Please wait...</div>\n </div>\n </div>\n} @else if (authErrorMessage) {\n <div class=\"avaya-ipo-auth-error-screen\">\n <div class=\"avaya-ipo-auth-error-card\">\n <div class=\"avaya-ipo-auth-error-icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M12 2a7 7 0 0 1 7 7v3a2 2 0 0 1 2 2v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-6a2 2 0 0 1 2-2V9a7 7 0 0 1 7-7zm5 10V9a5 5 0 0 0-10 0v3h10zm-5 3a2 2 0 0 0-1 3.732V20h2v-1.268A2 2 0 0 0 12 15z\"\n />\n </svg>\n </div>\n <div class=\"avaya-ipo-auth-error-title\">Authentication Required</div>\n <div class=\"avaya-ipo-auth-error-message\">{{ authErrorMessage }}</div>\n </div>\n </div>\n} @else {\n@if (isReconnectingInProgress || isFailoverInProgress || isFailbackInProgress) {\n <div class=\"avaya-ipo-container_connection_status_overlay\">\n <div class=\"avaya-ipo-container_connection_status\">\n <i class=\"fa-solid fa-circle-dot\"></i>\n @if (isReconnectingInProgress) { <span>Reconnecting to the server...</span> }\n @if (isFailoverInProgress) { <span>Failover in progress...</span> }\n @if (isFailbackInProgress) { <span>Failback in progress...</span> }\n </div>\n </div>\n}\n\n@if (showLoginForm) {\n <app-avaya-ipo-login\n [loginForm]=\"loginForm\"\n [showLoginLoader]=\"showLoginLoader\"\n [hasAvayaSocketError]=\"hasAvayaSocketError\"\n [hasAvayaLoginError]=\"hasAvayaLoginError\"\n [hasAvayaLoginFailedGeneral]=\"hasAvayaLoginFailedGeneral\"\n [hasAvayaLoginConflictError]=\"hasAvayaLoginConflictError\"\n [hasAvayaDeviceError]=\"hasAvayaDeviceError\"\n (login)=\"onLogin()\"\n ></app-avaya-ipo-login>\n} @else {\n <div class=\"avaya-ipo-widget-body\">\n <div class=\"avaya-ipo-widget-content\">\n @if (activeTab === 'history') {\n @if (!hideTabs) {\n <div class=\"avaya-ipo-page-heading avaya-ipo-heading-right\">\n <span>History</span>\n <button type=\"button\" class=\"avaya-ipo-settings-btn\" (click)=\"selectTab('settings')\">\n <svg width=\"18px\" viewBox=\"-0.03 0 16.079 16.079\" aria-hidden=\"true\" focusable=\"false\">\n <g>\n <path fill=\"currentColor\"\n d=\"M8.182 1.083a6.99 6.99 0 0 0-6.248 3.493c-1.929 3.342-.776 7.629 2.57 9.562 3.346 1.934 7.634.792 9.562-2.55 1.929-3.343.776-7.634-2.57-9.567a6.98 6.98 0 0 0-3.314-.938zM8 2.08a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6z\" />\n <path fill=\"currentColor\"\n d=\"M9.322 0L6.69.393v1.354a6.49 6.477 43.146 0 1 2.632.005V0zM3.937 1.19L1.93 2.897l.988 1.177a6.49 6.477 43.146 0 1 2.017-1.69zm8.128.013l-.993 1.184a6.49 6.477 43.146 0 1 .17.09 6.49 6.477 43.146 0 1 1.845 1.603l1.006-1.197zM.455 5.42l-.44 2.596 1.515.267a6.49 6.477 43.146 0 1 .455-2.593zm15.086.003l-1.523.269a6.49 6.477 43.146 0 1 .464 2.59l1.533-.27zM1.858 10.118l-1.351.78 1.33 2.271 1.339-.772a6.49 6.477 43.146 0 1-1.317-2.28zm12.301.003a6.49 6.477 43.146 0 1-.534 1.215 6.49 6.477 43.146 0 1-.774 1.069l1.338.773 1.302-2.288zm-9.557 3.471l-.534 1.47 2.48.884.525-1.446a6.49 6.477 43.146 0 1-2.303-.8 6.49 6.477 43.146 0 1-.168-.108zm6.814.016a6.49 6.477 43.146 0 1-2.475.897l.53 1.457 2.468-.917z\" />\n <path fill=\"currentColor\"\n d=\"M7.648 3.093a4.989 4.989 0 0 0-3.982 2.483 5.013 5.013 0 0 0 1.836 6.834 5.002 5.002 0 0 0 6.83-1.827 5.01 5.01 0 0 0-1.836-6.832 4.976 4.976 0 0 0-2.848-.658zM8 4.08a4 4 0 0 1 4 4 4 4 0 0 1-4 4 4 4 0 0 1-4-4 4 4 0 0 1 4-4z\" />\n </g>\n </svg>\n </button>\n </div>\n }\n <app-call-history\n [tenantId]=\"tenantId\"\n [agentId]=\"loginForm?.value?.ipoExtensionNo || userId\"\n (makeCallEv)=\"onHistoryMakeCall($event)\"\n ></app-call-history>\n } @else if (activeTab === 'contacts') {\n @if (!hideTabs) {\n <div class=\"avaya-ipo-page-heading\">\n <span>Contacts</span>\n <button type=\"button\" class=\"avaya-ipo-settings-btn\" (click)=\"selectTab('settings')\">\n <svg width=\"18px\" viewBox=\"-0.03 0 16.079 16.079\" aria-hidden=\"true\" focusable=\"false\">\n <g>\n <path fill=\"currentColor\"\n d=\"M8.182 1.083a6.99 6.99 0 0 0-6.248 3.493c-1.929 3.342-.776 7.629 2.57 9.562 3.346 1.934 7.634.792 9.562-2.55 1.929-3.343.776-7.634-2.57-9.567a6.98 6.98 0 0 0-3.314-.938zM8 2.08a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6z\" />\n <path fill=\"currentColor\"\n d=\"M9.322 0L6.69.393v1.354a6.49 6.477 43.146 0 1 2.632.005V0zM3.937 1.19L1.93 2.897l.988 1.177a6.49 6.477 43.146 0 1 2.017-1.69zm8.128.013l-.993 1.184a6.49 6.477 43.146 0 1 .17.09 6.49 6.477 43.146 0 1 1.845 1.603l1.006-1.197zM.455 5.42l-.44 2.596 1.515.267a6.49 6.477 43.146 0 1 .455-2.593zm15.086.003l-1.523.269a6.49 6.477 43.146 0 1 .464 2.59l1.533-.27zM1.858 10.118l-1.351.78 1.33 2.271 1.339-.772a6.49 6.477 43.146 0 1-1.317-2.28zm12.301.003a6.49 6.477 43.146 0 1-.534 1.215 6.49 6.477 43.146 0 1-.774 1.069l1.338.773 1.302-2.288zm-9.557 3.471l-.534 1.47 2.48.884.525-1.446a6.49 6.477 43.146 0 1-2.303-.8 6.49 6.477 43.146 0 1-.168-.108zm6.814.016a6.49 6.477 43.146 0 1-2.475.897l.53 1.457 2.468-.917z\" />\n <path fill=\"currentColor\"\n d=\"M7.648 3.093a4.989 4.989 0 0 0-3.982 2.483 5.013 5.013 0 0 0 1.836 6.834 5.002 5.002 0 0 0 6.83-1.827 5.01 5.01 0 0 0-1.836-6.832 4.976 4.976 0 0 0-2.848-.658zM8 4.08a4 4 0 0 1 4 4 4 4 0 0 1-4 4 4 4 0 0 1-4-4 4 4 0 0 1 4-4z\" />\n </g>\n </svg>\n </button>\n </div>\n }\n <app-contacts [tenantId]=\"tenantId\" (makeCallEv)=\"onContactsMakeCall($event)\"></app-contacts>\n } @else if (activeTab === 'settings') {\n @if (!hideTabs) {\n <div class=\"avaya-ipo-page-heading\">\n <span class=\"avaya-ipo-heading-with-back\">\n <button type=\"button\" class=\"avaya-ipo-settings-btn avaya-ipo-back-btn\" (click)=\"closeSettings()\" aria-label=\"Go back\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M15 18l-6-6 6-6\" />\n </svg>\n </button>\n <span>Settings</span>\n </span>\n </div>\n }\n <app-settings\n [extensionId]=\"loginForm?.value?.ipoExtensionNo || userId\"\n [darkMode]=\"darkModeEnabled\"\n (darkModeChange)=\"onThemeToggle($event)\"\n (change)=\"onDeviceChange($event)\"\n (logout)=\"onLogout()\"\n ></app-settings>\n } @else {\n @if (!hideTabs) {\n <button type=\"button\" class=\"avaya-ipo-settings-btn avaya-ipo-settings-btn-floating\" (click)=\"selectTab('settings')\" aria-label=\"Settings\">\n <svg width=\"18px\" viewBox=\"-0.03 0 16.079 16.079\" aria-hidden=\"true\" focusable=\"false\">\n <g>\n <path fill=\"currentColor\"\n d=\"M8.182 1.083a6.99 6.99 0 0 0-6.248 3.493c-1.929 3.342-.776 7.629 2.57 9.562 3.346 1.934 7.634.792 9.562-2.55 1.929-3.343.776-7.634-2.57-9.567a6.98 6.98 0 0 0-3.314-.938zM8 2.08a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6z\" />\n <path fill=\"currentColor\"\n d=\"M9.322 0L6.69.393v1.354a6.49 6.477 43.146 0 1 2.632.005V0zM3.937 1.19L1.93 2.897l.988 1.177a6.49 6.477 43.146 0 1 2.017-1.69zm8.128.013l-.993 1.184a6.49 6.477 43.146 0 1 .17.09 6.49 6.477 43.146 0 1 1.845 1.603l1.006-1.197zM.455 5.42l-.44 2.596 1.515.267a6.49 6.477 43.146 0 1 .455-2.593zm15.086.003l-1.523.269a6.49 6.477 43.146 0 1 .464 2.59l1.533-.27zM1.858 10.118l-1.351.78 1.33 2.271 1.339-.772a6.49 6.477 43.146 0 1-1.317-2.28zm12.301.003a6.49 6.477 43.146 0 1-.534 1.215 6.49 6.477 43.146 0 1-.774 1.069l1.338.773 1.302-2.288zm-9.557 3.471l-.534 1.47 2.48.884.525-1.446a6.49 6.477 43.146 0 1-2.303-.8 6.49 6.477 43.146 0 1-.168-.108zm6.814.016a6.49 6.477 43.146 0 1-2.475.897l.53 1.457 2.468-.917z\" />\n <path fill=\"currentColor\"\n d=\"M7.648 3.093a4.989 4.989 0 0 0-3.982 2.483 5.013 5.013 0 0 0 1.836 6.834 5.002 5.002 0 0 0 6.83-1.827 5.01 5.01 0 0 0-1.836-6.832 4.976 4.976 0 0 0-2.848-.658zM8 4.08a4 4 0 0 1 4 4 4 4 0 0 1-4 4 4 4 0 0 1-4-4 4 4 0 0 1 4-4z\" />\n </g>\n </svg>\n </button>\n }\n <app-phone\n [tenantId]=\"tenantId\"\n [agentId]=\"loginForm?.value?.ipoExtensionNo || userId\"\n [activeCallNumber]=\"activeCallNumber\"\n [incomingCallName]=\"incomingCallName\"\n [incomingNameResolved]=\"incomingNameResolved\"\n [activeCallName]=\"activeCallName\"\n [serverIp]=\"avayaIPOServerIP\"\n [serverPort]=\"avayaIPOServerPort\"\n [stunIp]=\"avayaIPOServerStunServerIP\"\n [stunPort]=\"avayaIPOServerStunServerPort\"\n [turnIp]=\"avayaIPOServerTurnServerIP\"\n [turnPort]=\"avayaIPOServerTurnServerPort\"\n [configurationMode]=\"configurationMode\"\n [recordingUploadMode]=\"recordingUploadMode\"\n [entityId]=\"activeCallEntityId\"\n (makeCallEv)=\"onPhoneMakeCall($event)\"\n (endCallEv)=\"onPhoneEndCall()\"\n (callScreenChange)=\"onCallScreenChange($event)\"\n ></app-phone>\n }\n </div>\n </div>\n\n @if (showLoginLoader) {\n <div class=\"avaya-ipo-global-loader\">\n <div class=\"avaya-ipo-spinner\"></div>\n <div class=\"avaya-ipo-loader-text\">Connecting to phone service...</div>\n </div>\n }\n\n @if (!hideTabs && showTabBar) {\n <nav class=\"avaya-ipo-tabs\">\n @if (showHistory) {\n <button type=\"button\" class=\"avaya-ipo-tab-btn\" [class.avaya-ipo-active]=\"activeTab === 'history'\" (click)=\"selectTab('history')\">\n <span class=\"avaya-ipo-tab-icon\">\n <svg width=\"19px\" viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\"\n d=\"M464 256A208 208 0 1 1 48 256a208 208 0 1 1 416 0zM0 256a256 256 0 1 0 512 0A256 256 0 1 0 0 256zM232 120l0 136c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2 280 120c0-13.3-10.7-24-24-24s-24 10.7-24 24z\" />\n </svg>\n </span>\n <span class=\"avaya-ipo-tab-text\">History</span>\n </button>\n }\n @if (showContacts) {\n <button type=\"button\" class=\"avaya-ipo-tab-btn\" [class.avaya-ipo-active]=\"activeTab === 'contacts'\" (click)=\"selectTab('contacts')\">\n <span class=\"avaya-ipo-tab-icon\">\n <svg width=\"18px\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\"\n d=\"M12 12a4 4 0 1 0-4-4 4 4 0 0 0 4 4zm0 2c-4.4 0-8 2.2-8 5v2h16v-2c0-2.8-3.6-5-8-5z\" />\n </svg>\n </span>\n <span class=\"avaya-ipo-tab-text\">Contacts</span>\n </button>\n }\n <button type=\"button\" class=\"avaya-ipo-tab-btn\" [class.avaya-ipo-active]=\"activeTab === 'keypad'\" (click)=\"selectTab('keypad')\">\n <span class=\"avaya-ipo-tab-icon\">\n <svg width=\"20px\" viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\" d=\"M256,400a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M256,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M256,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M256,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M384,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M384,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M384,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M128,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M128,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M128,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n </svg>\n </span>\n <span class=\"avaya-ipo-tab-text\">Keypad</span>\n </button>\n </nav>\n }\n\n @if (activeTab !== 'keypad') {\n <div class=\"avaya-ipo-widget-version-footer\">v{{ widgetVersion }}</div>\n }\n}\n}\n", styles: [":host{display:flex;flex-direction:column;width:100%;max-width:100%;margin:0;font-family:Open Sans,Helvetica Neue,Arial,sans-serif;min-height:100%;height:100%;background:var(--sd-surface);color:var(--sd-text);box-sizing:border-box;--sd-tabs-height: 60px;--sd-radius-sm: 8px;--sd-radius: 10px;--sd-radius-lg: 14px;--sd-radius-pill: 999px;--sd-shadow-sm: 0 1px 2px rgba(16, 24, 40, .06);--sd-shadow-md: 0 6px 16px rgba(16, 24, 40, .1);--sd-shadow-lg: 0 16px 40px rgba(16, 24, 40, .14);--sd-accent: var(--app-color, #ff6633);--sd-accent-strong: var(--app-color-dark, #ff5805);--sd-accent-soft: #fff1ea;--sd-accent-contrast: #ffffff;--sd-call-accept: #1aa251;--sd-call-end: #e5484d;--sd-surface: var(--background-color, #ffffff);--sd-surface-muted: var(--background-color-dark, #f7f7f7);--sd-surface-sunken: var(--background-color-dark-light, #e8e8e8);--sd-text: var(--header-text-primary, #333333);--sd-text-muted: var(--header-text-secondary, #5f6368);--sd-text-subtle: var(--header-text-muted, #9ca3af);--sd-border: var(--dropdown-border, #e3e3e3);--sd-border-strong: var(--border-color, #c9c9c9);--sd-card: var(--background-color, #ffffff);--sd-avatar: #eceff3;--sd-input: var(--background-color, #ffffff);--sd-input-border: var(--border-color, #c9c9c9);--sd-focus-ring: 0 0 0 3px rgba(255, 102, 51, .22)}:host.avaya-ipo-dark-mode{--sd-accent: #ff7a4d;--sd-accent-strong: #ff6633;--sd-accent-soft: rgba(255, 122, 77, .14);--sd-accent-contrast: #1a1109;--sd-call-accept: #34c759;--sd-call-end: #ff5b5b;--sd-surface: #0f1115;--sd-surface-muted: #151a22;--sd-surface-sunken: #1c222c;--sd-text: #f2f4f8;--sd-text-muted: #aab0bb;--sd-text-subtle: #7e8794;--sd-border: #2a2f3a;--sd-border-strong: #353b47;--sd-card: #161b24;--sd-avatar: #222833;--sd-input: #1c222c;--sd-input-border: #2a2f3a;--sd-focus-ring: 0 0 0 3px rgba(255, 122, 77, .25)}:host.avaya-ipo-mode-popup{min-width:320px;height:100%}:host.avaya-ipo-mode-standalone{width:100%;max-width:460px;height:100dvh;min-height:100dvh;margin-inline:auto;border-inline:1px solid var(--sd-border);box-shadow:var(--sd-shadow-lg);overflow:hidden}@media (max-width: 768px){:host.avaya-ipo-mode-standalone{max-width:100%;border-inline:0;box-shadow:none}}.avaya-ipo-container_connection_status_overlay{width:100%;position:relative;background-color:#7f7f7f1a;padding:10px;box-sizing:border-box}.avaya-ipo-container_connection_status{width:100%;background:var(--sd-card);padding:8px 10px;border-radius:var(--sd-radius-sm);font-size:13px;font-weight:600;color:var(--sd-text-muted);display:flex;gap:8px;align-items:center;box-shadow:var(--sd-shadow-md)}.avaya-ipo-container_connection_status .fa-circle-dot{color:var(--sd-accent)}.avaya-ipo-simple-placeholder{padding:20px;text-align:center;color:var(--sd-text);font-weight:600}.avaya-ipo-auth-error-screen,.avaya-ipo-auth-loading-screen{min-height:100%;flex:1 1 auto;display:flex;align-items:center;justify-content:center;padding:24px;box-sizing:border-box;background:var(--sd-surface)}.avaya-ipo-auth-loading-card{width:min(320px,100%);padding:24px;border-radius:var(--sd-radius-lg);background:var(--sd-card);border:1px solid var(--sd-border);box-shadow:var(--sd-shadow-lg);display:flex;flex-direction:column;gap:10px;text-align:center;align-items:center}.avaya-ipo-auth-loading-title{font-size:16px;font-weight:800;color:var(--sd-text)}.avaya-ipo-auth-loading-message{font-size:12px;color:var(--sd-text-muted)}.avaya-ipo-auth-error-card{width:min(360px,100%);padding:24px;border-radius:var(--sd-radius-lg);background:var(--sd-card);border:1px solid var(--sd-border);box-shadow:var(--sd-shadow-lg);display:flex;flex-direction:column;gap:10px;text-align:center}.avaya-ipo-auth-error-icon{width:56px;height:56px;margin:0 auto 4px;display:inline-flex;align-items:center;justify-content:center;border-radius:var(--sd-radius-lg);background:var(--sd-accent);color:var(--sd-accent-contrast)}.avaya-ipo-auth-error-icon svg{width:28px;height:28px}.avaya-ipo-auth-error-title{font-size:18px;font-weight:800;color:var(--sd-text)}.avaya-ipo-auth-error-message{font-size:13px;color:var(--sd-text-muted)}.avaya-ipo-auth-error-hint{font-size:12px;color:var(--sd-text-subtle)}.avaya-ipo-media-elements{display:none}.avaya-ipo-widget-body{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;position:relative;height:100%;padding-bottom:0;overflow-y:auto;-webkit-overflow-scrolling:touch}.avaya-ipo-logout-btn{border:none;background:var(--sd-call-end);color:#fff;padding:8px 12px;border-radius:var(--sd-radius-sm);cursor:pointer;font-weight:600}.avaya-ipo-logout-btn:hover{filter:brightness(.94)}.avaya-ipo-widget-content{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;gap:1rem;padding-bottom:0;height:100%}.avaya-ipo-page-heading{display:flex;align-items:center;justify-content:space-between;font-size:22px;font-weight:800;color:var(--sd-text);padding:15px;z-index:5;background:var(--sd-surface)}.avaya-ipo-settings-btn{width:34px;height:34px;border-radius:var(--sd-radius-sm);border:none;background:transparent;color:var(--sd-text-muted);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:background .12s ease,color .12s ease}.avaya-ipo-settings-btn:hover{background:var(--sd-surface-muted)}.avaya-ipo-settings-btn.avaya-ipo-is-active{color:var(--sd-accent);background:var(--sd-accent-soft)}.avaya-ipo-settings-btn:disabled{cursor:default;opacity:.75}.avaya-ipo-settings-btn-floating{position:absolute;top:8px;right:8px;z-index:6}.avaya-ipo-heading-with-back{display:inline-flex;align-items:center;gap:4px}.avaya-ipo-settings-btn.avaya-ipo-back-btn{color:var(--sd-text)}.avaya-ipo-tabs{position:sticky;bottom:0;left:0;right:0;display:flex;gap:6px;padding:8px 12px;background:var(--sd-surface-muted);border-top:1px solid var(--sd-border);box-sizing:border-box;z-index:10;height:var(--sd-tabs-height)}.avaya-ipo-tab-btn{flex:1 1 0;height:44px;border:none;background:transparent;font-weight:600;color:var(--sd-text-muted);border-radius:var(--sd-radius-sm);cursor:pointer;transition:background .12s ease,color .12s ease;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;font-size:12px;box-shadow:none}.avaya-ipo-tab-btn:hover{color:var(--sd-text)}.avaya-ipo-tab-btn.avaya-ipo-active{background:var(--sd-accent-soft);color:var(--sd-accent);box-shadow:none}.avaya-ipo-tab-icon{display:flex;align-items:center;justify-content:center;font-size:16px}.avaya-ipo-tab-btn.avaya-ipo-active .avaya-ipo-tab-icon{color:var(--sd-accent)}.avaya-ipo-global-loader{position:absolute;inset:0;background:color-mix(in srgb,var(--sd-surface) 85%,transparent);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;z-index:1000;color:var(--sd-text);font-weight:700}.avaya-ipo-spinner{width:48px;height:48px;border:4px solid var(--sd-surface-sunken);border-top-color:var(--sd-accent);border-radius:50%;animation:spin .9s linear infinite}.avaya-ipo-loader-text{font-size:14px}@keyframes spin{to{transform:rotate(360deg)}}:host ::ng-deep .avaya-ipo-widget-body,:host ::ng-deep .avaya-ipo-widget-content{background:var(--sd-surface);color:var(--sd-text)}:host ::ng-deep .avaya-ipo-page-heading{color:var(--sd-text)}:host ::ng-deep .avaya-ipo-settings-btn{color:var(--sd-text-muted)}:host ::ng-deep .avaya-ipo-tabs{background:var(--sd-surface-muted);border-top-color:var(--sd-border)}:host ::ng-deep .avaya-ipo-tab-btn{color:var(--sd-text-muted)}:host ::ng-deep .avaya-ipo-tab-btn.avaya-ipo-active{color:var(--sd-accent);background:var(--sd-accent-soft)}:host ::ng-deep .avaya-ipo-tab-btn.avaya-ipo-active .avaya-ipo-tab-icon{color:var(--sd-accent)}:host ::ng-deep .avaya-ipo-history_item,:host ::ng-deep .avaya-ipo-contact-card{border-bottom-color:var(--sd-border)}:host ::ng-deep .avaya-ipo-history_avatar,:host ::ng-deep .avaya-ipo-skeleton_avatar,:host ::ng-deep .avaya-ipo-contact-avatar{background:var(--sd-avatar);color:var(--sd-text)}:host ::ng-deep .avaya-ipo-history_name,:host ::ng-deep .avaya-ipo-contact-name{color:var(--sd-text)}:host ::ng-deep .avaya-ipo-history_time,:host ::ng-deep .avaya-ipo-history_meta,:host ::ng-deep .avaya-ipo-history_group_label,:host ::ng-deep .avaya-ipo-contact-phone,:host ::ng-deep .avaya-ipo-contacts-state{color:var(--sd-text-muted)}:host.avaya-ipo-dark-mode ::ng-deep .avaya-ipo-history_group_label{background:#151a22eb}:host.avaya-ipo-dark-mode ::ng-deep .avaya-ipo-history_item:hover{background:#1a202b}:host.avaya-ipo-dark-mode ::ng-deep .avaya-ipo-contacts-search input{background:var(--sd-input);border-color:var(--sd-input-border);color:var(--sd-text)}:host.avaya-ipo-dark-mode ::ng-deep .avaya-ipo-contacts-search input::placeholder{color:var(--sd-text-muted)}:host.avaya-ipo-dark-mode ::ng-deep .avaya-ipo-contact-call{background:#1e2b22;color:#79d48a}:host.avaya-ipo-dark-mode ::ng-deep .avaya-ipo-contact-back{background:#141922;border-color:var(--sd-border);color:var(--sd-text)}:host.avaya-ipo-dark-mode ::ng-deep .avaya-ipo-contact-call-btn{background:#1f2530;border-color:#1f2530;color:#79d48a}:host.avaya-ipo-dark-mode ::ng-deep .avaya-ipo-global-loader{background:#0f1115e6;color:var(--sd-text)}:host.avaya-ipo-dark-mode ::ng-deep .avaya-ipo-spinner{border-color:#2a2f3a;border-top-color:var(--sd-accent)}.avaya-ipo-widget-version-footer{flex:0 0 auto;padding:2px 8px 4px;text-align:center;font-size:10px;line-height:1.2;letter-spacing:.02em;color:var(--sd-text-muted);background:var(--sd-surface);border-top:1px solid var(--sd-border);-webkit-user-select:text;user-select:text}\n"] }]
|
|
4768
5360
|
}], ctorParameters: () => [{ type: i1$2.FormBuilder }, { type: AvayaIPOService }, { type: i0.ChangeDetectorRef }, { type: CountryService }, { type: PhoneNumberLookupService }, { type: EntitiesSearchService }, { type: i1$1.SnugdeskAuthenticationService }], propDecorators: { hostDarkMode: [{
|
|
4769
5361
|
type: HostBinding,
|
|
4770
|
-
args: ['class.dark-mode']
|
|
5362
|
+
args: ['class.avaya-ipo-dark-mode']
|
|
5363
|
+
}], hostModeStandalone: [{
|
|
5364
|
+
type: HostBinding,
|
|
5365
|
+
args: ['class.avaya-ipo-mode-standalone']
|
|
5366
|
+
}], hostModePopup: [{
|
|
5367
|
+
type: HostBinding,
|
|
5368
|
+
args: ['class.avaya-ipo-mode-popup']
|
|
4771
5369
|
}], isVisible: [{
|
|
4772
5370
|
type: Input
|
|
5371
|
+
}], displayMode: [{
|
|
5372
|
+
type: Input
|
|
4773
5373
|
}], configurationMode: [{
|
|
4774
5374
|
type: Input
|
|
5375
|
+
}], recordingUploadMode: [{
|
|
5376
|
+
type: Input
|
|
4775
5377
|
}], avayaIPOServerIP: [{
|
|
4776
5378
|
type: Input
|
|
4777
5379
|
}], avayaIPOServerPort: [{
|
|
@@ -4790,8 +5392,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImpor
|
|
|
4790
5392
|
type: Input
|
|
4791
5393
|
}], userId: [{
|
|
4792
5394
|
type: Input
|
|
5395
|
+
}], extension: [{
|
|
5396
|
+
type: Input
|
|
5397
|
+
}], password: [{
|
|
5398
|
+
type: Input
|
|
5399
|
+
}], showHistory: [{
|
|
5400
|
+
type: Input
|
|
5401
|
+
}], showContacts: [{
|
|
5402
|
+
type: Input
|
|
4793
5403
|
}], notificationEvent: [{
|
|
4794
5404
|
type: Output
|
|
5405
|
+
}], incomingCall: [{
|
|
5406
|
+
type: Output
|
|
4795
5407
|
}] } });
|
|
4796
5408
|
|
|
4797
5409
|
class AvayaIPOWidgetModule {
|