@snugdesk/avaya-ipo-widget 0.0.0-watch
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.
Potentially problematic release.
This version of @snugdesk/avaya-ipo-widget might be problematic. Click here for more details.
- package/README.md +138 -0
- package/fesm2022/snugdesk-avaya-ipo-widget.mjs +2892 -0
- package/fesm2022/snugdesk-avaya-ipo-widget.mjs.map +1 -0
- package/index.d.ts +445 -0
- package/package.json +37 -0
- 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/icons/sd-call_history_not_found.gif +0 -0
- package/src/assets/images/incomingCall_avatar.gif +0 -0
- package/src/assets/images/logo-avaya.png +0 -0
- package/src/assets/images/logo-avaya_small_color.svg +20 -0
- package/src/assets/images/logo-avaya_small_gray.svg +16 -0
- package/src/assets/sounds/ringback_tone.mp3 +0 -0
|
@@ -0,0 +1,2892 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Injectable, EventEmitter, Output, Input, Component, ViewChild, NgModule } from '@angular/core';
|
|
3
|
+
import { trigger, transition, style, animate } from '@angular/animations';
|
|
4
|
+
import * as i1$1 from '@angular/forms';
|
|
5
|
+
import { Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
6
|
+
import { BehaviorSubject, Subject, lastValueFrom, filter } from 'rxjs';
|
|
7
|
+
import * as i1 from '@angular/common/http';
|
|
8
|
+
import { HttpParams, HttpHeaders } from '@angular/common/http';
|
|
9
|
+
import * as i8 from '@snugdesk/core';
|
|
10
|
+
import * as i3 from '@angular/common';
|
|
11
|
+
import { CommonModule } from '@angular/common';
|
|
12
|
+
import * as i10 from '@angular/material/form-field';
|
|
13
|
+
import { MatFormFieldModule, MatError, MatFormField, MatLabel } from '@angular/material/form-field';
|
|
14
|
+
import * as i11 from '@angular/material/input';
|
|
15
|
+
import { MatInputModule } from '@angular/material/input';
|
|
16
|
+
import * as i5 from 'ngx-intl-tel-input';
|
|
17
|
+
import { CountryISO, SearchCountryField, NgxIntlTelInputModule } from 'ngx-intl-tel-input';
|
|
18
|
+
import { PhoneNumberUtil, PhoneNumberFormat } from 'google-libphonenumber';
|
|
19
|
+
import { JwtHelperService } from '@auth0/angular-jwt';
|
|
20
|
+
|
|
21
|
+
var LoginState;
|
|
22
|
+
(function (LoginState) {
|
|
23
|
+
LoginState["LOGIN_SUCCESS"] = "AWL_MSG_LOGIN_SUCCESS";
|
|
24
|
+
LoginState["LOGIN_FAILED"] = "AWL_MSG_LOGIN_FAILED";
|
|
25
|
+
LoginState["LOGIN_EMPTYUSERNAME"] = "AWL_MSG_LOGIN_EMPTYUSERNAME";
|
|
26
|
+
LoginState["LOGIN_EMPTYPASSWORD"] = "AWL_MSG_LOGIN_EMPTYPASSWORD";
|
|
27
|
+
LoginState["LOGIN_GW_NOTCONFIGURED"] = "AWL_MSG_LOGIN_GW_NOTCONFIGURED";
|
|
28
|
+
LoginState["LOGGEDOUT"] = "AWL_MSG_LOGGEDOUT";
|
|
29
|
+
LoginState["WEBSOCKET_FAILURE"] = "AWL_MSG_LOGIN_WEBSOCKET_FAILURE";
|
|
30
|
+
LoginState["DEVICEACCESS_FAILURE"] = "AWL_MSG_DEVICEACCESS_FAILURE";
|
|
31
|
+
LoginState["RELOGGED_IN"] = "AWL_MSG_RELOGGED_IN";
|
|
32
|
+
LoginState["RECONNECTING"] = "AWL_MSG_RECONNECTING";
|
|
33
|
+
LoginState["FAILING_OVER"] = "AWL_MSG_FAILING_OVER";
|
|
34
|
+
LoginState["FAILOVER_SUCCESS"] = "AWL_MSG_FAIL_OVER_SUCCESS";
|
|
35
|
+
LoginState["FAILOVER_FAILED"] = "AWL_MSG_FAIL_OVER_FAILED";
|
|
36
|
+
LoginState["FAILING_BACK"] = "AWL_MSG_FAILING_BACK";
|
|
37
|
+
LoginState["FAILBACK_SUCCESS"] = "AWL_MSG_FAIL_BACK_SUCCESS";
|
|
38
|
+
LoginState["FAILBACK_FAILED"] = "AWL_MSG_FAIL_BACK_FAILED";
|
|
39
|
+
})(LoginState || (LoginState = {}));
|
|
40
|
+
var CallState;
|
|
41
|
+
(function (CallState) {
|
|
42
|
+
CallState["IDLE"] = "AWL_MSG_CALL_IDLE";
|
|
43
|
+
CallState["PROGRESSING"] = "AWL_MSG_CALL_PROGRESSING";
|
|
44
|
+
CallState["RINGING"] = "AWL_MSG_CALL_RINGING";
|
|
45
|
+
CallState["CONNECTED"] = "AWL_MSG_CALL_CONNECTED";
|
|
46
|
+
CallState["DISCONNECTED"] = "AWL_MSG_CALL_DISCONNECTED";
|
|
47
|
+
CallState["FAILED"] = "AWL_MSG_CALL_FAILED";
|
|
48
|
+
CallState["INCOMING"] = "AWL_MSG_CALL_INCOMING";
|
|
49
|
+
CallState["HELD"] = "AWL_MSG_CALL_HELD";
|
|
50
|
+
CallState["TRANSFERRED"] = "AWL_MSG_CALL_TRANSFERRED";
|
|
51
|
+
CallState["FAREND_UPDATE"] = "AWL_MSG_CALL_FAREND_UPDATE";
|
|
52
|
+
})(CallState || (CallState = {}));
|
|
53
|
+
class AvayaIPOCallListener {
|
|
54
|
+
service;
|
|
55
|
+
constructor(service) {
|
|
56
|
+
this.service = service;
|
|
57
|
+
}
|
|
58
|
+
onNewIncomingCall = (callId, callObj, autoAnswer) => {
|
|
59
|
+
const farEndNumber = callObj.getFarEndNumber();
|
|
60
|
+
this.service.zone.run(() => {
|
|
61
|
+
this.service.incomingCallSubject.next({
|
|
62
|
+
callId,
|
|
63
|
+
farEndNumber,
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
if (!this.service.activeCallsMap.has(callId)) {
|
|
67
|
+
this.service.assignToFirstAvailableSlot(callId, callObj);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
onCallStateChange = (callId, callObj, event) => {
|
|
71
|
+
// Raw callback from AWL (WebSocket JSON-RPC). Useful to see the original event.
|
|
72
|
+
console.debug('[AWL] onCallStateChange raw →', { callId, event });
|
|
73
|
+
const state = callObj.getCallState();
|
|
74
|
+
this.service.zone.run(() => {
|
|
75
|
+
this.service.callStateSubject.next({ callId, state });
|
|
76
|
+
});
|
|
77
|
+
if (event === 'CallTransferSuccessful') {
|
|
78
|
+
console.debug('Call transfer successful');
|
|
79
|
+
}
|
|
80
|
+
this.service.handleCallState(callObj);
|
|
81
|
+
try {
|
|
82
|
+
const remote = callObj?.getRemoteStream?.();
|
|
83
|
+
// if (remote instanceof MediaStream) {
|
|
84
|
+
// console.log('Remote stream found', remote);
|
|
85
|
+
// this.service.remoteStream = remote;
|
|
86
|
+
// this.service.remoteStream$.next(remote);
|
|
87
|
+
// }
|
|
88
|
+
if (remote instanceof MediaStream) {
|
|
89
|
+
const payload = { callId, stream: remote };
|
|
90
|
+
this.service.remoteStream = payload;
|
|
91
|
+
this.service.remoteStream$.next(payload);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
console.warn('Failed to extract media streams', err);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
onCallTerminate = (callId, reason) => {
|
|
99
|
+
this.service.releaseCallById(callId);
|
|
100
|
+
console.debug('Call terminated: ', reason);
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
class AvayaIPOService {
|
|
104
|
+
zone;
|
|
105
|
+
http;
|
|
106
|
+
cli; // This should be the type of your Avaya IPO CLI instance
|
|
107
|
+
remoteStream = null;
|
|
108
|
+
remoteStream$ = new BehaviorSubject(null);
|
|
109
|
+
localStream = null;
|
|
110
|
+
incomingCallSubject = new Subject();
|
|
111
|
+
callStateSubject = new Subject();
|
|
112
|
+
callSlots = {
|
|
113
|
+
'1': null,
|
|
114
|
+
'2': null,
|
|
115
|
+
'3': null,
|
|
116
|
+
};
|
|
117
|
+
activeCallsMap = new Map();
|
|
118
|
+
activeCallId = null;
|
|
119
|
+
currentcallId = null;
|
|
120
|
+
agentId = '';
|
|
121
|
+
loginStatusSubject = new BehaviorSubject(false);
|
|
122
|
+
loginStatus$ = this.loginStatusSubject.asObservable();
|
|
123
|
+
DOM_TAGS = {
|
|
124
|
+
localVideo: 'lclVideo',
|
|
125
|
+
remoteVideo: 'rmtVideo',
|
|
126
|
+
remoteAudio: 'rmtAudio',
|
|
127
|
+
localAudio: 'lclAudio',
|
|
128
|
+
};
|
|
129
|
+
CONFIG_TEMPLATE = {
|
|
130
|
+
serviceType: 'phone', // value can be 'phone' or 'agent'
|
|
131
|
+
enableVideo: false,
|
|
132
|
+
Gateway: { ip: 'snugipose.avayalab.in', port: '9443' },
|
|
133
|
+
Stunserver: { ip: '', port: '3478' },
|
|
134
|
+
Turnserver: { ip: '', port: '3478', user: '', pwd: '' },
|
|
135
|
+
AppData: { applicationID: '', applicationUA: '', appInstanceID: '' },
|
|
136
|
+
disableResiliency: false,
|
|
137
|
+
};
|
|
138
|
+
agentStatusApiUrl = 'https://v2xla9n0t6.execute-api.us-west-2.amazonaws.com/dev';
|
|
139
|
+
CALL_HISTORY_API_URL = 'https://ktgxyy2x2h.execute-api.us-west-2.amazonaws.com/avayaCallHistory';
|
|
140
|
+
prewarmedStream;
|
|
141
|
+
isSafari() {
|
|
142
|
+
return /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
|
|
143
|
+
}
|
|
144
|
+
_rpcPatched = false;
|
|
145
|
+
constructor(zone, http) {
|
|
146
|
+
this.zone = zone;
|
|
147
|
+
this.http = http;
|
|
148
|
+
}
|
|
149
|
+
init() {
|
|
150
|
+
if (typeof AWL !== 'undefined') {
|
|
151
|
+
this.cli = new AWL.client();
|
|
152
|
+
const cliAny = this.cli;
|
|
153
|
+
Object.defineProperty(cliAny, 'jsonRpc', {
|
|
154
|
+
configurable: true,
|
|
155
|
+
set: (rpcClient) => {
|
|
156
|
+
console.log('[RPC-PATCH] jsonRpc assigned:', rpcClient);
|
|
157
|
+
// restore the real property
|
|
158
|
+
delete cliAny.jsonRpc;
|
|
159
|
+
cliAny.jsonRpc = rpcClient;
|
|
160
|
+
// now do the patch
|
|
161
|
+
this._doPatch();
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
console.warn('AWL is not yet loaded');
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
logIn(username, password) {
|
|
170
|
+
this.cli.enableLogging();
|
|
171
|
+
// this.cli.disableLogging();
|
|
172
|
+
const appInstanceId = this.cli.generateAppInstanceID();
|
|
173
|
+
const config = {
|
|
174
|
+
...this.CONFIG_TEMPLATE,
|
|
175
|
+
AppData: {
|
|
176
|
+
...this.CONFIG_TEMPLATE.AppData,
|
|
177
|
+
appInstanceID: appInstanceId,
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
console.debug('Parsed config: ', config);
|
|
181
|
+
const res_setConfiguration = this.cli.setConfiguration(config, this.handleConfigChange, this.handleRegistrationChange, new AvayaIPOCallListener(this), this.handleTokenRenewal);
|
|
182
|
+
console.debug('res_setConfiguration: ', res_setConfiguration);
|
|
183
|
+
if (res_setConfiguration === 'AWL_MSG_SETCONFIG_SUCCESS') {
|
|
184
|
+
console.debug('SET CONFIG SUCCESS');
|
|
185
|
+
}
|
|
186
|
+
const res_setDomElements = this.cli.setDomElements(this.DOM_TAGS);
|
|
187
|
+
console.debug('res_setDomElements: ', res_setDomElements);
|
|
188
|
+
if (res_setDomElements === 'AWL_MSG_SETDOM_FAILED') {
|
|
189
|
+
console.debug('SET DOM FAILED');
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
console.debug('SET DOM PASS');
|
|
193
|
+
}
|
|
194
|
+
const bumbConnection = 'true';
|
|
195
|
+
this.cli.logIn(username, password, bumbConnection);
|
|
196
|
+
this.setAgentId(username);
|
|
197
|
+
}
|
|
198
|
+
logOut() {
|
|
199
|
+
this.cli.logOut();
|
|
200
|
+
}
|
|
201
|
+
getAlternateServerConfig() {
|
|
202
|
+
return this.cli.getAlternateServerConfig();
|
|
203
|
+
}
|
|
204
|
+
getDeviceList() {
|
|
205
|
+
this.cli.getDeviceList((deviceList) => {
|
|
206
|
+
console.debug('Device List: ', deviceList);
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
setDeviceIds(deviceIds) {
|
|
210
|
+
console.debug('setDeviceIds: ', deviceIds);
|
|
211
|
+
this.cli.setDeviceIds(deviceIds);
|
|
212
|
+
}
|
|
213
|
+
async makeCall(destination) {
|
|
214
|
+
await this.prewarmMic();
|
|
215
|
+
console.debug('makeCall devicelist: ', this.getDeviceList());
|
|
216
|
+
const freeSlot = ['1', '2', '3'].find((s) => this.callSlots[s] === null);
|
|
217
|
+
if (!freeSlot) {
|
|
218
|
+
console.warn('All call slots are currently occupied.');
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
// const callObj = this.cli.makeCall(destination, 'audio');
|
|
222
|
+
const callObj = this.cli.makeCall(destination, 'video', {
|
|
223
|
+
headers: { 'X-Original-Caller': 'asees' },
|
|
224
|
+
});
|
|
225
|
+
if (!callObj) {
|
|
226
|
+
console.error('Error! Cannot make call.');
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
const callId = callObj.getCallId();
|
|
230
|
+
this.activeCallsMap.set(callId, callObj);
|
|
231
|
+
this.callSlots[freeSlot] = callObj;
|
|
232
|
+
this.activeCallId = callId;
|
|
233
|
+
return freeSlot;
|
|
234
|
+
}
|
|
235
|
+
dropCall() {
|
|
236
|
+
if (!this.activeCallId) {
|
|
237
|
+
console.warn('No active call to drop.');
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
// Find the slot that contains the active call using activeCallId
|
|
241
|
+
let targetSlot = null;
|
|
242
|
+
for (const [slot, callObj] of Object.entries(this.callSlots)) {
|
|
243
|
+
if (callObj && callObj.getCallId() === this.activeCallId) {
|
|
244
|
+
targetSlot = slot;
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
if (!targetSlot) {
|
|
249
|
+
console.error('Active call slot not found for activeCallId:', this.activeCallId);
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
// Drop the active call from the identified slot
|
|
253
|
+
const callId = this.callSlots[targetSlot].getCallId();
|
|
254
|
+
const res_dropCall = this.cli.dropCall(callId);
|
|
255
|
+
console.debug('res_dropCall: ', res_dropCall);
|
|
256
|
+
// Remove the call from the activeCalls map and the slot
|
|
257
|
+
this.activeCallsMap.delete(callId);
|
|
258
|
+
this.callSlots[targetSlot] = null;
|
|
259
|
+
// Reset activeCallId
|
|
260
|
+
this.activeCallId = null;
|
|
261
|
+
}
|
|
262
|
+
doMute() {
|
|
263
|
+
const res_doMute = this.cli.doMute(this.activeCallId);
|
|
264
|
+
console.debug('res_doMute: ', res_doMute);
|
|
265
|
+
}
|
|
266
|
+
doUnMute() {
|
|
267
|
+
const res_doUnMute = this.cli.doUnMute(this.activeCallId);
|
|
268
|
+
console.debug('res_doUnMute: ', res_doUnMute);
|
|
269
|
+
}
|
|
270
|
+
doHold() {
|
|
271
|
+
const res_doHold = this.cli.doHold(this.activeCallId);
|
|
272
|
+
console.debug('res_doHold: ', res_doHold);
|
|
273
|
+
}
|
|
274
|
+
doUnHold() {
|
|
275
|
+
const res_doUnHold = this.cli.doUnHold(this.activeCallId);
|
|
276
|
+
console.debug('res_doUnHold: ', res_doUnHold);
|
|
277
|
+
}
|
|
278
|
+
pauseVideo() {
|
|
279
|
+
const res_pauseVideo = this.cli.pauseVideo(this.activeCallId);
|
|
280
|
+
console.debug('res_pauseVideo: ', res_pauseVideo);
|
|
281
|
+
}
|
|
282
|
+
playVideo() {
|
|
283
|
+
const res_playVideo = this.cli.playVideo(this.activeCallId);
|
|
284
|
+
console.debug('res_playVideo: ', res_playVideo);
|
|
285
|
+
}
|
|
286
|
+
transferCall(target, type) {
|
|
287
|
+
const res_transferCall = this.cli.transferCall(target, this.activeCallId, type);
|
|
288
|
+
console.debug('res_transferCall: ', res_transferCall);
|
|
289
|
+
}
|
|
290
|
+
sendDTMF(digit) {
|
|
291
|
+
const res_sendDTMF = this.cli.sendDTMF(this.activeCallId, digit);
|
|
292
|
+
console.debug('res_sendDTMF: ', res_sendDTMF);
|
|
293
|
+
}
|
|
294
|
+
answerCall() {
|
|
295
|
+
if (this.callSlots['1']) {
|
|
296
|
+
this.activeCallId = this.callSlots['1'].getCallId();
|
|
297
|
+
const res_answerCall = this.cli.answerCall(this.activeCallId);
|
|
298
|
+
console.debug('res_answerCall: ', res_answerCall);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
addVideo() {
|
|
302
|
+
const res_addVideo = this.cli.addVideo(this.activeCallId);
|
|
303
|
+
console.debug('res_addVideo: ', res_addVideo);
|
|
304
|
+
}
|
|
305
|
+
removeVideo() {
|
|
306
|
+
const res_removeVideo = this.cli.removeVideo(this.activeCallId);
|
|
307
|
+
console.debug('res_removeVideo: ', res_removeVideo);
|
|
308
|
+
}
|
|
309
|
+
clearCallSlot() {
|
|
310
|
+
this.callSlots['1'] = null;
|
|
311
|
+
}
|
|
312
|
+
setAgentId(id) {
|
|
313
|
+
this.agentId = id;
|
|
314
|
+
}
|
|
315
|
+
agentIdle() {
|
|
316
|
+
const params = new HttpParams()
|
|
317
|
+
.set('action', 'release')
|
|
318
|
+
.set('agentId', this.agentId);
|
|
319
|
+
const headers = new HttpHeaders({ 'Content-Type': 'application/json' });
|
|
320
|
+
this.http.post(this.agentStatusApiUrl, {}, { params, headers }).subscribe((response) => console.debug('Agent marked as idle: ', response), (error) => console.error('Error updating agent status: ', error));
|
|
321
|
+
}
|
|
322
|
+
agentBusy() {
|
|
323
|
+
const params = new HttpParams()
|
|
324
|
+
.set('action', 'confirm')
|
|
325
|
+
.set('agentId', this.agentId);
|
|
326
|
+
const headers = new HttpHeaders({ 'Content-Type': 'application/json' });
|
|
327
|
+
this.http.post(this.agentStatusApiUrl, {}, { params, headers }).subscribe((response) => console.debug('Agent marked as busy: ', response), (error) => console.error('Error updating agent status: ', error));
|
|
328
|
+
}
|
|
329
|
+
agentAutoRelease() {
|
|
330
|
+
setInterval(() => {
|
|
331
|
+
const params = new HttpParams().set('action', 'auto-release');
|
|
332
|
+
const headers = new HttpHeaders({ 'Content-Type': 'application/json' });
|
|
333
|
+
this.http.get(this.agentStatusApiUrl, { params, headers }).subscribe((response) => console.debug('Auto-release triggered: ', response), (error) => console.error('Auto-release failed: ', error));
|
|
334
|
+
}, 2 * 60 * 1000);
|
|
335
|
+
}
|
|
336
|
+
handleConfigChange = (res_configChange) => {
|
|
337
|
+
console.debug('res_configChange: ', res_configChange);
|
|
338
|
+
};
|
|
339
|
+
handleRegistrationChange = (res_registrationChange) => {
|
|
340
|
+
// console.debug('res_registrationChange: ', res_registrationChange);
|
|
341
|
+
this.zone.run(() => {
|
|
342
|
+
this.loginStatusSubject.next(res_registrationChange);
|
|
343
|
+
});
|
|
344
|
+
console.debug('res_registrationChange: ', res_registrationChange);
|
|
345
|
+
if (res_registrationChange?.result === LoginState.LOGIN_SUCCESS) {
|
|
346
|
+
const rpc = this.cli.jsonRpc;
|
|
347
|
+
if (rpc && rpc.ws) {
|
|
348
|
+
rpc.ws.evtConnectionOpen.attach(() => {
|
|
349
|
+
console.log('[RPC-PATCH] WebSocket open — JSON-RPC ready');
|
|
350
|
+
this.patchRpcForTransfers(this.agentId);
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
};
|
|
355
|
+
handleTokenRenewal = (res_tokenRenewal) => {
|
|
356
|
+
console.debug('res_tokenRenewal: ', res_tokenRenewal);
|
|
357
|
+
if (res_tokenRenewal.result == 'AWL_MSG_TOKEN_RENEW_SUCCESS') {
|
|
358
|
+
console.debug('Token is successfully renewed');
|
|
359
|
+
}
|
|
360
|
+
else {
|
|
361
|
+
console.debug('Token renewal failed. reason: ', res_tokenRenewal.reason);
|
|
362
|
+
}
|
|
363
|
+
};
|
|
364
|
+
assignToFirstAvailableSlot(callId, callObj) {
|
|
365
|
+
const freeSlot = Object.entries(this.callSlots).find(([_, obj]) => obj === null);
|
|
366
|
+
if (freeSlot) {
|
|
367
|
+
this.callSlots[freeSlot[0]] = callObj;
|
|
368
|
+
this.activeCallsMap.set(callId, callObj);
|
|
369
|
+
// If we don't already have an active call tracked, set this incoming call as active.
|
|
370
|
+
if (!this.activeCallId) {
|
|
371
|
+
this.activeCallId = callId;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
console.warn('All call slots are occupied');
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
getSlotForCallId(callId) {
|
|
379
|
+
for (const [slot, callObj] of Object.entries(this.callSlots)) {
|
|
380
|
+
if (callObj && callObj.getCallId() === callId) {
|
|
381
|
+
return slot;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
return null;
|
|
385
|
+
}
|
|
386
|
+
releaseCallById(callId) {
|
|
387
|
+
for (const [slot, obj] of Object.entries(this.callSlots)) {
|
|
388
|
+
if (obj?.getCallId() === callId) {
|
|
389
|
+
this.callSlots[slot] = null;
|
|
390
|
+
this.activeCallsMap.delete(callId);
|
|
391
|
+
break;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
handleCallState(callObj) {
|
|
396
|
+
console.debug(`Call state updated for Call ID: ${callObj?.getCallId()}`, callObj);
|
|
397
|
+
console.debug(`Call state updated for Call ID: ${callObj?.getSipUri()}`, callObj);
|
|
398
|
+
this.currentcallId = callObj.getCallId();
|
|
399
|
+
const state = callObj.getCallState();
|
|
400
|
+
if (!this.activeCallId) {
|
|
401
|
+
this.activeCallId = callObj.getCallId();
|
|
402
|
+
}
|
|
403
|
+
switch (state) {
|
|
404
|
+
case CallState.FAILED:
|
|
405
|
+
case CallState.DISCONNECTED:
|
|
406
|
+
console.debug('Call Failed or DISCONNECTED! Releasing call...');
|
|
407
|
+
this.releaseCallById(callObj.getCallId());
|
|
408
|
+
// Signal UI to reset to dialpad (ensure change detection runs)
|
|
409
|
+
this.zone.run(() => {
|
|
410
|
+
this.callStateSubject.next({
|
|
411
|
+
callId: callObj.getCallId(),
|
|
412
|
+
state: CallState.DISCONNECTED,
|
|
413
|
+
});
|
|
414
|
+
});
|
|
415
|
+
break;
|
|
416
|
+
case CallState.FAREND_UPDATE:
|
|
417
|
+
console.debug('FarEnd Updated:', callObj.getFarEndNumber(), callObj.getFarEndName(), callObj.getSipUri());
|
|
418
|
+
break;
|
|
419
|
+
default:
|
|
420
|
+
console.debug('Call state: ', state);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
swapLines() {
|
|
424
|
+
let currentSlotKey = null;
|
|
425
|
+
// Find the slot key of the current active call
|
|
426
|
+
for (const [key, call] of Object.entries(this.callSlots)) {
|
|
427
|
+
if (call && call.getCallId() === this.activeCallId) {
|
|
428
|
+
currentSlotKey = key;
|
|
429
|
+
break;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
if (!currentSlotKey) {
|
|
433
|
+
console.warn('Active call slot not found.');
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
436
|
+
// Find another active call to swap to
|
|
437
|
+
for (const [key, call] of Object.entries(this.callSlots)) {
|
|
438
|
+
if (key === currentSlotKey)
|
|
439
|
+
continue;
|
|
440
|
+
if (call) {
|
|
441
|
+
const currentCall = this.callSlots[currentSlotKey];
|
|
442
|
+
console.log(`Holding call in slot ${currentSlotKey}`);
|
|
443
|
+
this.cli.doHold(currentCall?.getCallId());
|
|
444
|
+
console.log(`Unholding call in slot ${key}`);
|
|
445
|
+
this.cli.doUnHold(call.getCallId());
|
|
446
|
+
this.activeCallId = call.getCallId();
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
console.warn('No other active calls to swap to.');
|
|
451
|
+
}
|
|
452
|
+
swapToSlot(targetSlot) {
|
|
453
|
+
// 1) Find the current slot
|
|
454
|
+
let currentSlotKey = null;
|
|
455
|
+
for (const [key, call] of Object.entries(this.callSlots)) {
|
|
456
|
+
if (call && call.getCallId() === this.activeCallId) {
|
|
457
|
+
currentSlotKey = key;
|
|
458
|
+
break;
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
if (!currentSlotKey) {
|
|
462
|
+
console.warn("Active call slot not found, can't swap.");
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
465
|
+
// 2) If targetSlot is the same as currentSlotKey, do nothing
|
|
466
|
+
if (targetSlot === currentSlotKey) {
|
|
467
|
+
console.log(`Already on slot ${targetSlot}, no swap needed.`);
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
// 3) If the target slot has a call
|
|
471
|
+
const targetCall = this.callSlots[targetSlot];
|
|
472
|
+
if (!targetCall) {
|
|
473
|
+
console.warn(`No call in slot ${targetSlot}, can't unhold that slot.`);
|
|
474
|
+
return;
|
|
475
|
+
}
|
|
476
|
+
// 4) Hold the old slot
|
|
477
|
+
const currentCall = this.callSlots[currentSlotKey];
|
|
478
|
+
console.log(`Holding call in slot ${currentSlotKey}`);
|
|
479
|
+
this.cli.doHold(currentCall?.getCallId());
|
|
480
|
+
// 5) Unhold the target slot
|
|
481
|
+
console.log(`Unholding call in slot ${targetSlot}`);
|
|
482
|
+
this.cli.doUnHold(targetCall.getCallId());
|
|
483
|
+
// 6) Update activeCallId
|
|
484
|
+
this.activeCallId = targetCall.getCallId();
|
|
485
|
+
console.log(`Swapped from slot ${currentSlotKey} to slot ${targetSlot}.`);
|
|
486
|
+
}
|
|
487
|
+
dropCallBySlot(targetSlot) {
|
|
488
|
+
// Check if there is a call in the requested slot.
|
|
489
|
+
const targetCall = this.callSlots[targetSlot];
|
|
490
|
+
if (!targetCall) {
|
|
491
|
+
console.warn(`No active call in slot ${targetSlot} to drop.`);
|
|
492
|
+
return;
|
|
493
|
+
}
|
|
494
|
+
// Retrieve the call ID from the target call.
|
|
495
|
+
const callId = targetCall.getCallId();
|
|
496
|
+
console.log(`Dropping call in slot ${targetSlot}, callId: ${callId}`);
|
|
497
|
+
// Issue the drop command through Avaya's CLI.
|
|
498
|
+
const res_dropCall = this.cli.dropCall(callId);
|
|
499
|
+
console.debug('dropCallBySlot response:', res_dropCall);
|
|
500
|
+
// Clean up: remove the call from the slot and from the activeCallsMap.
|
|
501
|
+
this.activeCallsMap.delete(callId);
|
|
502
|
+
this.callSlots[targetSlot] = null;
|
|
503
|
+
// If the activeCallId matches the dropped call, reset it.
|
|
504
|
+
if (this.activeCallId === callId) {
|
|
505
|
+
this.activeCallId = null;
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
mergeCall() {
|
|
509
|
+
const activeCallObjs = Object.entries(this.callSlots)
|
|
510
|
+
.filter(([_, callObj]) => callObj !== null)
|
|
511
|
+
.map(([_, callObj]) => callObj);
|
|
512
|
+
if (activeCallObjs.length < 2) {
|
|
513
|
+
console.warn('At least two active calls are required to perform merge.');
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
516
|
+
const [sourceCall, targetCall] = activeCallObjs;
|
|
517
|
+
try {
|
|
518
|
+
const sourceCallId = sourceCall.getCallId();
|
|
519
|
+
const targetCallId = targetCall.getCallId();
|
|
520
|
+
console.log(`Merging calls: from ${sourceCallId} to ${targetCallId}`);
|
|
521
|
+
this.cli.transferCall(targetCallId, sourceCallId, 'Attended');
|
|
522
|
+
}
|
|
523
|
+
catch (error) {
|
|
524
|
+
console.error('Merge call failed:', error);
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
logCall(callData) {
|
|
528
|
+
// 1) Build the HttpParams with "action=log"
|
|
529
|
+
const params = new HttpParams().set('action', 'log');
|
|
530
|
+
// 2) Set headers to JSON
|
|
531
|
+
const headers = new HttpHeaders({ 'Content-Type': 'application/json' });
|
|
532
|
+
// 3) Make a POST request, passing callData in the body, and use params + headers
|
|
533
|
+
return this.http.post(this.CALL_HISTORY_API_URL, callData, {
|
|
534
|
+
params,
|
|
535
|
+
headers,
|
|
536
|
+
});
|
|
537
|
+
}
|
|
538
|
+
getActiveCallId() {
|
|
539
|
+
if (!this.activeCallId) {
|
|
540
|
+
return null;
|
|
541
|
+
}
|
|
542
|
+
const callObj = this.activeCallsMap.get(this.activeCallId);
|
|
543
|
+
if (!callObj) {
|
|
544
|
+
return null;
|
|
545
|
+
}
|
|
546
|
+
return callObj.getCallId();
|
|
547
|
+
}
|
|
548
|
+
async initLocalMic() {
|
|
549
|
+
try {
|
|
550
|
+
const micStream = await navigator.mediaDevices.getUserMedia({
|
|
551
|
+
audio: true,
|
|
552
|
+
});
|
|
553
|
+
console.log('Captured mic stream:', micStream);
|
|
554
|
+
this.localStream = micStream;
|
|
555
|
+
}
|
|
556
|
+
catch (err) {
|
|
557
|
+
console.error('Failed to capture microphone:', err);
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
/////////////////////////////////////////////////////////////
|
|
561
|
+
patchRpcForTransfers(agentId) {
|
|
562
|
+
if (this._rpcPatched) {
|
|
563
|
+
console.debug('[RPC-PATCH] already patched');
|
|
564
|
+
return;
|
|
565
|
+
}
|
|
566
|
+
const jsonRpc = this.cli.jsonRpc;
|
|
567
|
+
if (!jsonRpc || !jsonRpc.ws) {
|
|
568
|
+
console.warn('[RPC-PATCH] JSON-RPC not ready yet');
|
|
569
|
+
return;
|
|
570
|
+
}
|
|
571
|
+
console.debug('[RPC-PATCH] patching ws.send now');
|
|
572
|
+
this._rpcPatched = true;
|
|
573
|
+
const ws = jsonRpc.ws;
|
|
574
|
+
const origSend = ws.send.bind(ws);
|
|
575
|
+
ws.send = (raw) => {
|
|
576
|
+
// log every outbound frame so you can see your injection happen
|
|
577
|
+
try {
|
|
578
|
+
const msg = JSON.parse(raw);
|
|
579
|
+
if (msg.msgname === 'makeCall' || msg.msgname === 'transferCall') {
|
|
580
|
+
console.debug(`[RPC-PATCH] sending ${msg.msgname} →`, msg.params);
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
catch (_) {
|
|
584
|
+
/* not JSON, ignore */
|
|
585
|
+
}
|
|
586
|
+
return origSend(raw);
|
|
587
|
+
};
|
|
588
|
+
}
|
|
589
|
+
async makeCallWithCustomData(destination, dataToSend) {
|
|
590
|
+
// 0) Safari race fix
|
|
591
|
+
await this.prewarmMic();
|
|
592
|
+
this.patchRpcForTransfers(dataToSend);
|
|
593
|
+
// 2) find a free slot
|
|
594
|
+
const freeSlot = ['1', '2', '3'].find((s) => this.callSlots[s] === null);
|
|
595
|
+
if (!freeSlot) {
|
|
596
|
+
console.warn('All call slots are occupied.');
|
|
597
|
+
return null;
|
|
598
|
+
}
|
|
599
|
+
// 3) kick off the call via AWL
|
|
600
|
+
const callObj = this.cli.makeCall(destination, 'audio');
|
|
601
|
+
if (!callObj) {
|
|
602
|
+
console.error('Error! Cannot make call.');
|
|
603
|
+
return null;
|
|
604
|
+
}
|
|
605
|
+
// 4) book-keep exactly as you do today
|
|
606
|
+
const callId = callObj.getCallId();
|
|
607
|
+
this.activeCallsMap.set(callId, callObj);
|
|
608
|
+
this.callSlots[freeSlot] = callObj;
|
|
609
|
+
this.activeCallId = callId;
|
|
610
|
+
console.log(`📡 Started call in slot ${freeSlot} with customData="${dataToSend}"`);
|
|
611
|
+
return freeSlot;
|
|
612
|
+
}
|
|
613
|
+
transferCallWithTag(target, type) {
|
|
614
|
+
// 1) patch the JSON-RPC so the next transferCall has our tag
|
|
615
|
+
this.patchRpcForTransfers(this.agentId);
|
|
616
|
+
// 2) do the normal AWL transfer
|
|
617
|
+
const res = this.cli.transferCall(target, this.activeCallId, type);
|
|
618
|
+
console.debug('res_transferCall:', res);
|
|
619
|
+
}
|
|
620
|
+
_doPatch() {
|
|
621
|
+
// if (this._rpcPatched) return;
|
|
622
|
+
this._rpcPatched = true;
|
|
623
|
+
console.log('[RPC-PATCH] patching WebSocket now');
|
|
624
|
+
const jsonRpc = this.cli.jsonRpc;
|
|
625
|
+
const ws = jsonRpc.ws;
|
|
626
|
+
const origSend = ws.send.bind(ws);
|
|
627
|
+
ws.send = (data) => {
|
|
628
|
+
console.log('[RPC-PATCH] raw ws.send →', data);
|
|
629
|
+
try {
|
|
630
|
+
const msg = JSON.parse(data);
|
|
631
|
+
if (msg.msgname === 'makeCall' || msg.msgname === 'transferCall') {
|
|
632
|
+
// inject your field
|
|
633
|
+
msg.params.transferingAgent = this.agentId;
|
|
634
|
+
const patched = JSON.stringify(msg);
|
|
635
|
+
console.log(`[RPC-PATCH] sending ${msg.msgname} with params →`, msg.params);
|
|
636
|
+
return origSend(patched);
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
catch {
|
|
640
|
+
// non-JSON or other messages
|
|
641
|
+
}
|
|
642
|
+
return origSend(data);
|
|
643
|
+
};
|
|
644
|
+
}
|
|
645
|
+
/** Pre-warm microphone so AWL always has a local stream when it tries addStream() */
|
|
646
|
+
async prewarmMic() {
|
|
647
|
+
// Reuse if we already have a healthy stream
|
|
648
|
+
if (this.prewarmedStream && this.prewarmedStream.getTracks().length) {
|
|
649
|
+
return this.prewarmedStream;
|
|
650
|
+
}
|
|
651
|
+
// On Safari, first call should be simple (no exact device constraints)
|
|
652
|
+
const audio = this.isSafari() ? true : { echoCancellation: false, noiseSuppression: false, autoGainControl: false };
|
|
653
|
+
const stream = await navigator.mediaDevices.getUserMedia({ audio });
|
|
654
|
+
this.prewarmedStream = stream;
|
|
655
|
+
this.localStream = stream;
|
|
656
|
+
// Hand it to the polyfill fallback so addStream(undefined) still works
|
|
657
|
+
window.__LAST_LOCAL_STREAM = stream;
|
|
658
|
+
// (Optional) Nudge autoplay policy: attach to a muted hidden <audio> once
|
|
659
|
+
try {
|
|
660
|
+
const a = document.createElement('audio');
|
|
661
|
+
a.muted = true;
|
|
662
|
+
a.autoplay = true;
|
|
663
|
+
a.style.display = 'none';
|
|
664
|
+
a.srcObject = stream;
|
|
665
|
+
document.body.appendChild(a);
|
|
666
|
+
await a.play().catch(() => { });
|
|
667
|
+
// keep element for lifetime of the page to avoid GC issues
|
|
668
|
+
}
|
|
669
|
+
catch { }
|
|
670
|
+
return stream;
|
|
671
|
+
}
|
|
672
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: AvayaIPOService, deps: [{ token: i0.NgZone }, { token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
673
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: AvayaIPOService, providedIn: 'root' });
|
|
674
|
+
}
|
|
675
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: AvayaIPOService, decorators: [{
|
|
676
|
+
type: Injectable,
|
|
677
|
+
args: [{ providedIn: 'root' }]
|
|
678
|
+
}], ctorParameters: () => [{ type: i0.NgZone }, { type: i1.HttpClient }] });
|
|
679
|
+
|
|
680
|
+
class CountryService {
|
|
681
|
+
httpClient;
|
|
682
|
+
countriesData;
|
|
683
|
+
// private static readonly COUNTRY_ENDPOINT = `https://assets.snugdesk.com/metadata/countries.json`;
|
|
684
|
+
static COUNTRY_ENDPOINT = `https://snugdesk-assets.s3.amazonaws.com/metadata/countries.json`;
|
|
685
|
+
constructor(httpClient) {
|
|
686
|
+
this.httpClient = httpClient;
|
|
687
|
+
}
|
|
688
|
+
async getAllCountries() {
|
|
689
|
+
if (!this.countriesData) {
|
|
690
|
+
this.countriesData = await lastValueFrom(this.httpClient.get(CountryService.COUNTRY_ENDPOINT));
|
|
691
|
+
}
|
|
692
|
+
return this.countriesData;
|
|
693
|
+
}
|
|
694
|
+
async getCountryFromCallingCode(countryCallingCode) {
|
|
695
|
+
await this.getAllCountries();
|
|
696
|
+
return this.countriesData?.find((c) => c.callingCode === countryCallingCode);
|
|
697
|
+
}
|
|
698
|
+
async getCountryFromCountryCode(countryCode) {
|
|
699
|
+
await this.getAllCountries();
|
|
700
|
+
return this.countriesData?.find((c) => c.code === countryCode);
|
|
701
|
+
}
|
|
702
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: CountryService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
703
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: CountryService, providedIn: 'root' });
|
|
704
|
+
}
|
|
705
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: CountryService, decorators: [{
|
|
706
|
+
type: Injectable,
|
|
707
|
+
args: [{
|
|
708
|
+
providedIn: 'root',
|
|
709
|
+
}]
|
|
710
|
+
}], ctorParameters: () => [{ type: i1.HttpClient }] });
|
|
711
|
+
|
|
712
|
+
class PhoneNumberLookupService {
|
|
713
|
+
httpClient;
|
|
714
|
+
constructor(httpClient) {
|
|
715
|
+
this.httpClient = httpClient;
|
|
716
|
+
}
|
|
717
|
+
async lookupPhoneNumber(phoneNumber, hlr) {
|
|
718
|
+
const apiEndpoint = hlr
|
|
719
|
+
? `https://api.snugdesk.com/phone-numbers/hlr/${encodeURIComponent(phoneNumber)}`
|
|
720
|
+
: `https://api.snugdesk.com/phone-numbers/${encodeURIComponent(phoneNumber)}`;
|
|
721
|
+
const res_lookupPhoneNumber = await lastValueFrom(this.httpClient.get(apiEndpoint));
|
|
722
|
+
// console.debug('res_lookupPhoneNumber: ', res_lookupPhoneNumber);
|
|
723
|
+
return res_lookupPhoneNumber;
|
|
724
|
+
}
|
|
725
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: PhoneNumberLookupService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
726
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: PhoneNumberLookupService, providedIn: 'root' });
|
|
727
|
+
}
|
|
728
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: PhoneNumberLookupService, decorators: [{
|
|
729
|
+
type: Injectable,
|
|
730
|
+
args: [{
|
|
731
|
+
providedIn: 'root',
|
|
732
|
+
}]
|
|
733
|
+
}], ctorParameters: () => [{ type: i1.HttpClient }] });
|
|
734
|
+
|
|
735
|
+
// import { Injectable } from '@angular/core';
|
|
736
|
+
// import { HttpClient } from '@angular/common/http';
|
|
737
|
+
// import { lastValueFrom } from 'rxjs';
|
|
738
|
+
// import { CallMetadata } from '../models/active-call.model';
|
|
739
|
+
// export interface RecordingSession {
|
|
740
|
+
// audioContext: AudioContext;
|
|
741
|
+
// recordingStream: MediaStreamAudioDestinationNode;
|
|
742
|
+
// recorder: MediaRecorder;
|
|
743
|
+
// metadata: CallMetadata;
|
|
744
|
+
// }
|
|
745
|
+
// @Injectable({ providedIn: 'root' })
|
|
746
|
+
// export class RecordingManagerService {
|
|
747
|
+
// private sessions = new Map<string, RecordingSession>();
|
|
748
|
+
// private readonly MIME_TYPE_PREFERRED = 'audio/webm;codecs=opus';
|
|
749
|
+
// private readonly MIME_TYPE_FALLBACK = 'audio/webm';
|
|
750
|
+
// private readonly CHUNK_DURATION_MS = 5000;
|
|
751
|
+
// private readonly AUDIO_CONTEXT_CLOSE_DELAY_MS = 200;
|
|
752
|
+
// private readonly CALL_HISTORY_API_URL =
|
|
753
|
+
// 'https://ktgxyy2x2h.execute-api.us-west-2.amazonaws.com/avayaCallHistory';
|
|
754
|
+
// constructor(private http: HttpClient) {}
|
|
755
|
+
// // prettier-ignore
|
|
756
|
+
// startRecording(localMediaStream: MediaStream, remoteMediaStream: MediaStream, metadata: RecordingSession['metadata']): RecordingSession | undefined {
|
|
757
|
+
// // Stop any existing recording session for this callId
|
|
758
|
+
// this.stopRecording(metadata.callId);
|
|
759
|
+
// if (!localMediaStream || !remoteMediaStream) {
|
|
760
|
+
// console.warn(`[${metadata.callId}] Skipped start recording: missing remote or local stream`);
|
|
761
|
+
// return undefined;
|
|
762
|
+
// }
|
|
763
|
+
// const audioContext = new AudioContext();
|
|
764
|
+
// const recordingStream = audioContext.createMediaStreamDestination();
|
|
765
|
+
// // console.debug(`[${metadata.callId}] Connecting local and remote audio streams to recording context`);
|
|
766
|
+
// audioContext.createMediaStreamSource(localMediaStream).connect(recordingStream);
|
|
767
|
+
// audioContext.createMediaStreamSource(remoteMediaStream).connect(recordingStream);
|
|
768
|
+
// const mimeType = MediaRecorder.isTypeSupported(this.MIME_TYPE_PREFERRED)
|
|
769
|
+
// ? this.MIME_TYPE_PREFERRED
|
|
770
|
+
// : this.MIME_TYPE_FALLBACK;
|
|
771
|
+
// const recorder = new MediaRecorder(recordingStream.stream, { mimeType });
|
|
772
|
+
// recorder.ondataavailable = (evt: BlobEvent) => this.handleDataAvailable(evt, metadata);
|
|
773
|
+
// recorder.onerror = (err) => console.error(`[${metadata.callId}] MediaRecorder error:`, err);
|
|
774
|
+
// recorder.start(this.CHUNK_DURATION_MS);
|
|
775
|
+
// console.debug(`[${metadata.callId}] MediaRecorder started (chunk size: ${this.CHUNK_DURATION_MS / 1000}s)`);
|
|
776
|
+
// const session: RecordingSession = {
|
|
777
|
+
// audioContext,
|
|
778
|
+
// recordingStream,
|
|
779
|
+
// recorder,
|
|
780
|
+
// metadata,
|
|
781
|
+
// };
|
|
782
|
+
// this.sessions.set(metadata.callId, session);
|
|
783
|
+
// return session;
|
|
784
|
+
// }
|
|
785
|
+
// getSession(callId: string): RecordingSession | undefined {
|
|
786
|
+
// return this.sessions.get(callId);
|
|
787
|
+
// }
|
|
788
|
+
// stopRecording(callId: string): void {
|
|
789
|
+
// const session = this.sessions.get(callId);
|
|
790
|
+
// if (!session) return;
|
|
791
|
+
// const { recorder, audioContext } = session;
|
|
792
|
+
// if (recorder?.state === 'recording') {
|
|
793
|
+
// recorder.stop();
|
|
794
|
+
// console.debug(`[${callId}] MediaRecorder stopped`);
|
|
795
|
+
// }
|
|
796
|
+
// setTimeout(() => {
|
|
797
|
+
// if (audioContext.state !== 'closed') {
|
|
798
|
+
// audioContext.close();
|
|
799
|
+
// console.debug(`[${callId}] AudioContext closed`);
|
|
800
|
+
// }
|
|
801
|
+
// }, this.AUDIO_CONTEXT_CLOSE_DELAY_MS);
|
|
802
|
+
// this.sessions.delete(callId);
|
|
803
|
+
// }
|
|
804
|
+
// // prettier-ignore
|
|
805
|
+
// private async handleDataAvailable(evt: BlobEvent, metadata: RecordingSession['metadata']): Promise<void> {
|
|
806
|
+
// if (!evt.data || evt.data.size === 0) return;
|
|
807
|
+
// const filename = this.generateFilename(metadata.callId);
|
|
808
|
+
// // console.debug(`[${metadata.callId}] Recording chunk ready → preparing to upload as "${filename}"`);
|
|
809
|
+
// try {
|
|
810
|
+
// await this.uploadCallRecording(metadata, evt.data, filename);
|
|
811
|
+
// console.debug(`[${metadata.callId}] Upload successful → "${filename}"`);
|
|
812
|
+
// } catch (err) {
|
|
813
|
+
// console.error(`[${metadata.callId}] Upload failed → "${filename}"`, err);
|
|
814
|
+
// }
|
|
815
|
+
// }
|
|
816
|
+
// // prettier-ignore
|
|
817
|
+
// private async uploadCallRecording(metadata: RecordingSession['metadata'], file: Blob, filename?: string): Promise<{ success: boolean; message: string; s3Key?: string }> {
|
|
818
|
+
// try {
|
|
819
|
+
// if (!filename) {
|
|
820
|
+
// const timestamp = new Date()
|
|
821
|
+
// .toISOString()
|
|
822
|
+
// .replace(/[:.]/g, '')
|
|
823
|
+
// .replace('T', '-')
|
|
824
|
+
// .slice(0, 15);
|
|
825
|
+
// filename = `${timestamp}-${metadata.agentId}.webm`;
|
|
826
|
+
// console.debug(`[${metadata.callId}] filename generated: "${filename}"`);
|
|
827
|
+
// }
|
|
828
|
+
// // console.debug(`[${metadata.callId}] Converting Blob to Base64 for upload`);
|
|
829
|
+
// const base64 = await this.convertBlobToBase64(file);
|
|
830
|
+
// const body = base64.split(',')[1];
|
|
831
|
+
// const payload = {
|
|
832
|
+
// ...metadata,
|
|
833
|
+
// filename,
|
|
834
|
+
// isBase64: true,
|
|
835
|
+
// body,
|
|
836
|
+
// };
|
|
837
|
+
// const url = `${this.CALL_HISTORY_API_URL}?action=uploadRecording`;
|
|
838
|
+
// console.debug(`[${metadata.callId}] Sending recording chunk to ${url}`);
|
|
839
|
+
// console.debug(`[${metadata.callId}] Payload: `, payload);
|
|
840
|
+
// const res: any = await lastValueFrom(
|
|
841
|
+
// this.http.post(url, payload, {
|
|
842
|
+
// headers: { 'Content-Type': 'application/json' },
|
|
843
|
+
// responseType: 'json',
|
|
844
|
+
// })
|
|
845
|
+
// );
|
|
846
|
+
// console.debug(`[${metadata.callId}] Upload response: `, res);
|
|
847
|
+
// return {
|
|
848
|
+
// success: true,
|
|
849
|
+
// message: res?.message || 'Upload successful',
|
|
850
|
+
// s3Key: res?.s3Key,
|
|
851
|
+
// };
|
|
852
|
+
// } catch (err: any) {
|
|
853
|
+
// console.error(`[${metadata.callId}] Upload failed: `, err);
|
|
854
|
+
// return {
|
|
855
|
+
// success: false,
|
|
856
|
+
// message: err?.message || 'Upload failed',
|
|
857
|
+
// };
|
|
858
|
+
// }
|
|
859
|
+
// }
|
|
860
|
+
// private convertBlobToBase64(blob: Blob): Promise<string> {
|
|
861
|
+
// return new Promise((resolve, reject) => {
|
|
862
|
+
// const reader = new FileReader();
|
|
863
|
+
// reader.onerror = reject;
|
|
864
|
+
// reader.onload = () => resolve(reader.result as string);
|
|
865
|
+
// reader.readAsDataURL(blob);
|
|
866
|
+
// });
|
|
867
|
+
// }
|
|
868
|
+
// private generateFilename(callId: string): string {
|
|
869
|
+
// const now = new Date();
|
|
870
|
+
// const dateStr = now.toISOString().slice(0, 10).replace(/-/g, '');
|
|
871
|
+
// const timeStr = now.toTimeString().slice(0, 8).replace(/:/g, '');
|
|
872
|
+
// const msStr = now.getMilliseconds().toString().padStart(3, '0');
|
|
873
|
+
// const filename = `${callId}-${dateStr}-${timeStr}${msStr}.webm`;
|
|
874
|
+
// console.debug(`[${callId}] Generated filename: "${filename}"`);
|
|
875
|
+
// return filename;
|
|
876
|
+
// }
|
|
877
|
+
// }
|
|
878
|
+
class RecordingManagerService {
|
|
879
|
+
http;
|
|
880
|
+
sessions = new Map();
|
|
881
|
+
MIME_TYPE_PREFERRED = 'audio/webm;codecs=opus';
|
|
882
|
+
MIME_TYPE_FALLBACK = 'audio/webm';
|
|
883
|
+
CHUNK_DURATION_MS = 5000;
|
|
884
|
+
AUDIO_CONTEXT_CLOSE_DELAY_MS = 200;
|
|
885
|
+
CALL_HISTORY_API_URL = 'https://ktgxyy2x2h.execute-api.us-west-2.amazonaws.com/avayaCallHistory';
|
|
886
|
+
constructor(http) {
|
|
887
|
+
this.http = http;
|
|
888
|
+
}
|
|
889
|
+
// ---- Public API ----------------------------------------------------------
|
|
890
|
+
startRecording(localMediaStream, remoteMediaStream, metadata) {
|
|
891
|
+
// stop any previous session for this call
|
|
892
|
+
this.stopRecording(metadata.callId);
|
|
893
|
+
if (!localMediaStream || !remoteMediaStream) {
|
|
894
|
+
console.warn(`[${metadata.callId}] Skipped start recording: missing remote or local stream`);
|
|
895
|
+
return undefined;
|
|
896
|
+
}
|
|
897
|
+
const audioContext = new AudioContext();
|
|
898
|
+
const recordingStream = audioContext.createMediaStreamDestination();
|
|
899
|
+
audioContext.createMediaStreamSource(localMediaStream).connect(recordingStream);
|
|
900
|
+
audioContext.createMediaStreamSource(remoteMediaStream).connect(recordingStream);
|
|
901
|
+
const session = {
|
|
902
|
+
audioContext,
|
|
903
|
+
recordingStream,
|
|
904
|
+
metadata,
|
|
905
|
+
stopping: false,
|
|
906
|
+
chunkIndex: 0,
|
|
907
|
+
recorder: null,
|
|
908
|
+
chunkTimer: undefined
|
|
909
|
+
};
|
|
910
|
+
this.sessions.set(metadata.callId, session);
|
|
911
|
+
// kick off the chunk loop
|
|
912
|
+
this.startNextChunk(session);
|
|
913
|
+
return session;
|
|
914
|
+
}
|
|
915
|
+
getSession(callId) {
|
|
916
|
+
return this.sessions.get(callId);
|
|
917
|
+
}
|
|
918
|
+
stopRecording(callId) {
|
|
919
|
+
const session = this.sessions.get(callId);
|
|
920
|
+
if (!session)
|
|
921
|
+
return;
|
|
922
|
+
session.stopping = true;
|
|
923
|
+
if (session.chunkTimer) {
|
|
924
|
+
clearTimeout(session.chunkTimer);
|
|
925
|
+
session.chunkTimer = undefined;
|
|
926
|
+
}
|
|
927
|
+
const rec = session.recorder;
|
|
928
|
+
if (rec && rec.state === 'recording') {
|
|
929
|
+
try {
|
|
930
|
+
rec.stop(); // this will still produce the final (playable) chunk
|
|
931
|
+
}
|
|
932
|
+
catch { }
|
|
933
|
+
}
|
|
934
|
+
// close audio context a bit later
|
|
935
|
+
setTimeout(() => {
|
|
936
|
+
if (session.audioContext.state !== 'closed') {
|
|
937
|
+
session.audioContext.close();
|
|
938
|
+
console.debug(`[${session.metadata.callId}] AudioContext closed`);
|
|
939
|
+
}
|
|
940
|
+
}, this.AUDIO_CONTEXT_CLOSE_DELAY_MS);
|
|
941
|
+
this.sessions.delete(callId);
|
|
942
|
+
}
|
|
943
|
+
// ---- Internals -----------------------------------------------------------
|
|
944
|
+
/** Start a new MediaRecorder for the next chunk so the blob has its own headers */
|
|
945
|
+
startNextChunk(session) {
|
|
946
|
+
if (session.stopping)
|
|
947
|
+
return;
|
|
948
|
+
const mimeType = MediaRecorder.isTypeSupported(this.MIME_TYPE_PREFERRED)
|
|
949
|
+
? this.MIME_TYPE_PREFERRED
|
|
950
|
+
: this.MIME_TYPE_FALLBACK;
|
|
951
|
+
const recorder = new MediaRecorder(session.recordingStream.stream, { mimeType });
|
|
952
|
+
session.recorder = recorder;
|
|
953
|
+
const myChunkIdx = session.chunkIndex++;
|
|
954
|
+
recorder.ondataavailable = async (evt) => {
|
|
955
|
+
if (!evt.data || evt.data.size === 0)
|
|
956
|
+
return;
|
|
957
|
+
// give each chunk its own unique filename (includes index)
|
|
958
|
+
const filename = this.generateChunkFilename(session.metadata.callId, myChunkIdx);
|
|
959
|
+
try {
|
|
960
|
+
await this.uploadCallRecording(session.metadata, evt.data, filename);
|
|
961
|
+
console.debug(`[${session.metadata.callId}] ✅ uploaded chunk → ${filename}`);
|
|
962
|
+
}
|
|
963
|
+
catch (err) {
|
|
964
|
+
console.error(`[${session.metadata.callId}] ❌ upload failed → ${filename}`, err);
|
|
965
|
+
}
|
|
966
|
+
};
|
|
967
|
+
recorder.onerror = (err) => {
|
|
968
|
+
console.error(`[${session.metadata.callId}] MediaRecorder error:`, err);
|
|
969
|
+
};
|
|
970
|
+
// when this recorder is stopped, immediately start the next one (unless stopping)
|
|
971
|
+
recorder.onstop = () => {
|
|
972
|
+
if (session.stopping)
|
|
973
|
+
return;
|
|
974
|
+
// start the next chunk on the next tick to avoid overlap
|
|
975
|
+
setTimeout(() => this.startNextChunk(session), 0);
|
|
976
|
+
};
|
|
977
|
+
// Start recording this chunk (no timeslice!) and schedule a stop after N ms.
|
|
978
|
+
recorder.start();
|
|
979
|
+
console.debug(`[${session.metadata.callId}] MediaRecorder started for chunk #${myChunkIdx}`);
|
|
980
|
+
session.chunkTimer = window.setTimeout(() => {
|
|
981
|
+
if (!session.stopping && recorder.state === 'recording') {
|
|
982
|
+
// ensure we flush a complete, headered WebM
|
|
983
|
+
recorder.stop();
|
|
984
|
+
console.debug(`[${session.metadata.callId}] MediaRecorder stopped for chunk #${myChunkIdx}`);
|
|
985
|
+
}
|
|
986
|
+
}, this.CHUNK_DURATION_MS);
|
|
987
|
+
}
|
|
988
|
+
// Upload a single chunk (Blob) as base64 payload
|
|
989
|
+
async uploadCallRecording(metadata, file, filename) {
|
|
990
|
+
try {
|
|
991
|
+
if (!filename) {
|
|
992
|
+
filename = this.generateFilename(metadata.callId, metadata.agentId);
|
|
993
|
+
}
|
|
994
|
+
const base64 = await this.convertBlobToBase64(file);
|
|
995
|
+
const body = base64.split(',')[1];
|
|
996
|
+
const payload = {
|
|
997
|
+
...metadata,
|
|
998
|
+
filename,
|
|
999
|
+
isBase64: true,
|
|
1000
|
+
body,
|
|
1001
|
+
};
|
|
1002
|
+
const url = `${this.CALL_HISTORY_API_URL}?action=uploadRecording`;
|
|
1003
|
+
const res = await lastValueFrom(this.http.post(url, payload, {
|
|
1004
|
+
headers: { 'Content-Type': 'application/json' },
|
|
1005
|
+
responseType: 'json',
|
|
1006
|
+
}));
|
|
1007
|
+
return {
|
|
1008
|
+
success: true,
|
|
1009
|
+
message: res?.message || 'Upload successful',
|
|
1010
|
+
s3Key: res?.s3Key,
|
|
1011
|
+
};
|
|
1012
|
+
}
|
|
1013
|
+
catch (err) {
|
|
1014
|
+
return {
|
|
1015
|
+
success: false,
|
|
1016
|
+
message: err?.message || 'Upload failed',
|
|
1017
|
+
};
|
|
1018
|
+
}
|
|
1019
|
+
}
|
|
1020
|
+
convertBlobToBase64(blob) {
|
|
1021
|
+
return new Promise((resolve, reject) => {
|
|
1022
|
+
const reader = new FileReader();
|
|
1023
|
+
reader.onerror = reject;
|
|
1024
|
+
reader.onload = () => resolve(reader.result);
|
|
1025
|
+
reader.readAsDataURL(blob);
|
|
1026
|
+
});
|
|
1027
|
+
}
|
|
1028
|
+
generateFilename(callId, agentId) {
|
|
1029
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '').replace('T', '-').slice(0, 15);
|
|
1030
|
+
return `${timestamp}-${agentId}-${callId}.webm`;
|
|
1031
|
+
}
|
|
1032
|
+
generateChunkFilename(callId, chunkIndex) {
|
|
1033
|
+
const now = new Date();
|
|
1034
|
+
const dateStr = now.toISOString().slice(0, 10).replace(/-/g, '');
|
|
1035
|
+
const timeStr = now.toTimeString().slice(0, 8).replace(/:/g, '');
|
|
1036
|
+
const msStr = now.getMilliseconds().toString().padStart(3, '0');
|
|
1037
|
+
const part = String(chunkIndex).padStart(4, '0');
|
|
1038
|
+
return `${callId}-${dateStr}-${timeStr}${msStr}-part${part}.webm`;
|
|
1039
|
+
}
|
|
1040
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: RecordingManagerService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1041
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: RecordingManagerService, providedIn: 'root' });
|
|
1042
|
+
}
|
|
1043
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: RecordingManagerService, decorators: [{
|
|
1044
|
+
type: Injectable,
|
|
1045
|
+
args: [{ providedIn: 'root' }]
|
|
1046
|
+
}], ctorParameters: () => [{ type: i1.HttpClient }] });
|
|
1047
|
+
|
|
1048
|
+
// import { Injectable } from '@angular/core';
|
|
1049
|
+
// import { BehaviorSubject } from 'rxjs';
|
|
1050
|
+
// import { CallMetadata } from '../models/active-call.model';
|
|
1051
|
+
// @Injectable({ providedIn: 'root' })
|
|
1052
|
+
// export class CallSocketService {
|
|
1053
|
+
// private socket: WebSocket | null = null;
|
|
1054
|
+
// readonly message$ = new BehaviorSubject<any>(null);
|
|
1055
|
+
// open(metadata: CallMetadata): void {
|
|
1056
|
+
// if (this.socket?.readyState === WebSocket.OPEN) return;
|
|
1057
|
+
// if (this.socket?.readyState === WebSocket.CONNECTING) return;
|
|
1058
|
+
// this.socket = new WebSocket(
|
|
1059
|
+
// 'wss://hymtqh7k82.execute-api.us-west-2.amazonaws.com/callSession'
|
|
1060
|
+
// );
|
|
1061
|
+
// this.socket.onopen = () => {
|
|
1062
|
+
// console.warn('[WS] open----------------------------------------------');
|
|
1063
|
+
// this.socket!.send(JSON.stringify(metadata));
|
|
1064
|
+
// };
|
|
1065
|
+
// this.socket.onmessage = (ev) => {
|
|
1066
|
+
// try {
|
|
1067
|
+
// this.message$.next(JSON.parse(ev.data));
|
|
1068
|
+
// } catch {
|
|
1069
|
+
// this.message$.next(ev.data);
|
|
1070
|
+
// }
|
|
1071
|
+
// };
|
|
1072
|
+
// this.socket.onerror = (ev) => {
|
|
1073
|
+
// console.error('[WS] error', ev);
|
|
1074
|
+
// };
|
|
1075
|
+
// this.socket.onclose = () => {
|
|
1076
|
+
// console.warn('[WS] closed');
|
|
1077
|
+
// this.socket = null;
|
|
1078
|
+
// };
|
|
1079
|
+
// }
|
|
1080
|
+
// send(payload: object): void {
|
|
1081
|
+
// if (this.socket?.readyState === WebSocket.OPEN) {
|
|
1082
|
+
// this.socket.send(JSON.stringify(payload));
|
|
1083
|
+
// } else {
|
|
1084
|
+
// console.warn('[WS] not open; dropping', payload);
|
|
1085
|
+
// }
|
|
1086
|
+
// }
|
|
1087
|
+
// close(): void {
|
|
1088
|
+
// this.socket?.close();
|
|
1089
|
+
// this.socket = null;
|
|
1090
|
+
// }
|
|
1091
|
+
// }
|
|
1092
|
+
class CallSocketService {
|
|
1093
|
+
sockets = new Map();
|
|
1094
|
+
subjects = new Map();
|
|
1095
|
+
open(metadata) {
|
|
1096
|
+
const { callId } = metadata;
|
|
1097
|
+
const existing = this.sockets.get(callId);
|
|
1098
|
+
if (existing && (existing.readyState === WebSocket.OPEN || existing.readyState === WebSocket.CONNECTING)) {
|
|
1099
|
+
return;
|
|
1100
|
+
}
|
|
1101
|
+
const ws = new WebSocket('wss://hymtqh7k82.execute-api.us-west-2.amazonaws.com/callSession');
|
|
1102
|
+
this.sockets.set(callId, ws);
|
|
1103
|
+
if (!this.subjects.has(callId))
|
|
1104
|
+
this.subjects.set(callId, new BehaviorSubject(null));
|
|
1105
|
+
ws.onopen = () => {
|
|
1106
|
+
console.warn('[WS Open ]', { callId });
|
|
1107
|
+
ws.send(JSON.stringify(metadata));
|
|
1108
|
+
};
|
|
1109
|
+
ws.onmessage = (ev) => {
|
|
1110
|
+
const subj = this.subjects.get(callId);
|
|
1111
|
+
if (!subj)
|
|
1112
|
+
return;
|
|
1113
|
+
try {
|
|
1114
|
+
subj.next(JSON.parse(ev.data));
|
|
1115
|
+
}
|
|
1116
|
+
catch {
|
|
1117
|
+
subj.next(ev.data);
|
|
1118
|
+
}
|
|
1119
|
+
};
|
|
1120
|
+
ws.onerror = (ev) => {
|
|
1121
|
+
console.warn('[WS Error]', { callId, ev });
|
|
1122
|
+
};
|
|
1123
|
+
ws.onclose = () => {
|
|
1124
|
+
console.warn('[WS Closed]', { callId });
|
|
1125
|
+
this.sockets.delete(callId);
|
|
1126
|
+
// keep subject around if you want late subscribers to see last value.
|
|
1127
|
+
// If you want to free it too, uncomment the next line:
|
|
1128
|
+
// this.subjects.delete(callId);
|
|
1129
|
+
};
|
|
1130
|
+
}
|
|
1131
|
+
messages$(callId) {
|
|
1132
|
+
return this.subjects.get(callId);
|
|
1133
|
+
}
|
|
1134
|
+
send(callId, payload) {
|
|
1135
|
+
const ws = this.sockets.get(callId);
|
|
1136
|
+
if (ws?.readyState === WebSocket.OPEN) {
|
|
1137
|
+
ws.send(JSON.stringify(payload));
|
|
1138
|
+
}
|
|
1139
|
+
else {
|
|
1140
|
+
console.warn('[WS NotOpen ]', { callId, dropping: payload });
|
|
1141
|
+
}
|
|
1142
|
+
}
|
|
1143
|
+
close(callId) {
|
|
1144
|
+
const ws = this.sockets.get(callId);
|
|
1145
|
+
if (ws) {
|
|
1146
|
+
ws.close();
|
|
1147
|
+
this.sockets.delete(callId);
|
|
1148
|
+
// optional: also remove the subject
|
|
1149
|
+
// this.subjects.delete(callId);
|
|
1150
|
+
}
|
|
1151
|
+
}
|
|
1152
|
+
closeAll() {
|
|
1153
|
+
for (const [callId, ws] of this.sockets.entries()) {
|
|
1154
|
+
try {
|
|
1155
|
+
ws.close();
|
|
1156
|
+
}
|
|
1157
|
+
catch { }
|
|
1158
|
+
console.warn('[WS Closed]', { callId });
|
|
1159
|
+
}
|
|
1160
|
+
this.sockets.clear();
|
|
1161
|
+
// optional: also clear subjects
|
|
1162
|
+
// this.subjects.clear();
|
|
1163
|
+
}
|
|
1164
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: CallSocketService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1165
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: CallSocketService, providedIn: 'root' });
|
|
1166
|
+
}
|
|
1167
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: CallSocketService, decorators: [{
|
|
1168
|
+
type: Injectable,
|
|
1169
|
+
args: [{ providedIn: 'root' }]
|
|
1170
|
+
}] });
|
|
1171
|
+
|
|
1172
|
+
class CallHistoryComponent {
|
|
1173
|
+
http;
|
|
1174
|
+
authenticationService;
|
|
1175
|
+
cdr;
|
|
1176
|
+
mode = 'dial';
|
|
1177
|
+
makeCallEv = new EventEmitter();
|
|
1178
|
+
transferEv = new EventEmitter();
|
|
1179
|
+
CALL_HISTORY_API_URL = 'https://ktgxyy2x2h.execute-api.us-west-2.amazonaws.com/avayaCallHistory';
|
|
1180
|
+
showHistoryLoader = false;
|
|
1181
|
+
callHistory = [];
|
|
1182
|
+
recentCallactiveTab = 'recentCall';
|
|
1183
|
+
constructor(http, authenticationService, cdr) {
|
|
1184
|
+
this.http = http;
|
|
1185
|
+
this.authenticationService = authenticationService;
|
|
1186
|
+
this.cdr = cdr;
|
|
1187
|
+
}
|
|
1188
|
+
async ngOnInit() {
|
|
1189
|
+
await this.loadCallHistory();
|
|
1190
|
+
}
|
|
1191
|
+
recentSelectTab(tab) {
|
|
1192
|
+
this.recentCallactiveTab = tab;
|
|
1193
|
+
}
|
|
1194
|
+
async loadCallHistory() {
|
|
1195
|
+
this.showHistoryLoader = true;
|
|
1196
|
+
try {
|
|
1197
|
+
// console.log('tennat id fetched ',this.authenticationService.tenant$.getValue());
|
|
1198
|
+
const tenantId = this.authenticationService.getTenantId();
|
|
1199
|
+
console.log('tennat id fetched ', tenantId);
|
|
1200
|
+
// const userId = this.authenticationService.getUserId();
|
|
1201
|
+
// console.log('tennat id fetched ',userId);
|
|
1202
|
+
const userId = '5001';
|
|
1203
|
+
const response = await this.getCallHistory(tenantId, userId);
|
|
1204
|
+
const items = response.items || [];
|
|
1205
|
+
this.callHistory = items.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
|
|
1206
|
+
console.log('Fetched call history: ', this.callHistory);
|
|
1207
|
+
}
|
|
1208
|
+
catch (error) {
|
|
1209
|
+
console.error('Failed to load call history:', error);
|
|
1210
|
+
}
|
|
1211
|
+
finally {
|
|
1212
|
+
this.showHistoryLoader = false;
|
|
1213
|
+
this.cdr.detectChanges();
|
|
1214
|
+
}
|
|
1215
|
+
}
|
|
1216
|
+
getCallHistory(tenantId, agentId) {
|
|
1217
|
+
// GET /avayaCallHistory?action=history&tenantId=xxx&agentId=yyy
|
|
1218
|
+
return lastValueFrom(this.http.get(`${this.CALL_HISTORY_API_URL}?action=history&tenantId=${tenantId}&agentId=${agentId}`));
|
|
1219
|
+
}
|
|
1220
|
+
makeCall(phoneNumber) {
|
|
1221
|
+
this.makeCallEv.emit(phoneNumber);
|
|
1222
|
+
}
|
|
1223
|
+
get callerDropped() {
|
|
1224
|
+
return this.callHistory.filter((item) => {
|
|
1225
|
+
const duration = Number(item?.duration ?? 0);
|
|
1226
|
+
return item.disconnectSide === 'CALLER' && duration <= 0;
|
|
1227
|
+
});
|
|
1228
|
+
}
|
|
1229
|
+
selectFromHistory(item) {
|
|
1230
|
+
if (this.mode === 'transfer') {
|
|
1231
|
+
this.transferEv.emit(item);
|
|
1232
|
+
return;
|
|
1233
|
+
}
|
|
1234
|
+
const dialable = this.resolveDialable(item) || (item?.phoneNumber ?? '').toString().replace(/\s+/g, '');
|
|
1235
|
+
if (!dialable) {
|
|
1236
|
+
console.warn('No dialable number found in history item:', item);
|
|
1237
|
+
return;
|
|
1238
|
+
}
|
|
1239
|
+
this.makeCallEv.emit(dialable);
|
|
1240
|
+
}
|
|
1241
|
+
resolveDialable(item) {
|
|
1242
|
+
const clean = (v) => (v ?? '').toString().replace(/\s+/g, '');
|
|
1243
|
+
return (clean(item?.resolvedDialable) ||
|
|
1244
|
+
clean(item?.lookupPhoneNumber?.['local-number']) ||
|
|
1245
|
+
clean(item?.lookupPhoneNumber?.lookupPhoneNumber?.['local-number']) ||
|
|
1246
|
+
clean(item?.lookupPhoneNumber?.normalizedPhoneNumber) ||
|
|
1247
|
+
null);
|
|
1248
|
+
}
|
|
1249
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: CallHistoryComponent, deps: [{ token: i1.HttpClient }, { token: i8.SnugdeskAuthenticationService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
1250
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: CallHistoryComponent, isStandalone: false, selector: "app-call-history", inputs: { mode: "mode" }, outputs: { makeCallEv: "makeCallEv", transferEv: "transferEv" }, ngImport: i0, template: "@if (showHistoryLoader) {\n<div class=\"history_loader\">\n <div class=\"spinner\"></div>\n <div class=\"loader_text\">Fetching call history...</div>\n</div>\n} @else {\n\n<div class=\"recent_container_outer\">\n <div class=\"recent_options_header\">\n <div class=\"recent_inner\">\n <button class=\"recent_btn\" (click)=\"recentSelectTab('recentCall')\"\n [class.active]=\"recentCallactiveTab === 'recentCall'\">\n Recent\n </button>\n <button class=\"recent_btn\" (click)=\"recentSelectTab('missedCall')\"\n [class.active]=\"recentCallactiveTab === 'missedCall'\">\n Missed Call\n </button>\n </div>\n </div>\n\n <h2 class=\"recent_heading\">Recent</h2>\n\n <div class=\"container_recent_search\">\n <input type=\"search\" placeholder=\"Type to search\" />\n </div>\n\n @if (recentCallactiveTab === 'recentCall') {\n <div class=\"recent_tab_container\">\n <div class=\"container_recent_list\">\n <div class=\"container_recent_list_inner\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n @for (call of callHistory; track $index) {\n <div class=\"outer_container_recent\">\n <div class=\"container_recent_item\">\n <!-- avatar -->\n <div class=\"container_recent_item_image\">\n <div class=\"container_recent_item_image_inner grd1\">\n {{ call.phoneNumber?.country?.code | uppercase }}\n </div>\n </div>\n\n <!-- middle -->\n <div class=\"container_recent_item_left\">\n <div class=\"container_recent_item_left_inner\">\n <div class=\"contact_field\">\n {{ call.phoneNumber?.normalizedPhoneNumber }}\n </div>\n\n <div class=\"recent_time_back\" [ngClass]=\"{\n missed_call_color: call.status === 'MISSED',\n caller_drop: call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0\n }\">\n <!-- Direction icon (generic handset) -->\n <svg viewBox=\"0 0 512 512\" width=\"12px\" 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 {{ call.direction }}\n @if (call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0) {\n <span class=\"disconnect_badge\">Caller hung up</span>\n }\n </div>\n </div>\n\n <!-- right time -->\n <div class=\"container_recent_item_right\">\n <div class=\"right_field\">\n <span class=\"right_field_content\">\n {{ call.timestamp | date : \"dd/MM/yyyy\" }}\n </span>\n </div>\n </div>\n\n <!-- call button -->\n <div class=\"calling_btn\">\n <div class=\"calling_btn_inner\">\n <!-- <button\n class=\"button_recent_call\"\n (click)=\"makeCall(call.phoneNumber?.normalizedPhoneNumber)\">\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 @if (mode === 'transfer') {\n <button class=\"button_recent_call\" (click)=\"transferEv.emit(call)\">\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)\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 <!-- /middle -->\n </div>\n </div>\n } @if (callHistory.length === 0) {\n <div class=\"container_call_history_not_found\">\n <div class=\"icon_round_area_call_history\"></div>\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 <div class=\"container_recent_list_inner\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n @for (call of callerDropped; track $index) {\n <div class=\"outer_container_recent\">\n <div class=\"container_recent_item\">\n <div class=\"container_recent_item_image\">\n <div class=\"container_recent_item_image_inner grd1\">\n {{ call.phoneNumber?.country?.code | uppercase }}\n </div>\n </div>\n <div class=\"container_recent_item_left\">\n <div class=\"container_recent_item_left_inner\">\n <div class=\"contact_field\">\n {{ call.phoneNumber?.normalizedPhoneNumber }}\n </div>\n <div class=\"recent_time_back caller_drop\">\n <svg fill=\"currentColor\" viewBox=\"0 0 640 512\" width=\"12px\">\n <path\n 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 Caller hung up\n </div>\n </div>\n <div class=\"container_recent_item_right\">\n <div class=\"right_field\">\n <span class=\"right_field_content\">\n {{ call.timestamp | date : \"dd/MM/yyyy\" }}\n </span>\n </div>\n </div>\n <div class=\"calling_btn\">\n <div class=\"calling_btn_inner\">\n <button class=\"button_recent_call\" (click)=\"selectFromHistory(call)\">\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 </div>\n </div>\n } @if (callerDropped.length === 0) {\n <div class=\"container_call_history_not_found\">\n <div class=\"icon_round_area_call_history\"></div>\n <h2>No Caller-Hangup 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</div>\n}\n", styles: [".recent_container_outer{margin:0;padding:0;width:100%;position:relative}.recent_options_header{margin:0;padding:15px 15px 10px;width:100%;text-align:center}.recent_inner{margin:0;padding:0 2px;width:100%;height:32px;background:#f0f0f4;border-radius:8px;display:flex;align-items:center;justify-content:center}.recent_btn{margin:0 1px;padding:0;width:50%;display:flex;align-items:center;justify-content:center;border:none;outline:none;background:#f0f0f4;height:26px;border-radius:8px;color:var(--sd-text-color);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.recent_btn:hover{background:#e6e6eb;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.recent_btn.active{color:var(--sd-text-color-dark);background:var(--sd-background-color);font-weight:700}.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}.container_recent_search{margin:0 0 15px;padding:0 15px;width:100%}.container_recent_search input{padding:0 16px;width:100%;outline:none;display:block;border:1px solid var(--sd-border-color-dark);color:var(--sd-text-color-medium);font-size:12px;letter-spacing:-.25px;font-family:var(--sd-text-font-family);background:var(--sd-background-color);font-style:italic;font-weight:400;position:relative;border-radius:27px;height:39px}.recent_tab_container{margin:0;padding:0;width:100%;height:100%;position:relative}.container_recent_list{width:100%;margin:0;padding:0;position:relative}.container_recent_list_inner{width:100%;position:relative;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:flex;justify-content:center;align-items:center;height:calc(100vh - 204px)}.scrollbox{height:100%;overflow-y:scroll;overflow-x:hidden;visibility:hidden;padding:0 0 7px;position:relative;scroll-behavior:smooth;scrollbar-width:thin;width:100%}.scrollbox-content,.scrollbox:hover,.scrollbox:focus{visibility:visible}.outer_container_recent{width:100%;margin:0;padding:0 15px}.container_recent_item{width:100%;position:relative;display:flex;flex-direction:row;height:72px;pointer-events:all;border-radius:8px;overflow:hidden;cursor:pointer}.calling_btn{display:none}.history_loader{width:100%;padding:28px 0;display:flex;flex-direction:column;align-items:center;gap:12px}.history_loader .spinner{width:36px;height:36px;border-radius:50%;border:4px solid #e5e7eb;border-top-color:#2563eb;animation:spin .8s linear infinite}.history_loader .loader_text{font-size:13px;color:var(--sd-text-color-medium)}@keyframes spin{to{transform:rotate(360deg)}}.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)}.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;justify-content:center;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}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i3.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i3.DatePipe, name: "date" }] });
|
|
1251
|
+
}
|
|
1252
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: CallHistoryComponent, decorators: [{
|
|
1253
|
+
type: Component,
|
|
1254
|
+
args: [{ selector: 'app-call-history', standalone: false, template: "@if (showHistoryLoader) {\n<div class=\"history_loader\">\n <div class=\"spinner\"></div>\n <div class=\"loader_text\">Fetching call history...</div>\n</div>\n} @else {\n\n<div class=\"recent_container_outer\">\n <div class=\"recent_options_header\">\n <div class=\"recent_inner\">\n <button class=\"recent_btn\" (click)=\"recentSelectTab('recentCall')\"\n [class.active]=\"recentCallactiveTab === 'recentCall'\">\n Recent\n </button>\n <button class=\"recent_btn\" (click)=\"recentSelectTab('missedCall')\"\n [class.active]=\"recentCallactiveTab === 'missedCall'\">\n Missed Call\n </button>\n </div>\n </div>\n\n <h2 class=\"recent_heading\">Recent</h2>\n\n <div class=\"container_recent_search\">\n <input type=\"search\" placeholder=\"Type to search\" />\n </div>\n\n @if (recentCallactiveTab === 'recentCall') {\n <div class=\"recent_tab_container\">\n <div class=\"container_recent_list\">\n <div class=\"container_recent_list_inner\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n @for (call of callHistory; track $index) {\n <div class=\"outer_container_recent\">\n <div class=\"container_recent_item\">\n <!-- avatar -->\n <div class=\"container_recent_item_image\">\n <div class=\"container_recent_item_image_inner grd1\">\n {{ call.phoneNumber?.country?.code | uppercase }}\n </div>\n </div>\n\n <!-- middle -->\n <div class=\"container_recent_item_left\">\n <div class=\"container_recent_item_left_inner\">\n <div class=\"contact_field\">\n {{ call.phoneNumber?.normalizedPhoneNumber }}\n </div>\n\n <div class=\"recent_time_back\" [ngClass]=\"{\n missed_call_color: call.status === 'MISSED',\n caller_drop: call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0\n }\">\n <!-- Direction icon (generic handset) -->\n <svg viewBox=\"0 0 512 512\" width=\"12px\" 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 {{ call.direction }}\n @if (call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0) {\n <span class=\"disconnect_badge\">Caller hung up</span>\n }\n </div>\n </div>\n\n <!-- right time -->\n <div class=\"container_recent_item_right\">\n <div class=\"right_field\">\n <span class=\"right_field_content\">\n {{ call.timestamp | date : \"dd/MM/yyyy\" }}\n </span>\n </div>\n </div>\n\n <!-- call button -->\n <div class=\"calling_btn\">\n <div class=\"calling_btn_inner\">\n <!-- <button\n class=\"button_recent_call\"\n (click)=\"makeCall(call.phoneNumber?.normalizedPhoneNumber)\">\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 @if (mode === 'transfer') {\n <button class=\"button_recent_call\" (click)=\"transferEv.emit(call)\">\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)\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 <!-- /middle -->\n </div>\n </div>\n } @if (callHistory.length === 0) {\n <div class=\"container_call_history_not_found\">\n <div class=\"icon_round_area_call_history\"></div>\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 <div class=\"container_recent_list_inner\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n @for (call of callerDropped; track $index) {\n <div class=\"outer_container_recent\">\n <div class=\"container_recent_item\">\n <div class=\"container_recent_item_image\">\n <div class=\"container_recent_item_image_inner grd1\">\n {{ call.phoneNumber?.country?.code | uppercase }}\n </div>\n </div>\n <div class=\"container_recent_item_left\">\n <div class=\"container_recent_item_left_inner\">\n <div class=\"contact_field\">\n {{ call.phoneNumber?.normalizedPhoneNumber }}\n </div>\n <div class=\"recent_time_back caller_drop\">\n <svg fill=\"currentColor\" viewBox=\"0 0 640 512\" width=\"12px\">\n <path\n 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 Caller hung up\n </div>\n </div>\n <div class=\"container_recent_item_right\">\n <div class=\"right_field\">\n <span class=\"right_field_content\">\n {{ call.timestamp | date : \"dd/MM/yyyy\" }}\n </span>\n </div>\n </div>\n <div class=\"calling_btn\">\n <div class=\"calling_btn_inner\">\n <button class=\"button_recent_call\" (click)=\"selectFromHistory(call)\">\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 </div>\n </div>\n } @if (callerDropped.length === 0) {\n <div class=\"container_call_history_not_found\">\n <div class=\"icon_round_area_call_history\"></div>\n <h2>No Caller-Hangup 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</div>\n}\n", styles: [".recent_container_outer{margin:0;padding:0;width:100%;position:relative}.recent_options_header{margin:0;padding:15px 15px 10px;width:100%;text-align:center}.recent_inner{margin:0;padding:0 2px;width:100%;height:32px;background:#f0f0f4;border-radius:8px;display:flex;align-items:center;justify-content:center}.recent_btn{margin:0 1px;padding:0;width:50%;display:flex;align-items:center;justify-content:center;border:none;outline:none;background:#f0f0f4;height:26px;border-radius:8px;color:var(--sd-text-color);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.recent_btn:hover{background:#e6e6eb;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.recent_btn.active{color:var(--sd-text-color-dark);background:var(--sd-background-color);font-weight:700}.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}.container_recent_search{margin:0 0 15px;padding:0 15px;width:100%}.container_recent_search input{padding:0 16px;width:100%;outline:none;display:block;border:1px solid var(--sd-border-color-dark);color:var(--sd-text-color-medium);font-size:12px;letter-spacing:-.25px;font-family:var(--sd-text-font-family);background:var(--sd-background-color);font-style:italic;font-weight:400;position:relative;border-radius:27px;height:39px}.recent_tab_container{margin:0;padding:0;width:100%;height:100%;position:relative}.container_recent_list{width:100%;margin:0;padding:0;position:relative}.container_recent_list_inner{width:100%;position:relative;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:flex;justify-content:center;align-items:center;height:calc(100vh - 204px)}.scrollbox{height:100%;overflow-y:scroll;overflow-x:hidden;visibility:hidden;padding:0 0 7px;position:relative;scroll-behavior:smooth;scrollbar-width:thin;width:100%}.scrollbox-content,.scrollbox:hover,.scrollbox:focus{visibility:visible}.outer_container_recent{width:100%;margin:0;padding:0 15px}.container_recent_item{width:100%;position:relative;display:flex;flex-direction:row;height:72px;pointer-events:all;border-radius:8px;overflow:hidden;cursor:pointer}.calling_btn{display:none}.history_loader{width:100%;padding:28px 0;display:flex;flex-direction:column;align-items:center;gap:12px}.history_loader .spinner{width:36px;height:36px;border-radius:50%;border:4px solid #e5e7eb;border-top-color:#2563eb;animation:spin .8s linear infinite}.history_loader .loader_text{font-size:13px;color:var(--sd-text-color-medium)}@keyframes spin{to{transform:rotate(360deg)}}.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)}.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;justify-content:center;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}\n"] }]
|
|
1255
|
+
}], ctorParameters: () => [{ type: i1.HttpClient }, { type: i8.SnugdeskAuthenticationService }, { type: i0.ChangeDetectorRef }], propDecorators: { mode: [{
|
|
1256
|
+
type: Input
|
|
1257
|
+
}], makeCallEv: [{
|
|
1258
|
+
type: Output
|
|
1259
|
+
}], transferEv: [{
|
|
1260
|
+
type: Output
|
|
1261
|
+
}] } });
|
|
1262
|
+
|
|
1263
|
+
class AuthenticationService {
|
|
1264
|
+
jwtHelper = new JwtHelperService();
|
|
1265
|
+
tenant$ = new BehaviorSubject(null);
|
|
1266
|
+
user$ = new BehaviorSubject(null);
|
|
1267
|
+
isAuthenticated$ = new BehaviorSubject(false);
|
|
1268
|
+
isAuthenticated() {
|
|
1269
|
+
try {
|
|
1270
|
+
const mySessionToken = this.getAuthSessionToken();
|
|
1271
|
+
// console.log(`Got sessionToken: ${sessionToken}`);
|
|
1272
|
+
if (!mySessionToken) {
|
|
1273
|
+
throw new Error('Session token not found');
|
|
1274
|
+
}
|
|
1275
|
+
else if (this.jwtHelper.isTokenExpired(mySessionToken)) {
|
|
1276
|
+
throw new Error('Session token expired');
|
|
1277
|
+
}
|
|
1278
|
+
this.isAuthenticated$.next(true);
|
|
1279
|
+
return true;
|
|
1280
|
+
}
|
|
1281
|
+
catch (err) {
|
|
1282
|
+
console.warn(err);
|
|
1283
|
+
this.isAuthenticated$.next(false);
|
|
1284
|
+
return false;
|
|
1285
|
+
}
|
|
1286
|
+
}
|
|
1287
|
+
getAuthSessionToken() {
|
|
1288
|
+
return sessionStorage.getItem('auth_sessionToken');
|
|
1289
|
+
}
|
|
1290
|
+
getAuthDomainToken() {
|
|
1291
|
+
return sessionStorage.getItem('auth_domainToken');
|
|
1292
|
+
}
|
|
1293
|
+
getDecodedAuthDomainToken() {
|
|
1294
|
+
const token = this.getAuthDomainToken();
|
|
1295
|
+
return token ? this.jwtHelper.decodeToken(token) : null;
|
|
1296
|
+
}
|
|
1297
|
+
getTenantId() {
|
|
1298
|
+
// return this.getDecodedAuthSessionToken().tenantId;
|
|
1299
|
+
return this.getDecodedAuthDomainToken()?.tenantId;
|
|
1300
|
+
}
|
|
1301
|
+
getDecodedAuthSessionToken() {
|
|
1302
|
+
if (!this.isAuthenticated()) {
|
|
1303
|
+
const err = new Error(`User not authenticated`);
|
|
1304
|
+
err.status = 403;
|
|
1305
|
+
throw err;
|
|
1306
|
+
}
|
|
1307
|
+
const token = this.getAuthSessionToken();
|
|
1308
|
+
if (!token) {
|
|
1309
|
+
const err = new Error(`Token missing`);
|
|
1310
|
+
err.status = 401;
|
|
1311
|
+
throw err;
|
|
1312
|
+
}
|
|
1313
|
+
return this.jwtHelper.decodeToken(token);
|
|
1314
|
+
}
|
|
1315
|
+
getUserId() {
|
|
1316
|
+
return this.getDecodedAuthSessionToken()?.userId;
|
|
1317
|
+
}
|
|
1318
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: AuthenticationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1319
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: AuthenticationService, providedIn: 'root' });
|
|
1320
|
+
}
|
|
1321
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: AuthenticationService, decorators: [{
|
|
1322
|
+
type: Injectable,
|
|
1323
|
+
args: [{
|
|
1324
|
+
providedIn: 'root',
|
|
1325
|
+
}]
|
|
1326
|
+
}] });
|
|
1327
|
+
|
|
1328
|
+
class DialpadComponent {
|
|
1329
|
+
cdr;
|
|
1330
|
+
formBuilder;
|
|
1331
|
+
avayaIpoService;
|
|
1332
|
+
authenticationService;
|
|
1333
|
+
contacts = [];
|
|
1334
|
+
makeCallEv = new EventEmitter();
|
|
1335
|
+
audioElement;
|
|
1336
|
+
callStateSub;
|
|
1337
|
+
dialForm;
|
|
1338
|
+
showDirectoryPhonebook = false;
|
|
1339
|
+
incomingCallSubscription;
|
|
1340
|
+
incomingCallNumber;
|
|
1341
|
+
CountryISO = CountryISO;
|
|
1342
|
+
SearchCountryField = SearchCountryField;
|
|
1343
|
+
isRinging = false;
|
|
1344
|
+
audio;
|
|
1345
|
+
constructor(cdr, formBuilder, avayaIpoService, authenticationService) {
|
|
1346
|
+
this.cdr = cdr;
|
|
1347
|
+
this.formBuilder = formBuilder;
|
|
1348
|
+
this.avayaIpoService = avayaIpoService;
|
|
1349
|
+
this.authenticationService = authenticationService;
|
|
1350
|
+
this.dialForm = this.formBuilder.group({
|
|
1351
|
+
phoneNumber: ['', Validators.required],
|
|
1352
|
+
});
|
|
1353
|
+
}
|
|
1354
|
+
ngOnInit() {
|
|
1355
|
+
window.addEventListener('keydown', this.handleKeyboardInput);
|
|
1356
|
+
const phoneUtil = PhoneNumberUtil.getInstance();
|
|
1357
|
+
this.incomingCallSubscription =
|
|
1358
|
+
this.avayaIpoService.incomingCallSubject.subscribe((data) => {
|
|
1359
|
+
try {
|
|
1360
|
+
let normalizedNumber = data.farEndNumber.trim();
|
|
1361
|
+
// Convert numbers with "00XX" to "+XX"
|
|
1362
|
+
if (normalizedNumber.startsWith('00')) {
|
|
1363
|
+
normalizedNumber = '+' + normalizedNumber.substring(2);
|
|
1364
|
+
}
|
|
1365
|
+
let parsedNumber;
|
|
1366
|
+
if (normalizedNumber.startsWith('+') ||
|
|
1367
|
+
/^\d{1,4}/.test(normalizedNumber)) {
|
|
1368
|
+
parsedNumber = phoneUtil.parse(normalizedNumber);
|
|
1369
|
+
}
|
|
1370
|
+
else {
|
|
1371
|
+
parsedNumber = phoneUtil.parse(normalizedNumber, this.authenticationService.tenant$
|
|
1372
|
+
.getValue()
|
|
1373
|
+
.contactInformation.country.code.toUpperCase());
|
|
1374
|
+
}
|
|
1375
|
+
this.incomingCallNumber = phoneUtil.format(parsedNumber, PhoneNumberFormat.INTERNATIONAL);
|
|
1376
|
+
}
|
|
1377
|
+
catch (error) {
|
|
1378
|
+
console.warn('Invalid phone number:', data.farEndNumber);
|
|
1379
|
+
this.incomingCallNumber = data.farEndNumber; // Fallback
|
|
1380
|
+
}
|
|
1381
|
+
// this.incomingCallNumber = data.farEndNumber;
|
|
1382
|
+
this.isRinging = true;
|
|
1383
|
+
this.audio = this.audioElement.nativeElement;
|
|
1384
|
+
this.audio.src = '../../../assets/sounds/ringback_tone.mp3';
|
|
1385
|
+
this.audio.loop = true;
|
|
1386
|
+
this.audio.currentTime = 0;
|
|
1387
|
+
this.audio.play();
|
|
1388
|
+
// this.playRingtone();
|
|
1389
|
+
});
|
|
1390
|
+
this.callStateSub = this.avayaIpoService.callStateSubject.subscribe((evt) => {
|
|
1391
|
+
if (evt?.state === CallState.DISCONNECTED) {
|
|
1392
|
+
this.isRinging = false;
|
|
1393
|
+
this.audio?.pause?.();
|
|
1394
|
+
this.cdr.detectChanges();
|
|
1395
|
+
}
|
|
1396
|
+
});
|
|
1397
|
+
}
|
|
1398
|
+
ngOnDestroy() {
|
|
1399
|
+
window.removeEventListener('keydown', this.handleKeyboardInput);
|
|
1400
|
+
this.callStateSub?.unsubscribe?.();
|
|
1401
|
+
}
|
|
1402
|
+
makeCall() {
|
|
1403
|
+
if (this.dialForm.invalid) {
|
|
1404
|
+
console.warn('Dial form is invalid:', this.dialForm.value);
|
|
1405
|
+
return;
|
|
1406
|
+
}
|
|
1407
|
+
const phone = this.dialForm.value.phoneNumber;
|
|
1408
|
+
console.log('phone =======', phone);
|
|
1409
|
+
this.makeCallEv.emit(phone?.internationalNumber);
|
|
1410
|
+
this.dialForm.reset();
|
|
1411
|
+
this.showDirectoryPhonebook = false;
|
|
1412
|
+
}
|
|
1413
|
+
onClear() {
|
|
1414
|
+
const control = this.dialForm.get('phoneNumber');
|
|
1415
|
+
const current = control?.value?.number?.replace(/\s/g, '') || '';
|
|
1416
|
+
if (!current)
|
|
1417
|
+
return control?.reset();
|
|
1418
|
+
const updated = current.slice(0, -1);
|
|
1419
|
+
updated ? this.updatePhoneControl(updated) : control?.reset();
|
|
1420
|
+
}
|
|
1421
|
+
handleKeyboardInput = (event) => {
|
|
1422
|
+
const control = this.dialForm.get('phoneNumber');
|
|
1423
|
+
const current = control?.value?.number?.replace(/\s/g, '') || '';
|
|
1424
|
+
let updated = current;
|
|
1425
|
+
if (event.key === 'Enter') {
|
|
1426
|
+
this.makeCall();
|
|
1427
|
+
return;
|
|
1428
|
+
}
|
|
1429
|
+
else if (event.key === 'Backspace') {
|
|
1430
|
+
if (!current)
|
|
1431
|
+
return control?.reset();
|
|
1432
|
+
updated = current.slice(0, -1);
|
|
1433
|
+
}
|
|
1434
|
+
else if (/^[0-9]$/.test(event.key)) {
|
|
1435
|
+
updated += event.key;
|
|
1436
|
+
}
|
|
1437
|
+
else {
|
|
1438
|
+
return;
|
|
1439
|
+
}
|
|
1440
|
+
updated ? this.updatePhoneControl(updated) : control?.reset();
|
|
1441
|
+
};
|
|
1442
|
+
handleKeypadInput(digit) {
|
|
1443
|
+
const control = this.dialForm.get('phoneNumber');
|
|
1444
|
+
const current = control?.value?.number?.replace(/\s/g, '') || '';
|
|
1445
|
+
this.updatePhoneControl(current + digit);
|
|
1446
|
+
}
|
|
1447
|
+
updatePhoneControl(value) {
|
|
1448
|
+
setTimeout(() => {
|
|
1449
|
+
this.dialForm.get('phoneNumber')?.setValue(value);
|
|
1450
|
+
this.cdr.detectChanges();
|
|
1451
|
+
});
|
|
1452
|
+
}
|
|
1453
|
+
declineAvayaCall() {
|
|
1454
|
+
this.avayaIpoService.dropCall();
|
|
1455
|
+
this.isRinging = false;
|
|
1456
|
+
this.audio?.pause?.();
|
|
1457
|
+
this.avayaIpoService.agentIdle();
|
|
1458
|
+
this.cdr.detectChanges();
|
|
1459
|
+
}
|
|
1460
|
+
acceptAvayaCAll() {
|
|
1461
|
+
this.avayaIpoService.answerCall();
|
|
1462
|
+
// this.headerComponent.showAvayaIpo = true;
|
|
1463
|
+
this.isRinging = false;
|
|
1464
|
+
this.audio.pause();
|
|
1465
|
+
}
|
|
1466
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: DialpadComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1$1.FormBuilder }, { token: AvayaIPOService }, { token: AuthenticationService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1467
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: DialpadComponent, isStandalone: false, selector: "app-dialpad", inputs: { contacts: "contacts" }, outputs: { makeCallEv: "makeCallEv" }, viewQueries: [{ propertyName: "audioElement", first: true, predicate: ["audioElement"], descendants: true }], ngImport: i0, template: "<div class=\"container_pd_sd\">\n <audio id=\"sd_call_ring\" #audioElement></audio>\n\n @if (isRinging) {\n <div class=\"incoming_wrapper\">\n <div class=\"incoming_strip slide-right\">\n <div class=\"incoming_avatar\">\n <img\n src=\"../../../assets/images/incomingCall_avatar.gif\"\n alt=\"Incoming call avatar\"\n />\n </div>\n <div class=\"incoming_details\">\n <div class=\"incoming_label\">Incoming call</div>\n <div class=\"incoming_number\">\n {{ incomingCallNumber || 'Unknown number' }}\n </div>\n <div class=\"incoming_subtext\">Web call is ringing</div>\n </div>\n <div class=\"call_action_buttons incoming_actions\">\n <button\n type=\"button\"\n class=\"call_action_button decline\"\n (click)=\"declineAvayaCall()\"\n >\n <span class=\"icon_pill\">\n <svg height=\"18\" viewBox=\"0 0 640 512\">\n <path\n class=\"icon_color\"\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 <span class=\"label\">Decline</span>\n </button>\n <button\n type=\"button\"\n class=\"call_action_button accept\"\n (click)=\"acceptAvayaCAll()\"\n >\n <span class=\"icon_pill\">\n <svg height=\"18\" viewBox=\"0 0 512 512\">\n <path\n class=\"icon_color\"\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 <span class=\"label\">Answer</span>\n </button>\n </div>\n </div>\n </div>\n } @else {\n <div\n class=\"container_phone_number_input\"\n [formGroup]=\"dialForm\"\n (ngSubmit)=\"makeCall()\"\n >\n @if (contacts?.length > 0) {\n <button\n class=\"button_phonebook\"\n (click)=\"showDirectoryPhonebook = !showDirectoryPhonebook\"\n >\n <svg\n fill=\"currentColor\"\n height=\"22px\"\n style=\"enable-background: new 0 0 611.985 611.986\"\n version=\"1.1\"\n viewBox=\"0 0 611.985 611.986\"\n width=\"40.985px\"\n routerLinkActive=\"active\"\n xml:space=\"preserve\"\n >\n <g>\n <path\n d=\"M143.021,158.99c42.525,0,79.456-36.931,79.456-79.456S185.546,0.078,143.021,0.078\n S63.565,37.009,63.565,79.534S100.496,158.99,143.021,158.99z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M278.097,381.467c0-127.13-65.98-190.695-139.048-190.695S0,254.338,0,381.467\n C0,468.583,278.097,468.583,278.097,381.467z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M373.444,220.807c42.525,0,79.456-36.931,79.456-79.456s-36.931-79.456-79.456-79.456\n s-79.456,36.931-79.456,79.456S330.919,220.807,373.444,220.807z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M369.471,252.59c-21.962,0-43.033,6.452-62.071,17.957c11.537,31.051,18.37,67.792,18.37,110.921\n c0,42.843-28.541,76.151-77.517,95.22c60.768,51.424,260.267,40.459,260.267-33.403\n C508.52,316.155,442.539,252.59,369.471,252.59z\"\n fill=\"currentColor\"\n />\n </g>\n </svg>\n </button>\n }\n\n\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)=\"handleKeyboardInput($event)\"\n >\n </ngx-intl-tel-input>\n <!-- <input type=\"text\" class=\"phone_number_sd\"> -->\n <button class=\"button_backspace\" (click)=\"onClear()\"></button>\n </div>\n }\n</div>\n\n@if (!isRinging && showDirectoryPhonebook) {\n <div class=\"container_phonebook\">\n <div class=\"container_phonebook_inner\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n @for (contact of contacts; track contact.id ?? contact.phone ?? $index) {\n <div class=\"container_contact_item\">\n <div class=\"container_contact_item_image\">\n <div class=\"container_contact_item_image_inner\">\n <svg\n viewBox=\"0 0 212 212\"\n height=\"49px\"\n width=\"49px\"\n version=\"1.1\"\n x=\"0px\"\n y=\"0px\"\n enable-background=\"new 0 0 212 212\"\n >\n <path\n fill=\"#DFE5E7\"\n d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\"\n ></path>\n <g>\n <path\n fill=\"#FFFFFF\"\n d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 c-0.964-1.144-2.024-2.326-3.184-3.527c-1.741-1.802-3.71-3.646-5.924-5.47c-2.952-2.431-6.339-4.824-10.204-7.026 c-1.877-1.07-3.873-2.092-5.98-3.055c-0.062-0.028-0.118-0.059-0.18-0.087c-9.792-4.44-22.106-7.529-37.416-7.529 s-27.624,3.089-37.416,7.529c-0.338,0.153-0.653,0.318-0.985,0.474c-1.431,0.674-2.806,1.376-4.128,2.101 c-0.716,0.393-1.417,0.792-2.101,1.197c-3.421,2.027-6.475,4.191-9.15,6.395c-2.213,1.823-4.182,3.668-5.924,5.47 c-1.161,1.201-2.22,2.384-3.184,3.527c-0.964,1.144-1.832,2.25-2.609,3.299c-0.778,1.049-1.464,2.04-2.065,2.955 c-0.557,0.848-1.033,1.622-1.447,2.324c-0.033,0.056-0.073,0.119-0.104,0.174c-0.435,0.744-0.79,1.392-1.07,1.926 c-0.559,1.068-0.818,1.678-0.818,1.678v0.398c18.285,17.927,43.322,28.985,70.945,28.985c27.678,0,52.761-11.103,71.055-29.095 v-0.289c0,0-0.619-1.45-1.992-3.778C174.594,173.238,174.117,172.463,173.561,171.615z\"\n ></path>\n <path\n fill=\"#FFFFFF\"\n d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 c1.772-0.532,3.482-1.188,5.12-1.958c2.184-1.027,4.242-2.258,6.15-3.67c2.863-2.119,5.39-4.646,7.509-7.509 c0.706-0.954,1.367-1.945,1.98-2.971c0.919-1.539,1.729-3.155,2.422-4.84c0.462-1.123,0.872-2.277,1.226-3.458 c0.177-0.591,0.341-1.188,0.49-1.792c0.299-1.208,0.542-2.443,0.725-3.701c0.275-1.887,0.417-3.827,0.417-5.811 c0-1.984-0.142-3.925-0.417-5.811c-0.184-1.258-0.426-2.493-0.725-3.701c-0.15-0.604-0.313-1.202-0.49-1.793 c-0.354-1.181-0.764-2.335-1.226-3.458c-0.693-1.685-1.504-3.301-2.422-4.84c-0.613-1.026-1.274-2.017-1.98-2.971 c-2.119-2.863-4.646-5.39-7.509-7.509c-1.909-1.412-3.966-2.643-6.15-3.67c-1.638-0.77-3.348-1.426-5.12-1.958 c-1.181-0.355-2.39-0.655-3.624-0.896c-2.468-0.484-5.035-0.737-7.68-0.737c-21.162,0-37.345,16.183-37.345,37.345 C68.657,109.317,84.84,125.5,106.002,125.5z\"\n ></path>\n </g>\n </svg>\n </div>\n </div>\n\n <div class=\"container_contact_item_left\">\n <div class=\"container_contact_item_left_inner\">\n <div class=\"contact_field\">{{ contact.name }}</div>\n <div class=\"contact_field\">{{ contact.phone }}</div>\n </div>\n </div>\n\n <div class=\"container_contact_item_right\">\n <div class=\"right_field right_field_highlighted\">\n <span class=\"right_field_content\">\n <div class=\"container_rating\">\n @for (star of [1,2,3,4,5]; track star) {\n <span [class.filled]=\"star <= (contact.rating || 0)\">\u2605</span>\n }\n </div>\n </span>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n}\n\n@if (!isRinging) {\n <div class=\"container_dialpad\">\n <div class=\"container_dialpad_content\">\n <div class=\"container_dialpad_digits\">\n <!-- <div class=\"active-calls-container\"></div> -->\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('1')\">\n 1\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('2')\">\n 2\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('3')\">\n 3\n </button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('4')\">\n 4\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('5')\">\n 5\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('6')\">\n 6\n </button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('7')\">\n 7\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('8')\">\n 8\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('9')\">\n 9\n </button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('*')\">\n <svg viewBox=\"0 0 512 512\" height=\"17px\">\n <path\n fill=\"currentColor\"\n d=\"M208 32c0-17.7 14.3-32 32-32l32 0c17.7 0 32 14.3 32 32l0 140.9 122-70.4c15.3-8.8 34.9-3.6 43.7 11.7l16 27.7c8.8 15.3 3.6 34.9-11.7 43.7L352 256l122 70.4c15.3 8.8 20.6 28.4 11.7 43.7l-16 27.7c-8.8 15.3-28.4 20.6-43.7 11.7L304 339.1 304 480c0 17.7-14.3 32-32 32l-32 0c-17.7 0-32-14.3-32-32l0-140.9L86 409.6c-15.3 8.8-34.9 3.6-43.7-11.7l-16-27.7c-8.8-15.3-3.6-34.9 11.7-43.7L160 256 38 185.6c-15.3-8.8-20.5-28.4-11.7-43.7l16-27.7C51.1 98.8 70.7 93.6 86 102.4l122 70.4L208 32z\"\n />\n </svg>\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('0')\">\n 0\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('#')\">\n <svg height=\"19px\" viewBox=\"0 0 448 512\">\n <path\n fill=\"currentColor\"\n d=\"M181.3 32.4c17.4 2.9 29.2 19.4 26.3 36.8L197.8 128l95.1 0 11.5-69.3c2.9-17.4 19.4-29.2 36.8-26.3s29.2 19.4 26.3 36.8L357.8 128l58.2 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-68.9 0L325.8 320l58.2 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-68.9 0-11.5 69.3c-2.9 17.4-19.4 29.2-36.8 26.3s-29.2-19.4-26.3-36.8l9.8-58.7-95.1 0-11.5 69.3c-2.9 17.4-19.4 29.2-36.8 26.3s-29.2-19.4-26.3-36.8L90.2 384 32 384c-17.7 0-32-14.3-32-32s14.3-32 32-32l68.9 0 21.3-128L64 192c-17.7 0-32-14.3-32-32s14.3-32 32-32l68.9 0 11.5-69.3c2.9-17.4 19.4-29.2 36.8-26.3zM187.1 192L165.8 320l95.1 0 21.3-128-95.1 0z\"\n />\n </svg>\n </button>\n </div>\n </div>\n <div class=\"container_dialpad_buttons\">\n <div class=\"container_dialpad_row\">\n <button\n class=\"button_dialpad_digit button_call_green\"\n (click)=\"makeCall()\"\n [disabled]=\"!this.dialForm.valid\"\n [ngClass]=\"{ button_call_disabled: !this.dialForm.valid }\"\n >\n <svg viewBox=\"0 0 512 512\" height=\"18px\">\n <path\n 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 />\n </svg>\n </button>\n </div>\n </div>\n </div>\n </div>\n}\n", styles: [".container_pd_sd{width:100%;padding:0 30px;margin:0}.container_dialpad{width:100%;margin:0 auto;padding:32px 0;position:relative;background:var(--sd-background-color);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:flex;justify-content:center;align-items:center}.container_dialpad_header{width:100%;font-family:var(--sd-text-font-family);font-size:13px;font-weight:600;color:var(--sd-text-color);z-index:99;background:var(--sd-background-color)}.container_dialpad_header_inner1{margin:0;width:100%;padding:0 15px;position:relative}.container_dialpad_header_inner2{width:100%;margin:0;padding:15px;background:#f7f7f7;background:linear-gradient(180deg,#f7f7f7 72%,#fff);border-radius:12px 12px 0 0;position:relative}.container_phone_number_input{width:100%;margin:0;padding:0;position:relative}.container_phone_number_input .phone_number_sd{width:100%;display:flex;height:48px;outline:none;text-align:center;align-items:center;border:1px solid var(--sd-border-color-light);border-radius:27px;font-size:20px;font-weight:400;color:#000;padding:0 50px}.container_phone_number_input .button_phonebook{position:absolute;width:38px;height:38px;background:var(--sd-background-color);-webkit-transition-duration:.3s;transition-duration:.3s;border-radius:50%;border:none;outline:none;display:flex;align-items:center;justify-content:center;top:5px;left:8px;color:#a6a6a6}.container_phone_number_input .button_phonebook:hover,.container_phone_number_input .button_phonebook .sec_button{background:#f0f0f0;color:#29abe0}.container_phone_number_input .button_backspace{width:48px;height:48px;display:block;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAANCAYAAABCZ/VdAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQFJREFUeNqsVEEOgjAQ3JLe4QGQ+ANNIIGbPsEf4BP0JT5BjvwCT0AIB/0D3OEMCe42lpSKB2M3mWS6tJPp7lKWpilocUBkYCC4tt4xxjLLsoDwTwzDsBB3EDcUB8I0TUad31F0a0pYFU9IGEV75La+yfM88H1f8LquoWkawV3XhTAMBS/LEtq2XZyjwp5ROCbHWGebXOsgYc65QBAEc56EZRmjKFqckc6vRH4pxbe9ep6cX9bcqqiqCsZxFCAu80VRzDzP8w/n7D3nCSJGdPjBMdFMKpVs6AmxQeG9qUkRPVTWR0w8KWkqVPGOboDivWzOP1j7/R90AxxJI2/LS4ABAIzGydRITZTLAAAAAElFTkSuQmCC) center no-repeat;position:absolute;right:0;top:0;outline:none;border:none}.container_phonebook{position:absolute;width:100%;left:0;right:0;top:149px;background:var(--sd-background-color);height:386px;overflow:hidden}.container_phonebook_inner{width:100%;position:relative;height:100%;padding:0}.scrollbox{height:100%;overflow-y:scroll;overflow-x:hidden;visibility:hidden;padding:0 0 7px;position:relative;scroll-behavior:smooth;scrollbar-width:thin;width:100%}.scrollbox-content,.scrollbox:hover,.scrollbox:focus{visibility:visible}.container_contact_item{width:100%;position:relative;display:flex;flex-direction:row;align-items:center;padding:10px;border:1px solid var(--sd-border-color-light);border-radius:8px;overflow:hidden;margin-bottom:10px;cursor:pointer}.container_contact_item_image{display:flex}.container_contact_item_image_inner{margin:0 auto;padding:0;width:50px;height:50px;position:relative}.container_contact_item_left{display:flex;flex-basis:auto;flex-direction:column;flex-grow:1}.container_contact_item_left_inner{display:flex;flex-basis:1;flex-direction:column;padding:0 0 0 10px}.container_contact_item_left .contact_field{font-size:13px;margin-bottom:2px}.contact_dark{color:var(--sd-text-color-dark)}.contact_gray{color:var(--sd-text-color-medium)}.container_contact_item_left .contact_field_grey{font-size:12px;color:var(--sd-text-color);padding-top:2px;display:flex}.container_contact_item_left .contact_field_green{font-size:13px;margin-bottom:2px;color:#6c0}.container_contact_item_left .contact_field_highlighted{display:flex;font-size:11px;color:var(--sd-text-color-medium)}.container_contact_item_left .contact_field_highlighted span{background:#6c0;border-radius:3px;text-transform:uppercase;color:var(--sd-text-color-inverse);font-size:9px;padding:2px 4px}.container_contact_item_right{display:flex;flex-direction:row}.container_contact_item_right .right_field{display:flex;flex-basis:auto;justify-content:right}.container_contact_item_right .right_field_highlighted{font-size:16px;color:#29abe0}.container_contact_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)}.container_contact_item_right .right_recent_content{display:inline-block;padding:0;font-size:11px;color:var(--sd-text-color)}.container_contact_item_right .container_rating{font-size:11px;cursor:pointer}.container_contact_item_right .container_rating span{color:gray;transition:color .3s}.container_contact_item_right .container_rating span.filled{color:gold}.container_dialpad_content{width:100%;font-family:var(--sd-text-font-family);font-size:13px;font-weight:600;color:var(--sd-text-color);padding:21px 0 15px;display:flex;flex-basis:auto;flex-direction:column;align-items:center;justify-content:center}.container_dialpad_digits{width:100%;display:flex;justify-content:center;margin-bottom:10px;flex-direction:column}.container_dialpad_row{display:flex;column-gap:10px;flex-direction:row;flex-shrink:0;justify-content:center;margin-bottom:10px}.button_dialpad_digit{display:block;width:50px;height:50px;display:flex;column-gap:20px;margin:0 10px;align-items:center;justify-content:center;line-height:normal;border-radius:50%;outline:none;border:none;font-size:22px;font-weight:700;color:var(--sd-text-color-dark);background:var(--sd-background-color);-webkit-transition-duration:.3s;transition-duration:.3s;box-shadow:#0000001a 0 0 5px,#0000001a 0 0 1px;border:1px solid #ebebeb}.button_dialpad_digit:hover{background:#000;color:var(--sd-text-color-inverse)}.button_call_green{background:#6c0;color:var(--sd-text-color-inverse);width:60px;height:60px;-webkit-transition-duration:.3s;transition-duration:.3s}.button_call_green:hover{background:#5ab400;color:var(--sd-text-color-inverse);width:60px;height:60px}.button_call_red{background:#e0261f;color:var(--sd-text-color-inverse);width:60px;height:60px;-webkit-transition-duration:.3s;transition-duration:.3s;z-index:9999}.button_call_red:hover{background:#cf211a}.button_call_disabled{background:#eee;color:var(--sd-text-color-light);width:60px;height:60px;-webkit-transition-duration:.3s;transition-duration:.3s}.container_dialpad_buttons{width:100%;display:flex;justify-content:center;padding-top:0;margin-bottom:6px}.call_action_buttons{display:flex;gap:14px;align-items:center;justify-content:center;margin-left:auto}.call_action_button{display:inline-flex;align-items:center;gap:10px;padding:12px 18px;border-radius:999px;border:none;color:#fff;font-weight:600;letter-spacing:.2px;cursor:pointer;box-shadow:0 8px 20px #00000029;transition:transform .2s ease,box-shadow .2s ease,filter .2s ease}.call_action_button .icon_pill{width:42px;height:42px;display:grid;place-items:center;border-radius:50%;background:#ffffff29}.call_action_button.accept{background:linear-gradient(135deg,#2bb673,#0fa958)}.call_action_button.decline{background:linear-gradient(135deg,#f45c43,#c81d1d)}.call_action_button:hover{transform:translateY(-1px);box-shadow:0 10px 24px #0003;filter:saturate(1.05)}.call_action_button:active{transform:translateY(0);box-shadow:0 6px 16px #00000029}.incoming_wrapper{width:100%;display:flex;justify-content:center;padding:8px 0 6px}.incoming_strip{display:flex;flex-direction:column;align-items:center;gap:14px;width:100%}.incoming_avatar{position:relative;width:72px;height:72px;border-radius:50%;overflow:hidden}.incoming_avatar img{width:100%;height:100%;object-fit:cover;display:block;border-radius:50%}.incoming_details{display:flex;flex-direction:column;align-items:center;gap:4px}.incoming_label{font-size:12px;text-transform:uppercase;letter-spacing:.4px;color:#6b7280}.incoming_number{font-size:20px;font-weight:700;letter-spacing:.1px;color:var(--sd-text-color-dark)}.incoming_subtext{color:#6b7280;font-size:13px}.incoming_actions{margin-left:0;margin-top:6px}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.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: i5.NativeElementInjectorDirective, selector: "[ngModel], [formControl], [formControlName]" }] });
|
|
1468
|
+
}
|
|
1469
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: DialpadComponent, decorators: [{
|
|
1470
|
+
type: Component,
|
|
1471
|
+
args: [{ selector: 'app-dialpad', standalone: false, template: "<div class=\"container_pd_sd\">\n <audio id=\"sd_call_ring\" #audioElement></audio>\n\n @if (isRinging) {\n <div class=\"incoming_wrapper\">\n <div class=\"incoming_strip slide-right\">\n <div class=\"incoming_avatar\">\n <img\n src=\"../../../assets/images/incomingCall_avatar.gif\"\n alt=\"Incoming call avatar\"\n />\n </div>\n <div class=\"incoming_details\">\n <div class=\"incoming_label\">Incoming call</div>\n <div class=\"incoming_number\">\n {{ incomingCallNumber || 'Unknown number' }}\n </div>\n <div class=\"incoming_subtext\">Web call is ringing</div>\n </div>\n <div class=\"call_action_buttons incoming_actions\">\n <button\n type=\"button\"\n class=\"call_action_button decline\"\n (click)=\"declineAvayaCall()\"\n >\n <span class=\"icon_pill\">\n <svg height=\"18\" viewBox=\"0 0 640 512\">\n <path\n class=\"icon_color\"\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 <span class=\"label\">Decline</span>\n </button>\n <button\n type=\"button\"\n class=\"call_action_button accept\"\n (click)=\"acceptAvayaCAll()\"\n >\n <span class=\"icon_pill\">\n <svg height=\"18\" viewBox=\"0 0 512 512\">\n <path\n class=\"icon_color\"\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 <span class=\"label\">Answer</span>\n </button>\n </div>\n </div>\n </div>\n } @else {\n <div\n class=\"container_phone_number_input\"\n [formGroup]=\"dialForm\"\n (ngSubmit)=\"makeCall()\"\n >\n @if (contacts?.length > 0) {\n <button\n class=\"button_phonebook\"\n (click)=\"showDirectoryPhonebook = !showDirectoryPhonebook\"\n >\n <svg\n fill=\"currentColor\"\n height=\"22px\"\n style=\"enable-background: new 0 0 611.985 611.986\"\n version=\"1.1\"\n viewBox=\"0 0 611.985 611.986\"\n width=\"40.985px\"\n routerLinkActive=\"active\"\n xml:space=\"preserve\"\n >\n <g>\n <path\n d=\"M143.021,158.99c42.525,0,79.456-36.931,79.456-79.456S185.546,0.078,143.021,0.078\n S63.565,37.009,63.565,79.534S100.496,158.99,143.021,158.99z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M278.097,381.467c0-127.13-65.98-190.695-139.048-190.695S0,254.338,0,381.467\n C0,468.583,278.097,468.583,278.097,381.467z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M373.444,220.807c42.525,0,79.456-36.931,79.456-79.456s-36.931-79.456-79.456-79.456\n s-79.456,36.931-79.456,79.456S330.919,220.807,373.444,220.807z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M369.471,252.59c-21.962,0-43.033,6.452-62.071,17.957c11.537,31.051,18.37,67.792,18.37,110.921\n c0,42.843-28.541,76.151-77.517,95.22c60.768,51.424,260.267,40.459,260.267-33.403\n C508.52,316.155,442.539,252.59,369.471,252.59z\"\n fill=\"currentColor\"\n />\n </g>\n </svg>\n </button>\n }\n\n\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)=\"handleKeyboardInput($event)\"\n >\n </ngx-intl-tel-input>\n <!-- <input type=\"text\" class=\"phone_number_sd\"> -->\n <button class=\"button_backspace\" (click)=\"onClear()\"></button>\n </div>\n }\n</div>\n\n@if (!isRinging && showDirectoryPhonebook) {\n <div class=\"container_phonebook\">\n <div class=\"container_phonebook_inner\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n @for (contact of contacts; track contact.id ?? contact.phone ?? $index) {\n <div class=\"container_contact_item\">\n <div class=\"container_contact_item_image\">\n <div class=\"container_contact_item_image_inner\">\n <svg\n viewBox=\"0 0 212 212\"\n height=\"49px\"\n width=\"49px\"\n version=\"1.1\"\n x=\"0px\"\n y=\"0px\"\n enable-background=\"new 0 0 212 212\"\n >\n <path\n fill=\"#DFE5E7\"\n d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\"\n ></path>\n <g>\n <path\n fill=\"#FFFFFF\"\n d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 c-0.964-1.144-2.024-2.326-3.184-3.527c-1.741-1.802-3.71-3.646-5.924-5.47c-2.952-2.431-6.339-4.824-10.204-7.026 c-1.877-1.07-3.873-2.092-5.98-3.055c-0.062-0.028-0.118-0.059-0.18-0.087c-9.792-4.44-22.106-7.529-37.416-7.529 s-27.624,3.089-37.416,7.529c-0.338,0.153-0.653,0.318-0.985,0.474c-1.431,0.674-2.806,1.376-4.128,2.101 c-0.716,0.393-1.417,0.792-2.101,1.197c-3.421,2.027-6.475,4.191-9.15,6.395c-2.213,1.823-4.182,3.668-5.924,5.47 c-1.161,1.201-2.22,2.384-3.184,3.527c-0.964,1.144-1.832,2.25-2.609,3.299c-0.778,1.049-1.464,2.04-2.065,2.955 c-0.557,0.848-1.033,1.622-1.447,2.324c-0.033,0.056-0.073,0.119-0.104,0.174c-0.435,0.744-0.79,1.392-1.07,1.926 c-0.559,1.068-0.818,1.678-0.818,1.678v0.398c18.285,17.927,43.322,28.985,70.945,28.985c27.678,0,52.761-11.103,71.055-29.095 v-0.289c0,0-0.619-1.45-1.992-3.778C174.594,173.238,174.117,172.463,173.561,171.615z\"\n ></path>\n <path\n fill=\"#FFFFFF\"\n d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 c1.772-0.532,3.482-1.188,5.12-1.958c2.184-1.027,4.242-2.258,6.15-3.67c2.863-2.119,5.39-4.646,7.509-7.509 c0.706-0.954,1.367-1.945,1.98-2.971c0.919-1.539,1.729-3.155,2.422-4.84c0.462-1.123,0.872-2.277,1.226-3.458 c0.177-0.591,0.341-1.188,0.49-1.792c0.299-1.208,0.542-2.443,0.725-3.701c0.275-1.887,0.417-3.827,0.417-5.811 c0-1.984-0.142-3.925-0.417-5.811c-0.184-1.258-0.426-2.493-0.725-3.701c-0.15-0.604-0.313-1.202-0.49-1.793 c-0.354-1.181-0.764-2.335-1.226-3.458c-0.693-1.685-1.504-3.301-2.422-4.84c-0.613-1.026-1.274-2.017-1.98-2.971 c-2.119-2.863-4.646-5.39-7.509-7.509c-1.909-1.412-3.966-2.643-6.15-3.67c-1.638-0.77-3.348-1.426-5.12-1.958 c-1.181-0.355-2.39-0.655-3.624-0.896c-2.468-0.484-5.035-0.737-7.68-0.737c-21.162,0-37.345,16.183-37.345,37.345 C68.657,109.317,84.84,125.5,106.002,125.5z\"\n ></path>\n </g>\n </svg>\n </div>\n </div>\n\n <div class=\"container_contact_item_left\">\n <div class=\"container_contact_item_left_inner\">\n <div class=\"contact_field\">{{ contact.name }}</div>\n <div class=\"contact_field\">{{ contact.phone }}</div>\n </div>\n </div>\n\n <div class=\"container_contact_item_right\">\n <div class=\"right_field right_field_highlighted\">\n <span class=\"right_field_content\">\n <div class=\"container_rating\">\n @for (star of [1,2,3,4,5]; track star) {\n <span [class.filled]=\"star <= (contact.rating || 0)\">\u2605</span>\n }\n </div>\n </span>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n}\n\n@if (!isRinging) {\n <div class=\"container_dialpad\">\n <div class=\"container_dialpad_content\">\n <div class=\"container_dialpad_digits\">\n <!-- <div class=\"active-calls-container\"></div> -->\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('1')\">\n 1\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('2')\">\n 2\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('3')\">\n 3\n </button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('4')\">\n 4\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('5')\">\n 5\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('6')\">\n 6\n </button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('7')\">\n 7\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('8')\">\n 8\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('9')\">\n 9\n </button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('*')\">\n <svg viewBox=\"0 0 512 512\" height=\"17px\">\n <path\n fill=\"currentColor\"\n d=\"M208 32c0-17.7 14.3-32 32-32l32 0c17.7 0 32 14.3 32 32l0 140.9 122-70.4c15.3-8.8 34.9-3.6 43.7 11.7l16 27.7c8.8 15.3 3.6 34.9-11.7 43.7L352 256l122 70.4c15.3 8.8 20.6 28.4 11.7 43.7l-16 27.7c-8.8 15.3-28.4 20.6-43.7 11.7L304 339.1 304 480c0 17.7-14.3 32-32 32l-32 0c-17.7 0-32-14.3-32-32l0-140.9L86 409.6c-15.3 8.8-34.9 3.6-43.7-11.7l-16-27.7c-8.8-15.3-3.6-34.9 11.7-43.7L160 256 38 185.6c-15.3-8.8-20.5-28.4-11.7-43.7l16-27.7C51.1 98.8 70.7 93.6 86 102.4l122 70.4L208 32z\"\n />\n </svg>\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('0')\">\n 0\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('#')\">\n <svg height=\"19px\" viewBox=\"0 0 448 512\">\n <path\n fill=\"currentColor\"\n d=\"M181.3 32.4c17.4 2.9 29.2 19.4 26.3 36.8L197.8 128l95.1 0 11.5-69.3c2.9-17.4 19.4-29.2 36.8-26.3s29.2 19.4 26.3 36.8L357.8 128l58.2 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-68.9 0L325.8 320l58.2 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-68.9 0-11.5 69.3c-2.9 17.4-19.4 29.2-36.8 26.3s-29.2-19.4-26.3-36.8l9.8-58.7-95.1 0-11.5 69.3c-2.9 17.4-19.4 29.2-36.8 26.3s-29.2-19.4-26.3-36.8L90.2 384 32 384c-17.7 0-32-14.3-32-32s14.3-32 32-32l68.9 0 21.3-128L64 192c-17.7 0-32-14.3-32-32s14.3-32 32-32l68.9 0 11.5-69.3c2.9-17.4 19.4-29.2 36.8-26.3zM187.1 192L165.8 320l95.1 0 21.3-128-95.1 0z\"\n />\n </svg>\n </button>\n </div>\n </div>\n <div class=\"container_dialpad_buttons\">\n <div class=\"container_dialpad_row\">\n <button\n class=\"button_dialpad_digit button_call_green\"\n (click)=\"makeCall()\"\n [disabled]=\"!this.dialForm.valid\"\n [ngClass]=\"{ button_call_disabled: !this.dialForm.valid }\"\n >\n <svg viewBox=\"0 0 512 512\" height=\"18px\">\n <path\n 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 />\n </svg>\n </button>\n </div>\n </div>\n </div>\n </div>\n}\n", styles: [".container_pd_sd{width:100%;padding:0 30px;margin:0}.container_dialpad{width:100%;margin:0 auto;padding:32px 0;position:relative;background:var(--sd-background-color);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:flex;justify-content:center;align-items:center}.container_dialpad_header{width:100%;font-family:var(--sd-text-font-family);font-size:13px;font-weight:600;color:var(--sd-text-color);z-index:99;background:var(--sd-background-color)}.container_dialpad_header_inner1{margin:0;width:100%;padding:0 15px;position:relative}.container_dialpad_header_inner2{width:100%;margin:0;padding:15px;background:#f7f7f7;background:linear-gradient(180deg,#f7f7f7 72%,#fff);border-radius:12px 12px 0 0;position:relative}.container_phone_number_input{width:100%;margin:0;padding:0;position:relative}.container_phone_number_input .phone_number_sd{width:100%;display:flex;height:48px;outline:none;text-align:center;align-items:center;border:1px solid var(--sd-border-color-light);border-radius:27px;font-size:20px;font-weight:400;color:#000;padding:0 50px}.container_phone_number_input .button_phonebook{position:absolute;width:38px;height:38px;background:var(--sd-background-color);-webkit-transition-duration:.3s;transition-duration:.3s;border-radius:50%;border:none;outline:none;display:flex;align-items:center;justify-content:center;top:5px;left:8px;color:#a6a6a6}.container_phone_number_input .button_phonebook:hover,.container_phone_number_input .button_phonebook .sec_button{background:#f0f0f0;color:#29abe0}.container_phone_number_input .button_backspace{width:48px;height:48px;display:block;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAANCAYAAABCZ/VdAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQFJREFUeNqsVEEOgjAQ3JLe4QGQ+ANNIIGbPsEf4BP0JT5BjvwCT0AIB/0D3OEMCe42lpSKB2M3mWS6tJPp7lKWpilocUBkYCC4tt4xxjLLsoDwTwzDsBB3EDcUB8I0TUad31F0a0pYFU9IGEV75La+yfM88H1f8LquoWkawV3XhTAMBS/LEtq2XZyjwp5ROCbHWGebXOsgYc65QBAEc56EZRmjKFqckc6vRH4pxbe9ep6cX9bcqqiqCsZxFCAu80VRzDzP8w/n7D3nCSJGdPjBMdFMKpVs6AmxQeG9qUkRPVTWR0w8KWkqVPGOboDivWzOP1j7/R90AxxJI2/LS4ABAIzGydRITZTLAAAAAElFTkSuQmCC) center no-repeat;position:absolute;right:0;top:0;outline:none;border:none}.container_phonebook{position:absolute;width:100%;left:0;right:0;top:149px;background:var(--sd-background-color);height:386px;overflow:hidden}.container_phonebook_inner{width:100%;position:relative;height:100%;padding:0}.scrollbox{height:100%;overflow-y:scroll;overflow-x:hidden;visibility:hidden;padding:0 0 7px;position:relative;scroll-behavior:smooth;scrollbar-width:thin;width:100%}.scrollbox-content,.scrollbox:hover,.scrollbox:focus{visibility:visible}.container_contact_item{width:100%;position:relative;display:flex;flex-direction:row;align-items:center;padding:10px;border:1px solid var(--sd-border-color-light);border-radius:8px;overflow:hidden;margin-bottom:10px;cursor:pointer}.container_contact_item_image{display:flex}.container_contact_item_image_inner{margin:0 auto;padding:0;width:50px;height:50px;position:relative}.container_contact_item_left{display:flex;flex-basis:auto;flex-direction:column;flex-grow:1}.container_contact_item_left_inner{display:flex;flex-basis:1;flex-direction:column;padding:0 0 0 10px}.container_contact_item_left .contact_field{font-size:13px;margin-bottom:2px}.contact_dark{color:var(--sd-text-color-dark)}.contact_gray{color:var(--sd-text-color-medium)}.container_contact_item_left .contact_field_grey{font-size:12px;color:var(--sd-text-color);padding-top:2px;display:flex}.container_contact_item_left .contact_field_green{font-size:13px;margin-bottom:2px;color:#6c0}.container_contact_item_left .contact_field_highlighted{display:flex;font-size:11px;color:var(--sd-text-color-medium)}.container_contact_item_left .contact_field_highlighted span{background:#6c0;border-radius:3px;text-transform:uppercase;color:var(--sd-text-color-inverse);font-size:9px;padding:2px 4px}.container_contact_item_right{display:flex;flex-direction:row}.container_contact_item_right .right_field{display:flex;flex-basis:auto;justify-content:right}.container_contact_item_right .right_field_highlighted{font-size:16px;color:#29abe0}.container_contact_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)}.container_contact_item_right .right_recent_content{display:inline-block;padding:0;font-size:11px;color:var(--sd-text-color)}.container_contact_item_right .container_rating{font-size:11px;cursor:pointer}.container_contact_item_right .container_rating span{color:gray;transition:color .3s}.container_contact_item_right .container_rating span.filled{color:gold}.container_dialpad_content{width:100%;font-family:var(--sd-text-font-family);font-size:13px;font-weight:600;color:var(--sd-text-color);padding:21px 0 15px;display:flex;flex-basis:auto;flex-direction:column;align-items:center;justify-content:center}.container_dialpad_digits{width:100%;display:flex;justify-content:center;margin-bottom:10px;flex-direction:column}.container_dialpad_row{display:flex;column-gap:10px;flex-direction:row;flex-shrink:0;justify-content:center;margin-bottom:10px}.button_dialpad_digit{display:block;width:50px;height:50px;display:flex;column-gap:20px;margin:0 10px;align-items:center;justify-content:center;line-height:normal;border-radius:50%;outline:none;border:none;font-size:22px;font-weight:700;color:var(--sd-text-color-dark);background:var(--sd-background-color);-webkit-transition-duration:.3s;transition-duration:.3s;box-shadow:#0000001a 0 0 5px,#0000001a 0 0 1px;border:1px solid #ebebeb}.button_dialpad_digit:hover{background:#000;color:var(--sd-text-color-inverse)}.button_call_green{background:#6c0;color:var(--sd-text-color-inverse);width:60px;height:60px;-webkit-transition-duration:.3s;transition-duration:.3s}.button_call_green:hover{background:#5ab400;color:var(--sd-text-color-inverse);width:60px;height:60px}.button_call_red{background:#e0261f;color:var(--sd-text-color-inverse);width:60px;height:60px;-webkit-transition-duration:.3s;transition-duration:.3s;z-index:9999}.button_call_red:hover{background:#cf211a}.button_call_disabled{background:#eee;color:var(--sd-text-color-light);width:60px;height:60px;-webkit-transition-duration:.3s;transition-duration:.3s}.container_dialpad_buttons{width:100%;display:flex;justify-content:center;padding-top:0;margin-bottom:6px}.call_action_buttons{display:flex;gap:14px;align-items:center;justify-content:center;margin-left:auto}.call_action_button{display:inline-flex;align-items:center;gap:10px;padding:12px 18px;border-radius:999px;border:none;color:#fff;font-weight:600;letter-spacing:.2px;cursor:pointer;box-shadow:0 8px 20px #00000029;transition:transform .2s ease,box-shadow .2s ease,filter .2s ease}.call_action_button .icon_pill{width:42px;height:42px;display:grid;place-items:center;border-radius:50%;background:#ffffff29}.call_action_button.accept{background:linear-gradient(135deg,#2bb673,#0fa958)}.call_action_button.decline{background:linear-gradient(135deg,#f45c43,#c81d1d)}.call_action_button:hover{transform:translateY(-1px);box-shadow:0 10px 24px #0003;filter:saturate(1.05)}.call_action_button:active{transform:translateY(0);box-shadow:0 6px 16px #00000029}.incoming_wrapper{width:100%;display:flex;justify-content:center;padding:8px 0 6px}.incoming_strip{display:flex;flex-direction:column;align-items:center;gap:14px;width:100%}.incoming_avatar{position:relative;width:72px;height:72px;border-radius:50%;overflow:hidden}.incoming_avatar img{width:100%;height:100%;object-fit:cover;display:block;border-radius:50%}.incoming_details{display:flex;flex-direction:column;align-items:center;gap:4px}.incoming_label{font-size:12px;text-transform:uppercase;letter-spacing:.4px;color:#6b7280}.incoming_number{font-size:20px;font-weight:700;letter-spacing:.1px;color:var(--sd-text-color-dark)}.incoming_subtext{color:#6b7280;font-size:13px}.incoming_actions{margin-left:0;margin-top:6px}\n"] }]
|
|
1472
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1$1.FormBuilder }, { type: AvayaIPOService }, { type: AuthenticationService }], propDecorators: { contacts: [{
|
|
1473
|
+
type: Input
|
|
1474
|
+
}], makeCallEv: [{
|
|
1475
|
+
type: Output
|
|
1476
|
+
}], audioElement: [{
|
|
1477
|
+
type: ViewChild,
|
|
1478
|
+
args: ['audioElement']
|
|
1479
|
+
}] } });
|
|
1480
|
+
|
|
1481
|
+
class DeviceSelectorComponent {
|
|
1482
|
+
selectedAudioInputId;
|
|
1483
|
+
selectedAudioOutputId;
|
|
1484
|
+
change = new EventEmitter();
|
|
1485
|
+
audioInputs = [];
|
|
1486
|
+
audioOutputs = [];
|
|
1487
|
+
ngOnInit() {
|
|
1488
|
+
if (navigator?.mediaDevices) {
|
|
1489
|
+
navigator.mediaDevices.addEventListener('devicechange', this.handleDeviceChange);
|
|
1490
|
+
this.refreshDeviceList();
|
|
1491
|
+
}
|
|
1492
|
+
else {
|
|
1493
|
+
console.warn('MediaDevices API not supported');
|
|
1494
|
+
}
|
|
1495
|
+
}
|
|
1496
|
+
ngOnDestroy() {
|
|
1497
|
+
navigator.mediaDevices.removeEventListener('devicechange', this.handleDeviceChange);
|
|
1498
|
+
}
|
|
1499
|
+
handleDeviceChange = async () => {
|
|
1500
|
+
await this.refreshDeviceList();
|
|
1501
|
+
};
|
|
1502
|
+
async refreshDeviceList() {
|
|
1503
|
+
const devices = await navigator.mediaDevices.enumerateDevices();
|
|
1504
|
+
this.audioInputs = devices.filter((d) => d.kind === 'audioinput');
|
|
1505
|
+
this.audioOutputs = devices.filter((d) => d.kind === 'audiooutput');
|
|
1506
|
+
// Fallback to first device if previous selection is no longer available
|
|
1507
|
+
if (!this.audioInputs.some((d) => d.deviceId === this.selectedAudioInputId)) {
|
|
1508
|
+
this.selectedAudioInputId = this.audioInputs[0]?.deviceId ?? '';
|
|
1509
|
+
}
|
|
1510
|
+
if (!this.audioOutputs.some((d) => d.deviceId === this.selectedAudioOutputId)) {
|
|
1511
|
+
this.selectedAudioOutputId = this.audioOutputs[0]?.deviceId ?? '';
|
|
1512
|
+
}
|
|
1513
|
+
this.emitDeviceChange();
|
|
1514
|
+
}
|
|
1515
|
+
onMicChange(deviceId) {
|
|
1516
|
+
this.selectedAudioInputId = deviceId;
|
|
1517
|
+
this.emitDeviceChange();
|
|
1518
|
+
}
|
|
1519
|
+
onSpeakerChange(deviceId) {
|
|
1520
|
+
this.selectedAudioOutputId = deviceId;
|
|
1521
|
+
this.emitDeviceChange();
|
|
1522
|
+
}
|
|
1523
|
+
emitDeviceChange() {
|
|
1524
|
+
this.change.emit({
|
|
1525
|
+
audioInputId: this.selectedAudioInputId ?? '',
|
|
1526
|
+
audioOutputId: this.selectedAudioOutputId ?? '',
|
|
1527
|
+
videoInputId: undefined,
|
|
1528
|
+
});
|
|
1529
|
+
}
|
|
1530
|
+
trackByDeviceId(index, device) {
|
|
1531
|
+
return device.deviceId;
|
|
1532
|
+
}
|
|
1533
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: DeviceSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1534
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: DeviceSelectorComponent, isStandalone: false, selector: "app-device-selector", inputs: { selectedAudioInputId: "selectedAudioInputId", selectedAudioOutputId: "selectedAudioOutputId" }, outputs: { change: "change" }, ngImport: i0, template: "<div class=\"sd_container_device_selector\">\n <h2 class=\"sd_tab_heading\">Preferences</h2>\n\n <div class=\"sd_tab_content\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n <div class=\"sd_tab_pd_sd\">\n <h3>Audio settings</h3>\n\n <div class=\"sd_container_selector_item\">\n <label for=\"audioInputSelect\">\n Microphone<br />\n <p>The device used to capture your voice</p>\n </label>\n\n <div class=\"sd_container_item_input\">\n <div class=\"sd_container_item_icon\">\n <svg width=\"14px\" viewBox=\"0 0 384 512\">\n <path\n d=\"M192 0C139 0 96 43 96 96l0 160c0 53 43 96 96 96s96-43 96-96l0-160c0-53-43-96-96-96zM64 216c0-13.3-10.7-24-24-24s-24 10.7-24 24l0 40c0 89.1 66.2 162.7 152 174.4l0 33.6-48 0c-13.3 0-24 10.7-24 24s10.7 24 24 24l144 0c13.3 0 24-10.7 24-24s-10.7-24-24-24l-48 0 0-33.6c85.8-11.7 152-85.3 152-174.4l0-40c0-13.3-10.7-24-24-24s-24 10.7-24 24l0 40c0 70.7-57.3 128-128 128S64 326.7 64 256l0-40z\"\n />\n </svg>\n </div>\n\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=\"sd_container_selector_item\">\n <label for=\"audioOutputSelect\">\n Speakers<br />\n <p>The device that rings when you get a call.</p>\n </label>\n\n <div class=\"sd_container_item_input\">\n <div class=\"sd_container_item_icon\">\n <svg width=\"21px\" viewBox=\"0 0 576 512\">\n <path\n d=\"M333.1 34.8C344.6 40 352 51.4 352 64l0 384c0 12.6-7.4 24-18.9 29.2s-25 3.1-34.4-5.3L163.8 352 96 352c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l67.8 0L298.7 40.1c9.4-8.4 22.9-10.4 34.4-5.3zm172 72.2c43.2 35.2 70.9 88.9 70.9 149s-27.7 113.8-70.9 149c-10.3 8.4-25.4 6.8-33.8-3.5s-6.8-25.4 3.5-33.8C507.3 341.3 528 301.1 528 256s-20.7-85.3-53.2-111.8c-10.3-8.4-11.8-23.5-3.5-33.8s23.5-11.8 33.8-3.5zm-60.5 74.5C466.1 199.1 480 225.9 480 256s-13.9 56.9-35.4 74.5c-10.3 8.4-25.4 6.8-33.8-3.5s-6.8-25.4 3.5-33.8C425.1 284.4 432 271 432 256s-6.9-28.4-17.7-37.3c-10.3-8.4-11.8-23.5-3.5-33.8s23.5-11.8 33.8-3.5z\"\n />\n </svg>\n </div>\n\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 </div>\n </div>\n </div>\n</div>\n", styles: [".sd_container_device_selector{margin:0;padding:15px 0 0;width:100%;position:relative}.sd_tab_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}.sd_tab_content{margin:0;padding:0 0 15px;width:100%;position:relative;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:flex;justify-content:center;align-items:center;height:calc(100vh - 108px)}.sd_tab_pd_sd{margin:0;padding:0 15px;width:100%}.sd_tab_content h3{font-family:var(--sd-text-font-family);font-size:16px;color:var(--sd-text-color-dark);letter-spacing:-.26px;font-weight:700;padding-bottom:10px}.sd_container_selector_item{width:100%;background:var(--sd-background-color);border-radius:8px;padding:15px;box-shadow:#0000001a 0 0 5px,#0000001a 0 0 1px;margin-bottom:15px;position:relative}.sd_container_selector_item label{font-family:var(--sd-text-font-family);font-size:13px;font-weight:600;display:block;color:var(--sd-text-color-dark);margin-bottom:8px}.sd_container_selector_item label p{font-size:12px;color:var(--sd-text-color-medium);margin:4px 0 0;line-height:1.4}.sd_container_selector_item select{font-family:var(--sd-text-font-family);font-size:13px;font-weight:600;display:block;color:var(--sd-text-color);width:100%;border:1px solid var(--sd-border-color-dark);padding:12px 8px 12px 63px;border-radius:4px;outline:none;position:relative;box-sizing:border-box}.sd_container_item_input{margin:0;padding:0;width:100%;position:relative}.sd_container_item_icon{position:absolute;width:54px;height:44px;display:flex;align-items:center;justify-content:center;background:#f1f1f1;top:1px;left:1px;border-bottom-left-radius:3px;border-top-left-radius:3px;z-index:9}\n"], dependencies: [{ kind: "directive", type: i1$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NativeElementInjectorDirective, selector: "[ngModel], [formControl], [formControlName]" }] });
|
|
1535
|
+
}
|
|
1536
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: DeviceSelectorComponent, decorators: [{
|
|
1537
|
+
type: Component,
|
|
1538
|
+
args: [{ selector: 'app-device-selector', standalone: false, template: "<div class=\"sd_container_device_selector\">\n <h2 class=\"sd_tab_heading\">Preferences</h2>\n\n <div class=\"sd_tab_content\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n <div class=\"sd_tab_pd_sd\">\n <h3>Audio settings</h3>\n\n <div class=\"sd_container_selector_item\">\n <label for=\"audioInputSelect\">\n Microphone<br />\n <p>The device used to capture your voice</p>\n </label>\n\n <div class=\"sd_container_item_input\">\n <div class=\"sd_container_item_icon\">\n <svg width=\"14px\" viewBox=\"0 0 384 512\">\n <path\n d=\"M192 0C139 0 96 43 96 96l0 160c0 53 43 96 96 96s96-43 96-96l0-160c0-53-43-96-96-96zM64 216c0-13.3-10.7-24-24-24s-24 10.7-24 24l0 40c0 89.1 66.2 162.7 152 174.4l0 33.6-48 0c-13.3 0-24 10.7-24 24s10.7 24 24 24l144 0c13.3 0 24-10.7 24-24s-10.7-24-24-24l-48 0 0-33.6c85.8-11.7 152-85.3 152-174.4l0-40c0-13.3-10.7-24-24-24s-24 10.7-24 24l0 40c0 70.7-57.3 128-128 128S64 326.7 64 256l0-40z\"\n />\n </svg>\n </div>\n\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=\"sd_container_selector_item\">\n <label for=\"audioOutputSelect\">\n Speakers<br />\n <p>The device that rings when you get a call.</p>\n </label>\n\n <div class=\"sd_container_item_input\">\n <div class=\"sd_container_item_icon\">\n <svg width=\"21px\" viewBox=\"0 0 576 512\">\n <path\n d=\"M333.1 34.8C344.6 40 352 51.4 352 64l0 384c0 12.6-7.4 24-18.9 29.2s-25 3.1-34.4-5.3L163.8 352 96 352c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l67.8 0L298.7 40.1c9.4-8.4 22.9-10.4 34.4-5.3zm172 72.2c43.2 35.2 70.9 88.9 70.9 149s-27.7 113.8-70.9 149c-10.3 8.4-25.4 6.8-33.8-3.5s-6.8-25.4 3.5-33.8C507.3 341.3 528 301.1 528 256s-20.7-85.3-53.2-111.8c-10.3-8.4-11.8-23.5-3.5-33.8s23.5-11.8 33.8-3.5zm-60.5 74.5C466.1 199.1 480 225.9 480 256s-13.9 56.9-35.4 74.5c-10.3 8.4-25.4 6.8-33.8-3.5s-6.8-25.4 3.5-33.8C425.1 284.4 432 271 432 256s-6.9-28.4-17.7-37.3c-10.3-8.4-11.8-23.5-3.5-33.8s23.5-11.8 33.8-3.5z\"\n />\n </svg>\n </div>\n\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 </div>\n </div>\n </div>\n</div>\n", styles: [".sd_container_device_selector{margin:0;padding:15px 0 0;width:100%;position:relative}.sd_tab_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}.sd_tab_content{margin:0;padding:0 0 15px;width:100%;position:relative;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:flex;justify-content:center;align-items:center;height:calc(100vh - 108px)}.sd_tab_pd_sd{margin:0;padding:0 15px;width:100%}.sd_tab_content h3{font-family:var(--sd-text-font-family);font-size:16px;color:var(--sd-text-color-dark);letter-spacing:-.26px;font-weight:700;padding-bottom:10px}.sd_container_selector_item{width:100%;background:var(--sd-background-color);border-radius:8px;padding:15px;box-shadow:#0000001a 0 0 5px,#0000001a 0 0 1px;margin-bottom:15px;position:relative}.sd_container_selector_item label{font-family:var(--sd-text-font-family);font-size:13px;font-weight:600;display:block;color:var(--sd-text-color-dark);margin-bottom:8px}.sd_container_selector_item label p{font-size:12px;color:var(--sd-text-color-medium);margin:4px 0 0;line-height:1.4}.sd_container_selector_item select{font-family:var(--sd-text-font-family);font-size:13px;font-weight:600;display:block;color:var(--sd-text-color);width:100%;border:1px solid var(--sd-border-color-dark);padding:12px 8px 12px 63px;border-radius:4px;outline:none;position:relative;box-sizing:border-box}.sd_container_item_input{margin:0;padding:0;width:100%;position:relative}.sd_container_item_icon{position:absolute;width:54px;height:44px;display:flex;align-items:center;justify-content:center;background:#f1f1f1;top:1px;left:1px;border-bottom-left-radius:3px;border-top-left-radius:3px;z-index:9}\n"] }]
|
|
1539
|
+
}], propDecorators: { selectedAudioInputId: [{
|
|
1540
|
+
type: Input
|
|
1541
|
+
}], selectedAudioOutputId: [{
|
|
1542
|
+
type: Input
|
|
1543
|
+
}], change: [{
|
|
1544
|
+
type: Output
|
|
1545
|
+
}] } });
|
|
1546
|
+
|
|
1547
|
+
class AvayaIPOWidgetComponent {
|
|
1548
|
+
http;
|
|
1549
|
+
cdr;
|
|
1550
|
+
zone;
|
|
1551
|
+
formBuilder;
|
|
1552
|
+
countryService;
|
|
1553
|
+
phoneNumberLookupService;
|
|
1554
|
+
avayaIPOService;
|
|
1555
|
+
recordingManagerService;
|
|
1556
|
+
callSocket;
|
|
1557
|
+
authenticationService;
|
|
1558
|
+
tenantService;
|
|
1559
|
+
userService;
|
|
1560
|
+
tenantId;
|
|
1561
|
+
userId;
|
|
1562
|
+
isVisible;
|
|
1563
|
+
containerHeightObservable;
|
|
1564
|
+
containerWidthObservable;
|
|
1565
|
+
notificationEvent = new EventEmitter();
|
|
1566
|
+
isRecording = false;
|
|
1567
|
+
loginForm;
|
|
1568
|
+
transferForm;
|
|
1569
|
+
dtmfForm;
|
|
1570
|
+
isRinging = false;
|
|
1571
|
+
showActiveCall = false;
|
|
1572
|
+
loginSubscription;
|
|
1573
|
+
incomingCallSubscription;
|
|
1574
|
+
callDuration = 0;
|
|
1575
|
+
timer;
|
|
1576
|
+
isCalling = false;
|
|
1577
|
+
lookupPhoneNumber = null;
|
|
1578
|
+
ringtone;
|
|
1579
|
+
isReconnectingInProgress = false;
|
|
1580
|
+
isFailoverInProgress = false;
|
|
1581
|
+
isFailbackInProgress = false;
|
|
1582
|
+
showLoginForm = false;
|
|
1583
|
+
showLoginPassword = false;
|
|
1584
|
+
showLoginLoader = false;
|
|
1585
|
+
hasAvayaSocketError = false;
|
|
1586
|
+
hasAvayaLoginError = false;
|
|
1587
|
+
hasAvayaLoginConflictError = false;
|
|
1588
|
+
hasAvayaDeviceError = false;
|
|
1589
|
+
callStateSubscription;
|
|
1590
|
+
isMuted = false;
|
|
1591
|
+
isOnHold = false;
|
|
1592
|
+
isactiveCall = false;
|
|
1593
|
+
phoneNumber = '';
|
|
1594
|
+
isDailpadOpen = false;
|
|
1595
|
+
isCallTransferOpen = false;
|
|
1596
|
+
activeTab = 'tab1';
|
|
1597
|
+
contacts = [];
|
|
1598
|
+
searchText = '';
|
|
1599
|
+
extensionNumber = '';
|
|
1600
|
+
isDirectoryOpen = false;
|
|
1601
|
+
istransfer = false;
|
|
1602
|
+
rating = 4; // TODO: Remove thiss
|
|
1603
|
+
isConfereceList = false;
|
|
1604
|
+
conferenceParticipants;
|
|
1605
|
+
/* conferenceParticipants = [
|
|
1606
|
+
{ name: 'Pankaj Kumar Singh', duration: '00:10' },
|
|
1607
|
+
{ name: 'Saurabh Mehta', duration: '00:10' },
|
|
1608
|
+
{ name: 'Rajat Verma', duration: '00:10' }
|
|
1609
|
+
]; */
|
|
1610
|
+
currentView = 'transferListpage';
|
|
1611
|
+
redialTimeout;
|
|
1612
|
+
showCallDisconnected = false;
|
|
1613
|
+
lastDisconnectedCall = null;
|
|
1614
|
+
activeCalls = [];
|
|
1615
|
+
currentActiveCallIndex = 0;
|
|
1616
|
+
isAddingNewCall = false;
|
|
1617
|
+
isredialling = false;
|
|
1618
|
+
wasInbound = false;
|
|
1619
|
+
showHistoryPopup = false;
|
|
1620
|
+
noOfCalls = 0;
|
|
1621
|
+
isCallingFromContact = false;
|
|
1622
|
+
bottomActiveTab = 'keypad_sd';
|
|
1623
|
+
disconnecttriggered = false;
|
|
1624
|
+
lastRemoteStream = null;
|
|
1625
|
+
lastLocalStream = null;
|
|
1626
|
+
showInitLoader = false;
|
|
1627
|
+
tenant;
|
|
1628
|
+
user;
|
|
1629
|
+
internalContacts = [
|
|
1630
|
+
{ id: 1, name: 'Lovish Snug', phone: '6283675354', role: 'Agent', ext: '8002' },
|
|
1631
|
+
{ id: 2, name: 'Rakesh Kumar', phone: '(888) 9876549', role: 'Administrator', ext: '3005' },
|
|
1632
|
+
{ id: 3, name: 'Sohan Singh', phone: '(876) 8800965', role: 'Manager', ext: '3005' },
|
|
1633
|
+
{ id: 4, name: 'Pardeep Mishra', phone: '(876) 8800965', role: 'Agent', ext: '3005' },
|
|
1634
|
+
{ id: 5, name: 'Varun Ji', phone: '(876) 8800965', role: 'Manager', ext: '3005' }
|
|
1635
|
+
];
|
|
1636
|
+
directoryContacts = [
|
|
1637
|
+
{ id: 101, name: 'Rajeev Kumar Singh', phone: '(654) 9876549', rating: 4 },
|
|
1638
|
+
{ id: 102, name: 'Amit Sharma', phone: '(987) 6543210', rating: 5 },
|
|
1639
|
+
{ id: 103, name: 'Sunita Verma', phone: '(765) 4321987', rating: 3 }
|
|
1640
|
+
];
|
|
1641
|
+
recognition;
|
|
1642
|
+
transcriptText = '';
|
|
1643
|
+
showTranscriptionPopup = false;
|
|
1644
|
+
recognitionKeepAlive;
|
|
1645
|
+
transcriptHistory = [];
|
|
1646
|
+
recognitionActive = false;
|
|
1647
|
+
transcriptSegments = []; // final lines w/ timestamps
|
|
1648
|
+
transcriptStartedAt = 0;
|
|
1649
|
+
transcriptEndedAt = 0;
|
|
1650
|
+
autoDownloadSummaryOnEnd = true; // toggle if you want auto-download
|
|
1651
|
+
summaryText = '';
|
|
1652
|
+
displayCallingNumber;
|
|
1653
|
+
redialnumber;
|
|
1654
|
+
isTransferring = false;
|
|
1655
|
+
constructor(http, cdr, zone, formBuilder, countryService, phoneNumberLookupService, avayaIPOService, recordingManagerService, callSocket, authenticationService, tenantService, userService) {
|
|
1656
|
+
this.http = http;
|
|
1657
|
+
this.cdr = cdr;
|
|
1658
|
+
this.zone = zone;
|
|
1659
|
+
this.formBuilder = formBuilder;
|
|
1660
|
+
this.countryService = countryService;
|
|
1661
|
+
this.phoneNumberLookupService = phoneNumberLookupService;
|
|
1662
|
+
this.avayaIPOService = avayaIPOService;
|
|
1663
|
+
this.recordingManagerService = recordingManagerService;
|
|
1664
|
+
this.callSocket = callSocket;
|
|
1665
|
+
this.authenticationService = authenticationService;
|
|
1666
|
+
this.tenantService = tenantService;
|
|
1667
|
+
this.userService = userService;
|
|
1668
|
+
this.loginForm = this.formBuilder.group({
|
|
1669
|
+
ipoExtensionNo: ['', Validators.required],
|
|
1670
|
+
ipoPassword: ['', Validators.required],
|
|
1671
|
+
});
|
|
1672
|
+
this.transferForm = this.formBuilder.group({
|
|
1673
|
+
target: ['', Validators.required],
|
|
1674
|
+
});
|
|
1675
|
+
this.dtmfForm = this.formBuilder.group({
|
|
1676
|
+
dtmf: ['', Validators.required],
|
|
1677
|
+
});
|
|
1678
|
+
}
|
|
1679
|
+
async ngOnInit() {
|
|
1680
|
+
if (!('serviceWorker' in navigator)) {
|
|
1681
|
+
// Service Worker isn't supported on this browser, disable or hide UI.
|
|
1682
|
+
return;
|
|
1683
|
+
}
|
|
1684
|
+
if (!('PushManager' in window)) {
|
|
1685
|
+
// Push isn't supported on this browser, disable or hide UI.
|
|
1686
|
+
return;
|
|
1687
|
+
}
|
|
1688
|
+
this.loadScript('https://snugdesk-assets.s3.us-east-1.amazonaws.com/js/awl.min.js').then(() => {
|
|
1689
|
+
this.avayaIPOService.init();
|
|
1690
|
+
});
|
|
1691
|
+
this.showInitLoader = true;
|
|
1692
|
+
try {
|
|
1693
|
+
if (!this.authenticationService.isAuthenticated()) {
|
|
1694
|
+
const res_login = await this.authenticationService.login(this.tenantId, this.userId);
|
|
1695
|
+
console.debug('Login response:', res_login);
|
|
1696
|
+
}
|
|
1697
|
+
this.tenant = sessionStorage.getItem('sd-tenant');
|
|
1698
|
+
if (!this.tenant) {
|
|
1699
|
+
this.tenant = await this.tenantService.getTenantById(this.tenantId);
|
|
1700
|
+
console.debug('Fetched tenant:', this.tenant);
|
|
1701
|
+
sessionStorage.setItem('sd-tenant', JSON.stringify(this.tenant));
|
|
1702
|
+
}
|
|
1703
|
+
this.user = sessionStorage.getItem('sd-user');
|
|
1704
|
+
if (!this.user) {
|
|
1705
|
+
this.user = await this.userService.getUserById(this.userId);
|
|
1706
|
+
console.debug('Fetched user:', this.user);
|
|
1707
|
+
sessionStorage.setItem('sd-user', JSON.stringify(this.user));
|
|
1708
|
+
}
|
|
1709
|
+
}
|
|
1710
|
+
catch (error) {
|
|
1711
|
+
console.error(error);
|
|
1712
|
+
// this.hasInitConfigurationErrors = true;
|
|
1713
|
+
// this.snackBar.open(
|
|
1714
|
+
// `Oops! WhatsApp settings unavailable or invalid configuration detected`,
|
|
1715
|
+
// 'Close',
|
|
1716
|
+
// {
|
|
1717
|
+
// duration: 5000,
|
|
1718
|
+
// panelClass: ['snackbar-error'],
|
|
1719
|
+
// horizontalPosition: 'center',
|
|
1720
|
+
// verticalPosition: 'top',
|
|
1721
|
+
// }
|
|
1722
|
+
// );
|
|
1723
|
+
}
|
|
1724
|
+
finally {
|
|
1725
|
+
// Select the first WhatsApp phone number by default
|
|
1726
|
+
this.showInitLoader = false;
|
|
1727
|
+
this.cdr.detectChanges();
|
|
1728
|
+
}
|
|
1729
|
+
return;
|
|
1730
|
+
}
|
|
1731
|
+
loadScript(src) {
|
|
1732
|
+
return new Promise((resolve, reject) => {
|
|
1733
|
+
const script = document.createElement('script');
|
|
1734
|
+
script.src = src;
|
|
1735
|
+
script.async = true;
|
|
1736
|
+
script.onload = () => resolve();
|
|
1737
|
+
script.onerror = () => reject();
|
|
1738
|
+
document.body.appendChild(script);
|
|
1739
|
+
});
|
|
1740
|
+
}
|
|
1741
|
+
ngAfterViewInit() {
|
|
1742
|
+
this.loginSubscription = this.avayaIPOService.loginStatus$.subscribe(async (response) => {
|
|
1743
|
+
this.zone.run(async () => {
|
|
1744
|
+
console.debug('Got Avaya IPO Login response: ', response);
|
|
1745
|
+
if (!response) {
|
|
1746
|
+
this.showLoginForm = true;
|
|
1747
|
+
this.cdr.detectChanges();
|
|
1748
|
+
// this.hasAvayaDeviceError = true;
|
|
1749
|
+
return;
|
|
1750
|
+
}
|
|
1751
|
+
this.showLoginLoader = false;
|
|
1752
|
+
switch (response.result) {
|
|
1753
|
+
case LoginState.LOGIN_SUCCESS:
|
|
1754
|
+
console.debug('Login successful:', response);
|
|
1755
|
+
this.showLoginForm = false;
|
|
1756
|
+
this.hasAvayaLoginError = false;
|
|
1757
|
+
this.hasAvayaLoginConflictError = false;
|
|
1758
|
+
this.avayaIPOService.agentIdle();
|
|
1759
|
+
await this.avayaIPOService.initLocalMic();
|
|
1760
|
+
await this.fetchContacts();
|
|
1761
|
+
// await this.loadCallHistory();
|
|
1762
|
+
break;
|
|
1763
|
+
case LoginState.LOGGEDOUT:
|
|
1764
|
+
this.loginForm.reset();
|
|
1765
|
+
this.showLoginForm = true;
|
|
1766
|
+
this.hasAvayaLoginError = false;
|
|
1767
|
+
this.hasAvayaLoginConflictError = false;
|
|
1768
|
+
this.hasAvayaDeviceError = false;
|
|
1769
|
+
this.hasAvayaSocketError = false;
|
|
1770
|
+
this.avayaIPOService.agentBusy();
|
|
1771
|
+
break;
|
|
1772
|
+
case LoginState.LOGIN_EMPTYUSERNAME:
|
|
1773
|
+
case LoginState.LOGIN_EMPTYPASSWORD:
|
|
1774
|
+
this.showLoginForm = true;
|
|
1775
|
+
this.hasAvayaLoginError = true;
|
|
1776
|
+
this.avayaIPOService.agentBusy();
|
|
1777
|
+
break;
|
|
1778
|
+
case LoginState.LOGIN_FAILED:
|
|
1779
|
+
this.showLoginForm = true;
|
|
1780
|
+
if (response.reason === 'Invalid Credentials') {
|
|
1781
|
+
this.hasAvayaLoginError = true;
|
|
1782
|
+
}
|
|
1783
|
+
else
|
|
1784
|
+
this.hasAvayaLoginConflictError = true;
|
|
1785
|
+
this.avayaIPOService.agentBusy();
|
|
1786
|
+
break;
|
|
1787
|
+
case LoginState.LOGIN_GW_NOTCONFIGURED:
|
|
1788
|
+
case LoginState.WEBSOCKET_FAILURE:
|
|
1789
|
+
this.showLoginForm = true;
|
|
1790
|
+
this.hasAvayaSocketError = true;
|
|
1791
|
+
// this.loginForm.disable();
|
|
1792
|
+
this.avayaIPOService.agentBusy();
|
|
1793
|
+
break;
|
|
1794
|
+
case LoginState.DEVICEACCESS_FAILURE:
|
|
1795
|
+
this.showLoginForm = true;
|
|
1796
|
+
this.hasAvayaDeviceError = true;
|
|
1797
|
+
this.avayaIPOService.agentBusy();
|
|
1798
|
+
break;
|
|
1799
|
+
case LoginState.RECONNECTING:
|
|
1800
|
+
this.isReconnectingInProgress = true;
|
|
1801
|
+
this.avayaIPOService.agentBusy();
|
|
1802
|
+
break;
|
|
1803
|
+
case LoginState.RELOGGED_IN:
|
|
1804
|
+
this.isReconnectingInProgress = false;
|
|
1805
|
+
this.avayaIPOService.agentIdle();
|
|
1806
|
+
break;
|
|
1807
|
+
case LoginState.FAILING_OVER:
|
|
1808
|
+
this.isFailoverInProgress = true;
|
|
1809
|
+
this.avayaIPOService.agentBusy();
|
|
1810
|
+
break;
|
|
1811
|
+
case LoginState.FAILOVER_SUCCESS:
|
|
1812
|
+
this.isFailoverInProgress = false;
|
|
1813
|
+
this.avayaIPOService.agentIdle();
|
|
1814
|
+
break;
|
|
1815
|
+
case LoginState.FAILOVER_FAILED:
|
|
1816
|
+
this.isFailoverInProgress = false;
|
|
1817
|
+
this.showLoginForm = true;
|
|
1818
|
+
this.hasAvayaSocketError = true;
|
|
1819
|
+
this.avayaIPOService.agentBusy();
|
|
1820
|
+
break;
|
|
1821
|
+
case LoginState.FAILING_BACK:
|
|
1822
|
+
this.isFailbackInProgress = true;
|
|
1823
|
+
this.avayaIPOService.agentBusy();
|
|
1824
|
+
break;
|
|
1825
|
+
case LoginState.FAILBACK_SUCCESS:
|
|
1826
|
+
this.isFailbackInProgress = false;
|
|
1827
|
+
this.avayaIPOService.agentIdle();
|
|
1828
|
+
break;
|
|
1829
|
+
case LoginState.FAILBACK_FAILED:
|
|
1830
|
+
this.isFailbackInProgress = false;
|
|
1831
|
+
this.showLoginForm = true;
|
|
1832
|
+
this.hasAvayaSocketError = true;
|
|
1833
|
+
this.avayaIPOService.agentBusy();
|
|
1834
|
+
break;
|
|
1835
|
+
default:
|
|
1836
|
+
console.warn('Unhandled Avaya IPO Login state:', response.result);
|
|
1837
|
+
}
|
|
1838
|
+
this.cdr.detectChanges();
|
|
1839
|
+
});
|
|
1840
|
+
});
|
|
1841
|
+
this.avayaIPOService.remoteStream$
|
|
1842
|
+
.pipe(filter((r) => !!r && r.stream.getAudioTracks().length > 0))
|
|
1843
|
+
.subscribe((r) => {
|
|
1844
|
+
this.lastRemoteStream = r.stream;
|
|
1845
|
+
this.lastLocalStream = this.avayaIPOService.localStream;
|
|
1846
|
+
});
|
|
1847
|
+
this.callStateSubscription =
|
|
1848
|
+
this.avayaIPOService.callStateSubject.subscribe((evt) => {
|
|
1849
|
+
this.zone.run(() => {
|
|
1850
|
+
// 1) early‐exit on null/undefined
|
|
1851
|
+
if (!evt || !evt.callId) {
|
|
1852
|
+
console.debug('ignoring empty callState event', evt);
|
|
1853
|
+
return;
|
|
1854
|
+
}
|
|
1855
|
+
// 2) now it’s safe to destructure
|
|
1856
|
+
const { state, callId } = evt;
|
|
1857
|
+
const idx = this.activeCalls.findIndex((c) => c.callId === callId);
|
|
1858
|
+
if (idx === -1) {
|
|
1859
|
+
console.warn('Event for unknown call', { state, callId });
|
|
1860
|
+
return;
|
|
1861
|
+
}
|
|
1862
|
+
console.log('Call stateeeeeeeeeee', state);
|
|
1863
|
+
switch (state) {
|
|
1864
|
+
case CallState.CONNECTED:
|
|
1865
|
+
this.currentActiveCallIndex = idx;
|
|
1866
|
+
this.avayaIPOService.agentBusy();
|
|
1867
|
+
this.handleCallConnect();
|
|
1868
|
+
this.cdr.detectChanges();
|
|
1869
|
+
break;
|
|
1870
|
+
case CallState.DISCONNECTED:
|
|
1871
|
+
console.log(this.disconnecttriggered);
|
|
1872
|
+
this.avayaIPOService.agentIdle();
|
|
1873
|
+
if (!this.disconnecttriggered) {
|
|
1874
|
+
this.lastRemoteStream = null;
|
|
1875
|
+
this.lastLocalStream = null;
|
|
1876
|
+
this.handleCallDisconnect(idx, 'CALLER');
|
|
1877
|
+
}
|
|
1878
|
+
this.showActiveCall = false;
|
|
1879
|
+
this.bottomActiveTab = 'keypad_sd';
|
|
1880
|
+
this.avayaIPOService.activeCallId = null;
|
|
1881
|
+
this.isactiveCall = false;
|
|
1882
|
+
break;
|
|
1883
|
+
case CallState.INCOMING:
|
|
1884
|
+
console.log(this.disconnecttriggered);
|
|
1885
|
+
this.avayaIPOService.agentIdle();
|
|
1886
|
+
if (!this.disconnecttriggered) {
|
|
1887
|
+
this.lastRemoteStream = null;
|
|
1888
|
+
this.lastLocalStream = null;
|
|
1889
|
+
this.handleCallDisconnect(idx, 'AGENT');
|
|
1890
|
+
}
|
|
1891
|
+
this.showActiveCall = false;
|
|
1892
|
+
this.bottomActiveTab = 'keypad_sd';
|
|
1893
|
+
this.avayaIPOService.activeCallId = null;
|
|
1894
|
+
this.isactiveCall = false;
|
|
1895
|
+
break;
|
|
1896
|
+
case CallState.HELD:
|
|
1897
|
+
this.recordingManagerService.stopRecording(callId);
|
|
1898
|
+
this.lastRemoteStream = null;
|
|
1899
|
+
this.lastLocalStream = null;
|
|
1900
|
+
console.log('**************** HOLD HOLD HOLD *****************');
|
|
1901
|
+
break;
|
|
1902
|
+
case CallState.PROGRESSING:
|
|
1903
|
+
this.currentActiveCallIndex = idx;
|
|
1904
|
+
this.showActiveCall = true;
|
|
1905
|
+
break;
|
|
1906
|
+
default:
|
|
1907
|
+
console.warn('Unhandled call state:', state, 'idx=', idx);
|
|
1908
|
+
}
|
|
1909
|
+
this.cdr.detectChanges();
|
|
1910
|
+
});
|
|
1911
|
+
});
|
|
1912
|
+
this.incomingCallSubscription = this.avayaIPOService.incomingCallSubject
|
|
1913
|
+
.pipe(filter((evt) => !!evt && typeof evt.callId === 'string'))
|
|
1914
|
+
.subscribe(async (evt) => {
|
|
1915
|
+
this.zone.run(async () => {
|
|
1916
|
+
const { callId, farEndNumber } = evt;
|
|
1917
|
+
console.log('📞 Incoming call!', callId, farEndNumber);
|
|
1918
|
+
// TODO: rename displayInfo to this.lookupPhoneNumber
|
|
1919
|
+
const displayInfo = await this.getLookupPhoneNumber(farEndNumber);
|
|
1920
|
+
console.log(displayInfo);
|
|
1921
|
+
const slot = this.avayaIPOService.getSlotForCallId(callId);
|
|
1922
|
+
if (!slot) {
|
|
1923
|
+
console.warn('Couldn’t find slot for incoming callId', callId);
|
|
1924
|
+
return;
|
|
1925
|
+
}
|
|
1926
|
+
this.activeCalls.push({
|
|
1927
|
+
callId,
|
|
1928
|
+
phoneNumber: displayInfo.lookupPhoneNumber?.['local-number'].replace(/\s+/g, ''),
|
|
1929
|
+
lookupPhoneNumber: displayInfo,
|
|
1930
|
+
duration: 0,
|
|
1931
|
+
isMuted: false,
|
|
1932
|
+
isOnHold: false,
|
|
1933
|
+
startTime: Date.now(),
|
|
1934
|
+
slot,
|
|
1935
|
+
});
|
|
1936
|
+
this.phoneNumber = displayInfo.lookupPhoneNumber?.['local-number'].replace(/\s+/g, '');
|
|
1937
|
+
this.currentActiveCallIndex = this.activeCalls.length - 1;
|
|
1938
|
+
this.isactiveCall = true;
|
|
1939
|
+
this.wasInbound = true;
|
|
1940
|
+
// Ensure UI is on dialpad tab and active-call view when ringing
|
|
1941
|
+
this.bottomActiveTab = 'keypad_sd';
|
|
1942
|
+
this.showActiveCall = true;
|
|
1943
|
+
this.cdr.detectChanges();
|
|
1944
|
+
});
|
|
1945
|
+
});
|
|
1946
|
+
}
|
|
1947
|
+
ngOnDestroy() {
|
|
1948
|
+
this.loginSubscription?.unsubscribe();
|
|
1949
|
+
this.incomingCallSubscription?.unsubscribe();
|
|
1950
|
+
this.callStateSubscription?.unsubscribe();
|
|
1951
|
+
// this.clearTimer(); todo
|
|
1952
|
+
}
|
|
1953
|
+
// prettier-ignore
|
|
1954
|
+
async getLookupPhoneNumber(phoneNumber) {
|
|
1955
|
+
if (!phoneNumber || typeof phoneNumber !== 'string') {
|
|
1956
|
+
console.warn('lookupPhoneNumber called with an invalid phoneNumber: ', phoneNumber);
|
|
1957
|
+
return {
|
|
1958
|
+
phoneNumber: '',
|
|
1959
|
+
};
|
|
1960
|
+
}
|
|
1961
|
+
let normalizedPhoneNumber = phoneNumber.trim();
|
|
1962
|
+
if (normalizedPhoneNumber.startsWith('00')) {
|
|
1963
|
+
normalizedPhoneNumber = '+' + normalizedPhoneNumber.substring(2);
|
|
1964
|
+
}
|
|
1965
|
+
try {
|
|
1966
|
+
const res_lookupPhoneNumber = await this.phoneNumberLookupService.lookupPhoneNumber(normalizedPhoneNumber);
|
|
1967
|
+
if (!res_lookupPhoneNumber?.data?.valid) {
|
|
1968
|
+
throw new Error('Invalid res_lookupPhoneNumber: ', res_lookupPhoneNumber);
|
|
1969
|
+
}
|
|
1970
|
+
const countryCode = res_lookupPhoneNumber?.data
|
|
1971
|
+
? res_lookupPhoneNumber.data['country-code']
|
|
1972
|
+
: null;
|
|
1973
|
+
const res_getCountryFromCountryCode = countryCode
|
|
1974
|
+
? await this.countryService.getCountryFromCountryCode(countryCode)
|
|
1975
|
+
: null;
|
|
1976
|
+
// console.debug('res_getCountryFromCountryCode:', res_getCountryFromCountryCode);
|
|
1977
|
+
return {
|
|
1978
|
+
normalizedPhoneNumber: normalizedPhoneNumber,
|
|
1979
|
+
lookupPhoneNumber: res_lookupPhoneNumber?.data,
|
|
1980
|
+
country: res_getCountryFromCountryCode,
|
|
1981
|
+
};
|
|
1982
|
+
}
|
|
1983
|
+
catch (err) {
|
|
1984
|
+
console.warn(`Error looking up phone number ${phoneNumber}: `, err);
|
|
1985
|
+
return {
|
|
1986
|
+
normalizedPhoneNumber: normalizedPhoneNumber,
|
|
1987
|
+
};
|
|
1988
|
+
}
|
|
1989
|
+
}
|
|
1990
|
+
onLogin() {
|
|
1991
|
+
this.loginForm.markAllAsTouched();
|
|
1992
|
+
this.hasAvayaLoginError = false;
|
|
1993
|
+
this.hasAvayaDeviceError = false;
|
|
1994
|
+
this.hasAvayaSocketError = false;
|
|
1995
|
+
if (this.loginForm.invalid) {
|
|
1996
|
+
console.warn(`Invalid form data`);
|
|
1997
|
+
return;
|
|
1998
|
+
}
|
|
1999
|
+
this.showLoginLoader = true;
|
|
2000
|
+
const { ipoExtensionNo, ipoPassword } = this.loginForm.value;
|
|
2001
|
+
this.extensionNumber = ipoExtensionNo;
|
|
2002
|
+
try {
|
|
2003
|
+
this.avayaIPOService.logIn(ipoExtensionNo, ipoPassword);
|
|
2004
|
+
}
|
|
2005
|
+
catch (err) {
|
|
2006
|
+
console.error(err);
|
|
2007
|
+
this.showLoginLoader = false;
|
|
2008
|
+
}
|
|
2009
|
+
}
|
|
2010
|
+
onLogout() {
|
|
2011
|
+
this.avayaIPOService.logOut();
|
|
2012
|
+
}
|
|
2013
|
+
async makeCall(phoneNumber) {
|
|
2014
|
+
this.redialnumber = phoneNumber;
|
|
2015
|
+
console.log('phone number passed', phoneNumber);
|
|
2016
|
+
this.isCalling = true;
|
|
2017
|
+
this.displayCallingNumber = phoneNumber;
|
|
2018
|
+
this.showActiveCall = true;
|
|
2019
|
+
this.cdr.detectChanges();
|
|
2020
|
+
if (!phoneNumber) {
|
|
2021
|
+
alert('Please enter a number to call.');
|
|
2022
|
+
this.isCalling = false;
|
|
2023
|
+
return;
|
|
2024
|
+
}
|
|
2025
|
+
const initPhoneNumber = phoneNumber.replace(/\s+/g, '');
|
|
2026
|
+
this.lookupPhoneNumber = await this.getLookupPhoneNumber(phoneNumber);
|
|
2027
|
+
console.log('lookupPhoneNumber: ', this.lookupPhoneNumber);
|
|
2028
|
+
this.phoneNumber = this.lookupPhoneNumber?.lookupPhoneNumber?.['local-number']?.replace(/\s+/g, '');
|
|
2029
|
+
console.log('this.phoneNumber: ', this.phoneNumber);
|
|
2030
|
+
// hold the existing call if any
|
|
2031
|
+
if (this.activeCalls.length > 0) {
|
|
2032
|
+
const currentCall = this.activeCalls[this.currentActiveCallIndex];
|
|
2033
|
+
currentCall.isOnHold = true;
|
|
2034
|
+
this.avayaIPOService.doHold();
|
|
2035
|
+
}
|
|
2036
|
+
// don't duplicate the same number
|
|
2037
|
+
const alreadyExists = this.activeCalls.some((c) => c.phoneNumber === phoneNumber);
|
|
2038
|
+
if (alreadyExists) {
|
|
2039
|
+
console.warn('Call already in progress for this number.');
|
|
2040
|
+
this.isCalling = false;
|
|
2041
|
+
return;
|
|
2042
|
+
}
|
|
2043
|
+
const dataToSend = '*************custom data in sdp*************';
|
|
2044
|
+
try {
|
|
2045
|
+
// 🔴 FIX: await the Promise returned by the service
|
|
2046
|
+
const slot = await this.avayaIPOService.makeCallWithCustomData(this.phoneNumber, dataToSend);
|
|
2047
|
+
if (!slot) {
|
|
2048
|
+
console.warn('Could not place call: no free slot or call failed to start.');
|
|
2049
|
+
this.isCalling = false;
|
|
2050
|
+
return;
|
|
2051
|
+
}
|
|
2052
|
+
this.activeCalls.push({
|
|
2053
|
+
callId: this.avayaIPOService.activeCallId,
|
|
2054
|
+
phoneNumber,
|
|
2055
|
+
lookupPhoneNumber: this.lookupPhoneNumber,
|
|
2056
|
+
duration: 0,
|
|
2057
|
+
isMuted: false,
|
|
2058
|
+
isOnHold: false,
|
|
2059
|
+
startTime: Date.now(),
|
|
2060
|
+
slot, // ✅ now a "1" | "2" | "3" value, not a Promise
|
|
2061
|
+
});
|
|
2062
|
+
this.currentActiveCallIndex = this.activeCalls.length - 1;
|
|
2063
|
+
this.noOfCalls = this.activeCalls.length;
|
|
2064
|
+
// Log call initiation so the same IDs are present before connect/disconnect logs
|
|
2065
|
+
const callId = this.avayaIPOService.activeCallId;
|
|
2066
|
+
const callLogPayload = {
|
|
2067
|
+
tenantId: this.tenantId,
|
|
2068
|
+
agentId: this.extensionNumber,
|
|
2069
|
+
callId,
|
|
2070
|
+
phoneNumber: this.lookupPhoneNumber ?? phoneNumber,
|
|
2071
|
+
direction: 'outbound',
|
|
2072
|
+
duration: 0,
|
|
2073
|
+
status: 'initiated',
|
|
2074
|
+
timestamp: new Date().toISOString(),
|
|
2075
|
+
callinginfo: 'calling',
|
|
2076
|
+
};
|
|
2077
|
+
this.avayaIPOService.logCall(callLogPayload).subscribe({
|
|
2078
|
+
error: (err) => console.error('logCall (initiated) failed', err),
|
|
2079
|
+
});
|
|
2080
|
+
this.avayaIPOService.agentBusy();
|
|
2081
|
+
this.isCallingFromContact = false;
|
|
2082
|
+
this.isAddingNewCall = false;
|
|
2083
|
+
}
|
|
2084
|
+
catch (err) {
|
|
2085
|
+
console.error('Failed to start call:', err);
|
|
2086
|
+
this.isCalling = false;
|
|
2087
|
+
}
|
|
2088
|
+
}
|
|
2089
|
+
async makeCallFromContact(phoneNumber) {
|
|
2090
|
+
this.isCallingFromContact = true;
|
|
2091
|
+
this.makeCall(phoneNumber);
|
|
2092
|
+
}
|
|
2093
|
+
async cancelCall() {
|
|
2094
|
+
// Mirror manual disconnect button behavior
|
|
2095
|
+
this.disconnecttriggered = true;
|
|
2096
|
+
this.avayaIPOService.agentIdle();
|
|
2097
|
+
await this.dropCurrentCall();
|
|
2098
|
+
}
|
|
2099
|
+
async dropCurrentCall() {
|
|
2100
|
+
console.log('***************dropping call button triggered******************');
|
|
2101
|
+
this.disconnecttriggered = true;
|
|
2102
|
+
console.log('Cancelling active call. Active calls before:', this.activeCalls);
|
|
2103
|
+
console.log('Current active call index:', this.currentActiveCallIndex);
|
|
2104
|
+
const index = this.currentActiveCallIndex;
|
|
2105
|
+
if (index < 0 || index >= this.activeCalls.length) {
|
|
2106
|
+
console.warn('Active call index out of range:', index);
|
|
2107
|
+
return;
|
|
2108
|
+
}
|
|
2109
|
+
const activeCall = this.activeCalls[index];
|
|
2110
|
+
const targetSlot = activeCall.slot;
|
|
2111
|
+
if (!targetSlot) {
|
|
2112
|
+
console.warn('Active call at index', index, 'does not have a valid slot.');
|
|
2113
|
+
return;
|
|
2114
|
+
}
|
|
2115
|
+
console.log(`Dropping active call from slot ${targetSlot} (index ${index}).`);
|
|
2116
|
+
await this.avayaIPOService.dropCallBySlot(targetSlot);
|
|
2117
|
+
// Log the manual drop so it shares the same IDs as other call logs
|
|
2118
|
+
const dropLog = {
|
|
2119
|
+
tenantId: this.tenantId,
|
|
2120
|
+
agentId: this.extensionNumber,
|
|
2121
|
+
callId: activeCall.callId,
|
|
2122
|
+
phoneNumber: activeCall.lookupPhoneNumber ?? activeCall.phoneNumber,
|
|
2123
|
+
duration: activeCall.duration,
|
|
2124
|
+
status: 'disconnected',
|
|
2125
|
+
timestamp: new Date().toISOString(),
|
|
2126
|
+
callinginfo: 'calling',
|
|
2127
|
+
disconnectSide: 'AGENT',
|
|
2128
|
+
};
|
|
2129
|
+
this.avayaIPOService.logCall(dropLog).subscribe({
|
|
2130
|
+
error: (err) => console.error('logCall (dropCurrentCall) failed', err),
|
|
2131
|
+
});
|
|
2132
|
+
this.handleCallDisconnect(index, 'CALLER');
|
|
2133
|
+
// Force UI back to dialpad after manual drop
|
|
2134
|
+
this.zone.run(() => {
|
|
2135
|
+
this.showActiveCall = this.activeCalls.length > 0;
|
|
2136
|
+
if (!this.showActiveCall) {
|
|
2137
|
+
this.bottomActiveTab = 'keypad_sd';
|
|
2138
|
+
this.avayaIPOService.activeCallId = null;
|
|
2139
|
+
}
|
|
2140
|
+
this.cdr.detectChanges();
|
|
2141
|
+
});
|
|
2142
|
+
}
|
|
2143
|
+
onMute() {
|
|
2144
|
+
try {
|
|
2145
|
+
this.avayaIPOService.doMute();
|
|
2146
|
+
this.isMuted = !this.isMuted;
|
|
2147
|
+
}
|
|
2148
|
+
catch {
|
|
2149
|
+
console.log("couldn't mute");
|
|
2150
|
+
}
|
|
2151
|
+
}
|
|
2152
|
+
onUnmute() {
|
|
2153
|
+
try {
|
|
2154
|
+
this.avayaIPOService.doUnMute();
|
|
2155
|
+
this.isMuted = !this.isMuted;
|
|
2156
|
+
}
|
|
2157
|
+
catch {
|
|
2158
|
+
console.log("couldn't unmute");
|
|
2159
|
+
}
|
|
2160
|
+
}
|
|
2161
|
+
toggleHold() {
|
|
2162
|
+
if (!this.activeCalls[this.currentActiveCallIndex])
|
|
2163
|
+
return;
|
|
2164
|
+
if (this.activeCalls[this.currentActiveCallIndex].isOnHold) {
|
|
2165
|
+
this.avayaIPOService.doUnHold();
|
|
2166
|
+
this.activeCalls[this.currentActiveCallIndex].isOnHold = false;
|
|
2167
|
+
}
|
|
2168
|
+
else {
|
|
2169
|
+
this.avayaIPOService.doHold();
|
|
2170
|
+
this.activeCalls[this.currentActiveCallIndex].isOnHold = true;
|
|
2171
|
+
}
|
|
2172
|
+
}
|
|
2173
|
+
toggleMute() {
|
|
2174
|
+
if (!this.activeCalls[this.currentActiveCallIndex])
|
|
2175
|
+
return;
|
|
2176
|
+
if (this.activeCalls[this.currentActiveCallIndex].isMuted) {
|
|
2177
|
+
this.avayaIPOService.doUnMute();
|
|
2178
|
+
this.activeCalls[this.currentActiveCallIndex].isMuted = false;
|
|
2179
|
+
}
|
|
2180
|
+
else {
|
|
2181
|
+
this.avayaIPOService.doMute();
|
|
2182
|
+
this.activeCalls[this.currentActiveCallIndex].isMuted = true;
|
|
2183
|
+
}
|
|
2184
|
+
}
|
|
2185
|
+
onPauseVideo() {
|
|
2186
|
+
this.avayaIPOService.pauseVideo();
|
|
2187
|
+
}
|
|
2188
|
+
onResumeVideo() {
|
|
2189
|
+
this.avayaIPOService.playVideo();
|
|
2190
|
+
}
|
|
2191
|
+
onDigitClick(digit) {
|
|
2192
|
+
const currentValue = this.transferForm.get('target')?.value || '';
|
|
2193
|
+
this.transferForm.patchValue({ target: currentValue + digit });
|
|
2194
|
+
}
|
|
2195
|
+
onBackspace() {
|
|
2196
|
+
const currentValue = this.transferForm.get('target')?.value || '';
|
|
2197
|
+
if (currentValue.length > 0) {
|
|
2198
|
+
this.transferForm.patchValue({ target: currentValue.slice(0, -1) });
|
|
2199
|
+
}
|
|
2200
|
+
}
|
|
2201
|
+
onTransferCall() {
|
|
2202
|
+
this.istransfer = true;
|
|
2203
|
+
if (this.transferForm.valid) {
|
|
2204
|
+
const { target } = this.transferForm.value;
|
|
2205
|
+
console.log('Transfer Target:', target);
|
|
2206
|
+
const type = 'unAttended';
|
|
2207
|
+
this.avayaIPOService.transferCall(target, type);
|
|
2208
|
+
}
|
|
2209
|
+
else {
|
|
2210
|
+
console.error('Transfer form is invalid.');
|
|
2211
|
+
}
|
|
2212
|
+
}
|
|
2213
|
+
onSendDTMF(digit) {
|
|
2214
|
+
this.avayaIPOService.sendDTMF(digit);
|
|
2215
|
+
const currentValue = this.dtmfForm.get('dtmf')?.value || '';
|
|
2216
|
+
this.dtmfForm.patchValue({ dtmf: currentValue + digit });
|
|
2217
|
+
}
|
|
2218
|
+
onAnswerCall() {
|
|
2219
|
+
this.avayaIPOService.answerCall();
|
|
2220
|
+
this.isRinging = false;
|
|
2221
|
+
// this.stopRingtone();
|
|
2222
|
+
this.showActiveCall = true;
|
|
2223
|
+
}
|
|
2224
|
+
onAddVideo() {
|
|
2225
|
+
this.avayaIPOService.addVideo();
|
|
2226
|
+
}
|
|
2227
|
+
onRemoveVideo() {
|
|
2228
|
+
this.avayaIPOService.removeVideo();
|
|
2229
|
+
}
|
|
2230
|
+
allowOnlyNumbers(event) {
|
|
2231
|
+
const input = event.target;
|
|
2232
|
+
input.value = input.value.replace(/[^0-9]/g, '');
|
|
2233
|
+
}
|
|
2234
|
+
startTimer(index) {
|
|
2235
|
+
const call = this.activeCalls[index];
|
|
2236
|
+
if (!call || call.timer)
|
|
2237
|
+
return;
|
|
2238
|
+
call.timer = setInterval(() => {
|
|
2239
|
+
call.duration++;
|
|
2240
|
+
// this.cdr.detectChanges();
|
|
2241
|
+
this.cdr.markForCheck();
|
|
2242
|
+
}, 1000);
|
|
2243
|
+
}
|
|
2244
|
+
clearTimer(index) {
|
|
2245
|
+
const call = this.activeCalls[index];
|
|
2246
|
+
if (call?.timer) {
|
|
2247
|
+
clearInterval(call.timer);
|
|
2248
|
+
call.timer = null;
|
|
2249
|
+
}
|
|
2250
|
+
}
|
|
2251
|
+
formatTime(totalSeconds) {
|
|
2252
|
+
const minutes = Math.floor(totalSeconds / 60);
|
|
2253
|
+
const seconds = totalSeconds % 60;
|
|
2254
|
+
return (String(minutes).padStart(2, '0') + ':' + String(seconds).padStart(2, '0'));
|
|
2255
|
+
}
|
|
2256
|
+
menuDailpad() {
|
|
2257
|
+
this.isDailpadOpen = !this.isDailpadOpen;
|
|
2258
|
+
this.cdr.detectChanges();
|
|
2259
|
+
}
|
|
2260
|
+
async selectTab(tab) {
|
|
2261
|
+
this.activeTab = tab;
|
|
2262
|
+
/* if (tab === 'tab1') {
|
|
2263
|
+
await this.loadCallHistory();
|
|
2264
|
+
} */
|
|
2265
|
+
}
|
|
2266
|
+
async fetchContacts() {
|
|
2267
|
+
const size = 50;
|
|
2268
|
+
let start = 0;
|
|
2269
|
+
let allContacts = [];
|
|
2270
|
+
while (true) {
|
|
2271
|
+
const queryString = `q=(and (term field%3Dtenant_id '${this.tenantId}'))&size=${size}&start=${start}&q.parser=structured`;
|
|
2272
|
+
try {
|
|
2273
|
+
const res_searchEntities = await this.searchEntities(queryString);
|
|
2274
|
+
const hits = res_searchEntities?.hits?.hit;
|
|
2275
|
+
if (!Array.isArray(hits) || hits.length === 0) {
|
|
2276
|
+
break;
|
|
2277
|
+
}
|
|
2278
|
+
allContacts = [...allContacts, ...hits];
|
|
2279
|
+
start += size;
|
|
2280
|
+
}
|
|
2281
|
+
catch (error) {
|
|
2282
|
+
console.error('Error fetching contacts:', error);
|
|
2283
|
+
break;
|
|
2284
|
+
}
|
|
2285
|
+
}
|
|
2286
|
+
this.contacts = allContacts;
|
|
2287
|
+
}
|
|
2288
|
+
searchEntities(queryString) {
|
|
2289
|
+
return lastValueFrom(this.http.get('https://search.snugdesk.com/entities?' + queryString));
|
|
2290
|
+
}
|
|
2291
|
+
handleCallConnect() {
|
|
2292
|
+
console.log("handle call connect ----------------------------");
|
|
2293
|
+
const active = this.activeCalls[this.currentActiveCallIndex];
|
|
2294
|
+
if (!active)
|
|
2295
|
+
return;
|
|
2296
|
+
const { callId, phoneNumber } = active;
|
|
2297
|
+
const callMetadata = {
|
|
2298
|
+
tenantId: this.tenantId,
|
|
2299
|
+
agentId: this.extensionNumber,
|
|
2300
|
+
callId,
|
|
2301
|
+
phoneNumber,
|
|
2302
|
+
};
|
|
2303
|
+
this.callSocket.open(callMetadata);
|
|
2304
|
+
// Update UI and call state
|
|
2305
|
+
this.startTimer(this.currentActiveCallIndex);
|
|
2306
|
+
this.isRinging = false;
|
|
2307
|
+
this.isactiveCall = true;
|
|
2308
|
+
console.log("this.isactiveCall = ", this.isactiveCall);
|
|
2309
|
+
this.isCalling = false;
|
|
2310
|
+
this.showActiveCall = true;
|
|
2311
|
+
// Log call as answered/connected so the same ids can be updated later on disconnect
|
|
2312
|
+
const callLogPayload = {
|
|
2313
|
+
tenantId: this.tenantId,
|
|
2314
|
+
agentId: this.extensionNumber,
|
|
2315
|
+
callId,
|
|
2316
|
+
phoneNumber: active.lookupPhoneNumber ?? active.phoneNumber,
|
|
2317
|
+
direction: this.wasInbound ? 'inbound' : 'outbound',
|
|
2318
|
+
duration: active.duration,
|
|
2319
|
+
status: 'connected',
|
|
2320
|
+
timestamp: new Date().toISOString(),
|
|
2321
|
+
callinginfo: 'calling',
|
|
2322
|
+
};
|
|
2323
|
+
this.avayaIPOService.logCall(callLogPayload).subscribe({
|
|
2324
|
+
error: (err) => console.error('logCall (connected) failed', err),
|
|
2325
|
+
});
|
|
2326
|
+
this.cdr.detectChanges();
|
|
2327
|
+
const local = this.lastLocalStream || undefined;
|
|
2328
|
+
const remote = this.lastRemoteStream || undefined;
|
|
2329
|
+
const hasAudio = (stream) => stream instanceof MediaStream && stream.getAudioTracks().length > 0;
|
|
2330
|
+
if (hasAudio(remote) && hasAudio(local)) {
|
|
2331
|
+
console.debug(`[${callId}] Starting recording with available local & remote streams`);
|
|
2332
|
+
this.recordingManagerService.startRecording(local, remote, callMetadata);
|
|
2333
|
+
this.initTranscription();
|
|
2334
|
+
this.recognition.start();
|
|
2335
|
+
this.showTranscriptionPopup = true;
|
|
2336
|
+
this.transcriptSegments = [];
|
|
2337
|
+
this.transcriptHistory = [];
|
|
2338
|
+
this.transcriptText = '';
|
|
2339
|
+
this.transcriptStartedAt = Date.now();
|
|
2340
|
+
return;
|
|
2341
|
+
}
|
|
2342
|
+
console.debug(`[${callId}] Waiting for remote stream...`);
|
|
2343
|
+
const remoteStreamSubscription = this.avayaIPOService.remoteStream$
|
|
2344
|
+
.pipe(filter((r) => !!r && r.callId === callId), filter((r) => r.stream.getAudioTracks().length > 0))
|
|
2345
|
+
.subscribe({
|
|
2346
|
+
next: ({ stream: freshRemote }) => {
|
|
2347
|
+
const freshLocal = this.avayaIPOService.localStream;
|
|
2348
|
+
console.debug(`[${callId}] Remote stream received! Starting recording.`);
|
|
2349
|
+
this.recordingManagerService.startRecording(freshLocal, freshRemote, callMetadata);
|
|
2350
|
+
this.initTranscription();
|
|
2351
|
+
this.recognition.start();
|
|
2352
|
+
this.showTranscriptionPopup = true;
|
|
2353
|
+
this.transcriptSegments = [];
|
|
2354
|
+
this.transcriptHistory = [];
|
|
2355
|
+
this.transcriptText = '';
|
|
2356
|
+
this.transcriptStartedAt = Date.now();
|
|
2357
|
+
remoteStreamSubscription.unsubscribe(); // stop listening after the first hit
|
|
2358
|
+
},
|
|
2359
|
+
error: (err) => {
|
|
2360
|
+
console.error(`[${callId}] Error receiving remote stream:`, err);
|
|
2361
|
+
remoteStreamSubscription.unsubscribe();
|
|
2362
|
+
},
|
|
2363
|
+
});
|
|
2364
|
+
}
|
|
2365
|
+
handleCallDisconnect(index, disconnectSide) {
|
|
2366
|
+
console.log('+++++++++++++++++handle disconnect trigered++++++++++++++');
|
|
2367
|
+
this.disconnecttriggered = false;
|
|
2368
|
+
this.isAddingNewCall = false;
|
|
2369
|
+
this.isCalling = false;
|
|
2370
|
+
this.isRecording = false;
|
|
2371
|
+
console.log(`Disconnecting call at index ${index}. Active calls before:`, this.activeCalls);
|
|
2372
|
+
if (index < 0 || index >= this.activeCalls.length) {
|
|
2373
|
+
console.warn(`Invalid index ${index}, activeCalls.length = ${this.activeCalls.length}`);
|
|
2374
|
+
return;
|
|
2375
|
+
}
|
|
2376
|
+
const disconnectingCall = this.activeCalls[index];
|
|
2377
|
+
this.clearTimer(index);
|
|
2378
|
+
const callId = this.activeCalls[this.currentActiveCallIndex].callId;
|
|
2379
|
+
this.recordingManagerService.stopRecording(disconnectingCall.callId);
|
|
2380
|
+
console.log('***********stopping recording in disconnect***********');
|
|
2381
|
+
this.callSocket.close(callId);
|
|
2382
|
+
// const callData = {
|
|
2383
|
+
// tenantId: this.tenantId,
|
|
2384
|
+
// agentId: this.extensionNumber,
|
|
2385
|
+
// callId: this.avayaIPOService.currentcallId,
|
|
2386
|
+
// // phoneNumber: disconnectingCall.phoneNumber,
|
|
2387
|
+
// phoneNumber:
|
|
2388
|
+
// this.activeCalls[this.currentActiveCallIndex].lookupPhoneNumber,
|
|
2389
|
+
// direction: this.wasInbound ? 'inbound' : 'outbound',
|
|
2390
|
+
// duration: disconnectingCall.duration,
|
|
2391
|
+
// status: 'disconnected',
|
|
2392
|
+
// timestamp: new Date().toISOString(),
|
|
2393
|
+
// callinginfo: 'calling',
|
|
2394
|
+
// };
|
|
2395
|
+
const callData = {
|
|
2396
|
+
tenantId: this.tenantId,
|
|
2397
|
+
agentId: this.extensionNumber,
|
|
2398
|
+
callId: disconnectingCall.callId,
|
|
2399
|
+
phoneNumber: disconnectingCall.lookupPhoneNumber,
|
|
2400
|
+
direction: this.wasInbound ? 'inbound' : 'outbound',
|
|
2401
|
+
duration: disconnectingCall.duration,
|
|
2402
|
+
status: 'disconnected',
|
|
2403
|
+
timestamp: new Date().toISOString(),
|
|
2404
|
+
callinginfo: 'calling',
|
|
2405
|
+
disconnectSide: disconnectSide
|
|
2406
|
+
};
|
|
2407
|
+
this.avayaIPOService.logCall(callData).subscribe(() => { }, (err) => console.error(err));
|
|
2408
|
+
this.lastDisconnectedCall = {
|
|
2409
|
+
...disconnectingCall,
|
|
2410
|
+
};
|
|
2411
|
+
this.activeCalls.splice(index, 1);
|
|
2412
|
+
console.log('Active calls after removal:', this.activeCalls);
|
|
2413
|
+
if (index === this.currentActiveCallIndex) {
|
|
2414
|
+
if (this.activeCalls.length > 0) {
|
|
2415
|
+
this.currentActiveCallIndex = 0;
|
|
2416
|
+
const newActive = this.activeCalls[0];
|
|
2417
|
+
this.lookupPhoneNumber = newActive.phoneNumber;
|
|
2418
|
+
// this.lookupPhoneNumber = newActive.lookupPhoneNumber; TODO to check whats happening here
|
|
2419
|
+
this.startTimer(0);
|
|
2420
|
+
this.isMuted = newActive.isMuted;
|
|
2421
|
+
this.isOnHold = false;
|
|
2422
|
+
this.showActiveCall = true;
|
|
2423
|
+
this.isactiveCall = true;
|
|
2424
|
+
this.avayaIPOService.activeCallId = newActive.callId;
|
|
2425
|
+
this.avayaIPOService.doUnHold();
|
|
2426
|
+
newActive.isOnHold = false;
|
|
2427
|
+
for (let i = 1; i < this.activeCalls.length; i++) {
|
|
2428
|
+
const other = this.activeCalls[i];
|
|
2429
|
+
this.avayaIPOService.activeCallId = other.callId;
|
|
2430
|
+
this.avayaIPOService.doHold();
|
|
2431
|
+
other.isOnHold = true;
|
|
2432
|
+
}
|
|
2433
|
+
console.log(`Switched active call to slot ${newActive.slot} (index=0)`);
|
|
2434
|
+
}
|
|
2435
|
+
else {
|
|
2436
|
+
this.showCallDisconnected = true;
|
|
2437
|
+
this.isactiveCall = false;
|
|
2438
|
+
this.isMuted = false;
|
|
2439
|
+
this.isOnHold = false;
|
|
2440
|
+
console.log('flag value for isCalling', this.isCalling);
|
|
2441
|
+
this.showActiveCall = false; // return to dialpad view when no calls remain
|
|
2442
|
+
this.bottomActiveTab = 'keypad_sd';
|
|
2443
|
+
this.avayaIPOService.activeCallId = null;
|
|
2444
|
+
if (!this.isCalling) {
|
|
2445
|
+
this.phoneNumber = '';
|
|
2446
|
+
this.lookupPhoneNumber = null;
|
|
2447
|
+
}
|
|
2448
|
+
this.istransfer = false;
|
|
2449
|
+
this.showCallDisconnected = false;
|
|
2450
|
+
this.cdr.detectChanges();
|
|
2451
|
+
}
|
|
2452
|
+
}
|
|
2453
|
+
else if (index < this.currentActiveCallIndex) {
|
|
2454
|
+
this.currentActiveCallIndex--;
|
|
2455
|
+
}
|
|
2456
|
+
this.transferForm.reset();
|
|
2457
|
+
this.dtmfForm.reset();
|
|
2458
|
+
this.isDailpadOpen = false;
|
|
2459
|
+
this.isCallTransferOpen = false;
|
|
2460
|
+
this.isRinging = false;
|
|
2461
|
+
setTimeout(() => {
|
|
2462
|
+
this.showActiveCall = this.activeCalls.length > 0;
|
|
2463
|
+
this.cdr.detectChanges();
|
|
2464
|
+
}, 3000);
|
|
2465
|
+
console.log('handleCallDisconnect() done. new active index =', this.currentActiveCallIndex);
|
|
2466
|
+
console.log('active call div decider ', this.showActiveCall);
|
|
2467
|
+
this.stopTranscription(disconnectingCall.callId);
|
|
2468
|
+
}
|
|
2469
|
+
goToDiv(div) {
|
|
2470
|
+
this.currentView = div;
|
|
2471
|
+
}
|
|
2472
|
+
restrictNumeric(e) {
|
|
2473
|
+
const allowedKeys = [
|
|
2474
|
+
'Enter',
|
|
2475
|
+
'Backspace',
|
|
2476
|
+
'ArrowLeft',
|
|
2477
|
+
'ArrowRight',
|
|
2478
|
+
'Tab',
|
|
2479
|
+
'Delete',
|
|
2480
|
+
];
|
|
2481
|
+
return /^[0-9]$/.test(e.key) || allowedKeys.includes(e.key);
|
|
2482
|
+
}
|
|
2483
|
+
onRedial() {
|
|
2484
|
+
this.isredialling = true;
|
|
2485
|
+
if (!this.phoneNumber) {
|
|
2486
|
+
console.log('returninggggggg');
|
|
2487
|
+
return;
|
|
2488
|
+
}
|
|
2489
|
+
if (this.redialTimeout) {
|
|
2490
|
+
console.log('redialingggggggggggggggg');
|
|
2491
|
+
this.istransfer = false;
|
|
2492
|
+
this.showCallDisconnected = false;
|
|
2493
|
+
clearTimeout(this.redialTimeout);
|
|
2494
|
+
this.redialTimeout = null;
|
|
2495
|
+
}
|
|
2496
|
+
this.isCalling = true;
|
|
2497
|
+
this.makeCall(this.redialnumber);
|
|
2498
|
+
}
|
|
2499
|
+
swapLinesToIndex(index) {
|
|
2500
|
+
const slotMap = ['1', '2', '3'];
|
|
2501
|
+
if (index < 0 || index >= slotMap.length) {
|
|
2502
|
+
console.warn('Index out of range for slotMap');
|
|
2503
|
+
return;
|
|
2504
|
+
}
|
|
2505
|
+
const targetSlot = slotMap[index];
|
|
2506
|
+
this.avayaIPOService.swapToSlot(targetSlot);
|
|
2507
|
+
this.activeCalls.forEach((call, i) => {
|
|
2508
|
+
if (call.slot === targetSlot) {
|
|
2509
|
+
call.isOnHold = false;
|
|
2510
|
+
this.currentActiveCallIndex = i;
|
|
2511
|
+
}
|
|
2512
|
+
else {
|
|
2513
|
+
call.isOnHold = true;
|
|
2514
|
+
}
|
|
2515
|
+
});
|
|
2516
|
+
// this.currentActiveCallIndex = index;x
|
|
2517
|
+
}
|
|
2518
|
+
mergeCall() {
|
|
2519
|
+
console.log('******************* merging ******************');
|
|
2520
|
+
this.avayaIPOService.mergeCall();
|
|
2521
|
+
}
|
|
2522
|
+
onAddCall() {
|
|
2523
|
+
this.isCallTransferOpen = false;
|
|
2524
|
+
this.isAddingNewCall = true;
|
|
2525
|
+
// this.dialForm.reset();
|
|
2526
|
+
}
|
|
2527
|
+
getDisplayStatus(call) {
|
|
2528
|
+
if (call.direction === 'inbound' &&
|
|
2529
|
+
call.status === 'disconnected' &&
|
|
2530
|
+
call.duration === 0) {
|
|
2531
|
+
return 'Missed';
|
|
2532
|
+
}
|
|
2533
|
+
// If status is "connected"
|
|
2534
|
+
if (call.status === 'connected') {
|
|
2535
|
+
return 'Connected';
|
|
2536
|
+
}
|
|
2537
|
+
// If status is "disconnected" but not missed
|
|
2538
|
+
if (call.status === 'disconnected') {
|
|
2539
|
+
return 'Disconnected';
|
|
2540
|
+
}
|
|
2541
|
+
// Otherwise show the raw status
|
|
2542
|
+
return call.status;
|
|
2543
|
+
}
|
|
2544
|
+
bottomSelectTab(tab) {
|
|
2545
|
+
this.bottomActiveTab = tab;
|
|
2546
|
+
}
|
|
2547
|
+
/** Central place to notify AvayaIPOService about current picks */
|
|
2548
|
+
handleDeviceSelection(event) {
|
|
2549
|
+
this.avayaIPOService.setDeviceIds({
|
|
2550
|
+
defaultId: true,
|
|
2551
|
+
audioInputID: event.audioInputId || undefined,
|
|
2552
|
+
audioOutputID: event.audioOutputId || undefined,
|
|
2553
|
+
videoInputID: event.videoInputId || undefined,
|
|
2554
|
+
});
|
|
2555
|
+
}
|
|
2556
|
+
createMixedStream(local, remote) {
|
|
2557
|
+
const audioContext = new AudioContext();
|
|
2558
|
+
const destination = audioContext.createMediaStreamDestination();
|
|
2559
|
+
// Local stream
|
|
2560
|
+
if (local) {
|
|
2561
|
+
const localSource = audioContext.createMediaStreamSource(local);
|
|
2562
|
+
localSource.connect(destination);
|
|
2563
|
+
}
|
|
2564
|
+
// Remote stream
|
|
2565
|
+
if (remote) {
|
|
2566
|
+
const remoteSource = audioContext.createMediaStreamSource(remote);
|
|
2567
|
+
remoteSource.connect(destination);
|
|
2568
|
+
}
|
|
2569
|
+
return destination.stream;
|
|
2570
|
+
}
|
|
2571
|
+
initTranscription() {
|
|
2572
|
+
const SpeechRecognition = window.SpeechRecognition ||
|
|
2573
|
+
window.webkitSpeechRecognition;
|
|
2574
|
+
if (!SpeechRecognition) {
|
|
2575
|
+
console.error('Web Speech API is not supported in this browser.');
|
|
2576
|
+
return;
|
|
2577
|
+
}
|
|
2578
|
+
this.recognition = new SpeechRecognition();
|
|
2579
|
+
this.recognition.lang = 'en-US'; // change as needed
|
|
2580
|
+
this.recognition.continuous = true;
|
|
2581
|
+
this.recognition.interimResults = true;
|
|
2582
|
+
this.recognition.onresult = (event) => {
|
|
2583
|
+
let interimTranscript = '';
|
|
2584
|
+
for (let i = event.resultIndex; i < event.results.length; ++i) {
|
|
2585
|
+
if (event.results[i].isFinal) {
|
|
2586
|
+
const text = event.results[i][0].transcript.trim();
|
|
2587
|
+
this.transcriptHistory.push(text);
|
|
2588
|
+
// ⬇️ ADD: store finals w/ timestamp for summary
|
|
2589
|
+
this.transcriptSegments.push({ ts: Date.now(), text });
|
|
2590
|
+
}
|
|
2591
|
+
else {
|
|
2592
|
+
interimTranscript += event.results[i][0].transcript;
|
|
2593
|
+
}
|
|
2594
|
+
}
|
|
2595
|
+
this.transcriptText = [...this.transcriptHistory, interimTranscript].join(' ');
|
|
2596
|
+
console.log('Live Transcription:', this.transcriptText, this.transcriptHistory);
|
|
2597
|
+
this.cdr.detectChanges();
|
|
2598
|
+
};
|
|
2599
|
+
this.recognition.onerror = (event) => {
|
|
2600
|
+
console.error('Transcription error:', event.error);
|
|
2601
|
+
};
|
|
2602
|
+
this.recognition.onend = () => {
|
|
2603
|
+
if (this.showTranscriptionPopup) {
|
|
2604
|
+
console.log('Recognition ended, restarting…');
|
|
2605
|
+
try {
|
|
2606
|
+
this.recognition.start();
|
|
2607
|
+
}
|
|
2608
|
+
catch (err) {
|
|
2609
|
+
console.warn('Error restarting recognition:', err);
|
|
2610
|
+
}
|
|
2611
|
+
}
|
|
2612
|
+
};
|
|
2613
|
+
// 👇 Manual keep-alive every 25s
|
|
2614
|
+
if (this.recognitionKeepAlive) {
|
|
2615
|
+
clearInterval(this.recognitionKeepAlive);
|
|
2616
|
+
}
|
|
2617
|
+
this.recognitionKeepAlive = setInterval(() => {
|
|
2618
|
+
if (this.showTranscriptionPopup && this.recognition) {
|
|
2619
|
+
console.log('Force restarting recognition (keep-alive)…');
|
|
2620
|
+
try {
|
|
2621
|
+
this.recognition.stop(); // will trigger onend → restart
|
|
2622
|
+
}
|
|
2623
|
+
catch (err) {
|
|
2624
|
+
console.warn('Error stopping recognition:', err);
|
|
2625
|
+
}
|
|
2626
|
+
}
|
|
2627
|
+
}, 10000);
|
|
2628
|
+
}
|
|
2629
|
+
stopTranscription(callId) {
|
|
2630
|
+
// mark end BEFORE clearing anything
|
|
2631
|
+
this.transcriptEndedAt = Date.now();
|
|
2632
|
+
if (this.recognitionKeepAlive) {
|
|
2633
|
+
clearInterval(this.recognitionKeepAlive);
|
|
2634
|
+
this.recognitionKeepAlive = null;
|
|
2635
|
+
}
|
|
2636
|
+
if (this.recognition) {
|
|
2637
|
+
try {
|
|
2638
|
+
this.recognition.onend = null; // prevent auto-restart during teardown
|
|
2639
|
+
this.recognition.stop();
|
|
2640
|
+
}
|
|
2641
|
+
catch { }
|
|
2642
|
+
}
|
|
2643
|
+
// ⬇️ NEW: build + download markdown summary (if there is content)
|
|
2644
|
+
if (this.autoDownloadSummaryOnEnd && this.transcriptSegments.length > 0) {
|
|
2645
|
+
this.generateAndDownloadSummary(callId);
|
|
2646
|
+
}
|
|
2647
|
+
// cleanup live state (leave segments cleared after download)
|
|
2648
|
+
this.transcriptText = '';
|
|
2649
|
+
this.transcriptHistory = [];
|
|
2650
|
+
this.transcriptSegments = [];
|
|
2651
|
+
this.transcriptStartedAt = 0;
|
|
2652
|
+
this.transcriptEndedAt = 0;
|
|
2653
|
+
this.showTranscriptionPopup = false;
|
|
2654
|
+
}
|
|
2655
|
+
// Build + download a Markdown summary using lightweight extractive heuristics
|
|
2656
|
+
generateAndDownloadSummary(callId) {
|
|
2657
|
+
const fullText = this.transcriptSegments.map(s => s.text).join(' ');
|
|
2658
|
+
if (!fullText.trim())
|
|
2659
|
+
return;
|
|
2660
|
+
const bullets = this.buildExtractiveSummary(fullText, 5); // 5 highlight bullets
|
|
2661
|
+
const actions = this.extractActionItems(fullText);
|
|
2662
|
+
const keyInfo = this.extractKeyInfo(fullText);
|
|
2663
|
+
const mdLines = [];
|
|
2664
|
+
mdLines.push('# Call Summary');
|
|
2665
|
+
mdLines.push(`**Call ID:** ${callId ?? '-'}`);
|
|
2666
|
+
mdLines.push(`**Agent:** ${this.extensionNumber} `);
|
|
2667
|
+
mdLines.push(`**Tenant:** ${this.tenantId}`);
|
|
2668
|
+
mdLines.push(`**Start:** ${this.transcriptStartedAt ? new Date(this.transcriptStartedAt).toISOString() : '-'}`);
|
|
2669
|
+
mdLines.push(`**End:** ${this.transcriptEndedAt ? new Date(this.transcriptEndedAt).toISOString() : '-'}`);
|
|
2670
|
+
const durMs = (this.transcriptStartedAt && this.transcriptEndedAt)
|
|
2671
|
+
? (this.transcriptEndedAt - this.transcriptStartedAt) : 0;
|
|
2672
|
+
mdLines.push(`**Duration:** ${this.fmtHMS(durMs)}`);
|
|
2673
|
+
mdLines.push('');
|
|
2674
|
+
mdLines.push('## Highlights');
|
|
2675
|
+
if (bullets.length)
|
|
2676
|
+
bullets.forEach(b => mdLines.push(`- ${b}`));
|
|
2677
|
+
else
|
|
2678
|
+
mdLines.push('- (no highlights)');
|
|
2679
|
+
if (actions.length) {
|
|
2680
|
+
mdLines.push('', '## Action Items');
|
|
2681
|
+
actions.forEach(a => mdLines.push(`- [ ] ${a}`));
|
|
2682
|
+
}
|
|
2683
|
+
if (keyInfo.length) {
|
|
2684
|
+
mdLines.push('', '## Key Info');
|
|
2685
|
+
keyInfo.forEach(k => mdLines.push(`- ${k}`));
|
|
2686
|
+
}
|
|
2687
|
+
// Optional appendix: full transcript with timestamps
|
|
2688
|
+
mdLines.push('', '## Transcript (final lines)');
|
|
2689
|
+
for (const seg of this.transcriptSegments) {
|
|
2690
|
+
const offset = seg.ts - (this.transcriptStartedAt || seg.ts);
|
|
2691
|
+
mdLines.push(`[${this.fmtHMS(offset)}] ${seg.text}`);
|
|
2692
|
+
}
|
|
2693
|
+
const mdBlob = new Blob([mdLines.join('\n')], { type: 'text/markdown;charset=utf-8' });
|
|
2694
|
+
const name = `call-${callId || 'unknown'}-summary.md`;
|
|
2695
|
+
this.downloadBlobFile(mdBlob, name);
|
|
2696
|
+
// store in memory if you also want to show it somewhere
|
|
2697
|
+
this.summaryText = mdLines.join('\n');
|
|
2698
|
+
}
|
|
2699
|
+
// === extractive “enough” summarizer ===
|
|
2700
|
+
buildExtractiveSummary(text, maxBullets = 5) {
|
|
2701
|
+
const sents = this.splitSentences(text);
|
|
2702
|
+
if (sents.length <= maxBullets)
|
|
2703
|
+
return sents;
|
|
2704
|
+
const stop = new Set(('i,me,my,myself,we,our,ours,ourselves,you,your,yours,' +
|
|
2705
|
+
'he,him,his,she,her,hers,it,its,they,them,their,theirs,what,which,who,whom,' +
|
|
2706
|
+
'this,that,these,those,am,is,are,was,were,be,been,being,have,has,had,do,does,' +
|
|
2707
|
+
'did,doing,a,an,the,and,but,if,or,because,as,until,while,of,at,by,for,with,' +
|
|
2708
|
+
'about,against,between,into,through,during,before,after,above,below,to,from,' +
|
|
2709
|
+
'up,down,in,out,on,off,over,under,again,further,then,once,here,there,when,' +
|
|
2710
|
+
'where,why,how,all,any,both,each,few,more,most,other,some,such,no,nor,not,' +
|
|
2711
|
+
'only,own,same,so,than,too,very,can,will,just,don,should,now').split(','));
|
|
2712
|
+
const tokenize = (s) => s.toLowerCase().replace(/[^a-z0-9\s]/g, ' ')
|
|
2713
|
+
.split(/\s+/).filter(w => w && !stop.has(w));
|
|
2714
|
+
const freq = new Map();
|
|
2715
|
+
for (const s of sents)
|
|
2716
|
+
for (const w of tokenize(s))
|
|
2717
|
+
freq.set(w, (freq.get(w) || 0) + 1);
|
|
2718
|
+
const scored = sents.map((s, i) => {
|
|
2719
|
+
const words = tokenize(s);
|
|
2720
|
+
const score = words.reduce((acc, w) => acc + (freq.get(w) || 0), 0) / Math.max(1, words.length);
|
|
2721
|
+
return { i, s, score };
|
|
2722
|
+
});
|
|
2723
|
+
return scored
|
|
2724
|
+
.sort((a, b) => b.score - a.score)
|
|
2725
|
+
.slice(0, maxBullets)
|
|
2726
|
+
.sort((a, b) => a.i - b.i)
|
|
2727
|
+
.map(x => x.s.trim());
|
|
2728
|
+
}
|
|
2729
|
+
splitSentences(text) {
|
|
2730
|
+
return text
|
|
2731
|
+
.replace(/\s+/g, ' ')
|
|
2732
|
+
.split(/(?<=[.!?])\s+(?=[A-Z0-9])/g)
|
|
2733
|
+
.map(s => s.trim())
|
|
2734
|
+
.filter(Boolean);
|
|
2735
|
+
}
|
|
2736
|
+
extractActionItems(text) {
|
|
2737
|
+
const sents = this.splitSentences(text);
|
|
2738
|
+
const pat = /(need to|please|send|share|call|schedule|arrange|follow up|email|whatsapp|provide|confirm|deliver|prepare|create|set up|book|assign|remind)/i;
|
|
2739
|
+
return sents.filter(s => pat.test(s)).slice(0, 12);
|
|
2740
|
+
}
|
|
2741
|
+
extractKeyInfo(text) {
|
|
2742
|
+
const out = [];
|
|
2743
|
+
const phones = text.match(/(?:\+?\d[\s-]?){8,15}\d/g) || [];
|
|
2744
|
+
const emails = text.match(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi) || [];
|
|
2745
|
+
const amounts = text.match(/(?:₹|\$|INR\s?)\s?\d[\d,]*(?:\.\d+)?/g) || [];
|
|
2746
|
+
const dates = text.match(/\b(?:\d{1,2}[-/]\d{1,2}[-/]\d{2,4}|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\s+\d{1,2}(?:,\s*\d{4})?)\b/gi) || [];
|
|
2747
|
+
if (phones.length)
|
|
2748
|
+
out.push(`Phones: ${Array.from(new Set(phones)).join(', ')}`);
|
|
2749
|
+
if (emails.length)
|
|
2750
|
+
out.push(`Emails: ${Array.from(new Set(emails)).join(', ')}`);
|
|
2751
|
+
if (amounts.length)
|
|
2752
|
+
out.push(`Amounts: ${Array.from(new Set(amounts)).join(', ')}`);
|
|
2753
|
+
if (dates.length)
|
|
2754
|
+
out.push(`Dates: ${Array.from(new Set(dates)).join(', ')}`);
|
|
2755
|
+
return out;
|
|
2756
|
+
}
|
|
2757
|
+
downloadBlobFile(blob, filename) {
|
|
2758
|
+
const url = URL.createObjectURL(blob);
|
|
2759
|
+
const a = document.createElement('a');
|
|
2760
|
+
a.href = url;
|
|
2761
|
+
a.download = filename;
|
|
2762
|
+
document.body.appendChild(a);
|
|
2763
|
+
a.click();
|
|
2764
|
+
a.remove();
|
|
2765
|
+
URL.revokeObjectURL(url);
|
|
2766
|
+
}
|
|
2767
|
+
fmtHMS(ms) {
|
|
2768
|
+
const totalSec = Math.floor(ms / 1000);
|
|
2769
|
+
const h = Math.floor(totalSec / 3600);
|
|
2770
|
+
const m = Math.floor((totalSec % 3600) / 60);
|
|
2771
|
+
const s = totalSec % 60;
|
|
2772
|
+
return (h > 0 ? String(h).padStart(2, '0') + ':' : '') +
|
|
2773
|
+
String(m).padStart(2, '0') + ':' + String(s).padStart(2, '0');
|
|
2774
|
+
}
|
|
2775
|
+
// add this method in the component class
|
|
2776
|
+
transferToFromHistory(item) {
|
|
2777
|
+
// prefer a previously-resolved dialable if you store one
|
|
2778
|
+
const prefer = (v) => (v ?? '').toString().replace(/\s+/g, '');
|
|
2779
|
+
let target = prefer(item.resolvedDialable) ||
|
|
2780
|
+
prefer(item.lookupPhoneNumber?.['local-number']) ||
|
|
2781
|
+
prefer(item.lookupPhoneNumber?.lookupPhoneNumber?.['local-number']) ||
|
|
2782
|
+
prefer(item.lookupPhoneNumber?.normalizedPhoneNumber) ||
|
|
2783
|
+
prefer(item.phoneNumber);
|
|
2784
|
+
if (!target) {
|
|
2785
|
+
console.warn('Transfer aborted: no dialable number found in recent item:', item);
|
|
2786
|
+
return;
|
|
2787
|
+
}
|
|
2788
|
+
// IMPORTANT: transfer, not makeCall
|
|
2789
|
+
this.avayaIPOService.transferCall(target, 'unAttended'); // or 'Blind'
|
|
2790
|
+
this.isCallTransferOpen = false; // close transfer UI if you want
|
|
2791
|
+
}
|
|
2792
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: AvayaIPOWidgetComponent, deps: [{ token: i1.HttpClient }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i1$1.FormBuilder }, { token: CountryService }, { token: PhoneNumberLookupService }, { token: AvayaIPOService }, { token: RecordingManagerService }, { token: CallSocketService }, { token: i8.SnugdeskAuthenticationService }, { token: i8.TenantService }, { token: i8.UserService }], target: i0.ɵɵFactoryTarget.Component });
|
|
2793
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: AvayaIPOWidgetComponent, isStandalone: false, selector: "snugdesk-avaya-ipo-widget", inputs: { tenantId: "tenantId", userId: "userId", isVisible: "isVisible", containerHeightObservable: "containerHeightObservable", containerWidthObservable: "containerWidthObservable" }, outputs: { notificationEvent: "notificationEvent" }, ngImport: i0, template: "@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\n @if (isReconnectingInProgress) {\n <span>Reconnecting to the server...</span>\n }\n\n @if (isFailoverInProgress) {\n <span>Failover in progress...</span>\n }\n\n @if (isFailbackInProgress) {\n <span>Failback in progress...</span>\n }\n\n <div class=\"container_connection_status_loader\">\n <div class=\"container_three_dot_loader\">\n <span class=\"dot\"></span>\n <span class=\"dot\"></span>\n <span class=\"dot\"></span>\n </div>\n </div>\n </div>\n </div>\n}\n\n\n\n@if (showLoginForm) {\n <!-- Login Form -->\n <div class=\"container_avaya_login\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n <div class=\"container_avaya_login_inner\">\n <div class=\"container_avaya_login_content\">\n\n <div class=\"container_avaya_logo\">\n <div class=\"container_avaya_logo_image\"></div>\n <h3>IP Office<span>TM</span></h3>\n </div>\n\n @if (hasAvayaSocketError || hasAvayaLoginError || hasAvayaLoginConflictError || hasAvayaDeviceError) {\n <div class=\"container_avaya_login_error\">\n <p class=\"message_label error_message\">\n @if (hasAvayaSocketError) {\n We're having trouble connecting to the server\n }\n @if (hasAvayaLoginError) {\n Invalid extension or password!\n }\n @if (hasAvayaLoginConflictError) {\n Another user is logged in with this extension\n }\n @if (hasAvayaDeviceError) {\n We're having trouble accessing your device\n }\n </p>\n </div>\n }\n\n <div class=\"container_avaya_login_form\">\n <form [formGroup]=\"loginForm\" (ngSubmit)=\"onLogin()\">\n\n <!-- Extension -->\n <div class=\"form_field\">\n <mat-form-field class=\"properties_form_field mat-form-field-outline\">\n <mat-label class=\"mdc-floating-disabled\">Extension</mat-label>\n <input matInput formControlName=\"ipoExtensionNo\" autocomplete=\"ipoExtensionNo\"\n (keypress)=\"restrictNumeric($event)\" />\n\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 </div>\n\n <!-- Password -->\n <div class=\"form_field\">\n <mat-form-field class=\"properties_form_field mat-form-field-outline\">\n <mat-label class=\"mdc-floating-disabled\">Password</mat-label>\n <input matInput formControlName=\"ipoPassword\" autocomplete=\"avaya-ipo-password\"\n (keypress)=\"restrictNumeric($event)\" [type]=\"showLoginPassword ? 'text' : 'password'\" />\n\n <mat-icon matSuffix (click)=\"showLoginPassword = !showLoginPassword && !hasAvayaSocketError\">\n @if (showLoginPassword) {\n <span class=\"container_icon_eye\">\n <i class=\"fa-solid fa-eye\"></i>\n </span>\n } @else {\n <span class=\"container_icon_eye\">\n <i class=\"fa-solid fa-eye-slash\"></i>\n </span>\n }\n </mat-icon>\n\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 </div>\n\n <!-- Login button -->\n <div class=\"avaya_login_button_area\">\n <button type=\"submit\" class=\"button_submit_login\"\n [ngClass]=\"{ 'button_submit_login_loader': showLoginLoader }\"\n [disabled]=\"showLoginLoader\">\n @if (showLoginLoader) {\n <span class=\"button_submit_loader\"></span>\n } @else {\n <span>Login</span>\n }\n </button>\n </div>\n\n </form>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n} @else {\n <!-- Softphone UI -->\n <ng-container *ngTemplateOutlet=\"showSoftphoneDiv\"></ng-container>\n}\n\n<!-- Footer (always visible) -->\n<div class=\"container_avaya_footer\">© 2025 SNUG Technologies Pvt. Ltd.\n\n\n\n</div>\n\n\n\n\n\n<ng-template #showSoftphoneDiv>\n\n@if (!showActiveCall) {\n <div class=\"container_avaya_softphone_inner\">\n <!-- ------------------- Keypad work start ---------- -->\n @if (bottomActiveTab === 'keypad_sd') {\n <div class=\"tab-content_sd\">\n <div class=\"container_dialpad_header\">\n <div class=\"container_dialpad_header_inner2\">\n <div class=\"container_avaya_extension\">\n <div class=\"container_avaya_extension_left\">\n <div class=\"extension_label\">Extension</div>\n <div class=\"extension_number\">{{ extensionNumber }}</div>\n </div>\n <div class=\"container_avaya_extension_right\">\n <button title=\"Sign out\" (click)=\"onLogout()\">\n <svg width=\"16px\" fill=\"currentColor\" viewBox=\"0 0 512 512\">\n <path\n d=\"M377.9 105.9L500.7 228.7c7.2 7.2 11.3 17.1 11.3 27.3s-4.1 20.1-11.3 27.3L377.9 406.1c-6.4 6.4-15 9.9-24 9.9c-18.7 0-33.9-15.2-33.9-33.9l0-62.1-128 0c-17.7 0-32-14.3-32-32l0-64c0-17.7 14.3-32 32-32l128 0 0-62.1c0-18.7 15.2-33.9 33.9-33.9c9 0 17.6 3.6 24 9.9zM160 96L96 96c-17.7 0-32 14.3-32 32l0 256c0 17.7 14.3 32 32 32l64 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-64 0c-53 0-96-43-96-96L0 128C0 75 43 32 96 32l64 0c17.7 0 32 14.3 32 32s-14.3 32-32 32z\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"dialpad_container_sd\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n <app-dialpad [contacts]=\"contacts\" (makeCallEv)=\"makeCall($event)\"></app-dialpad>\n <!-- to do list -->\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- ------------------- Keypad work end ---------- -->\n\n @if (bottomActiveTab === 'recent_sd') {\n <div class=\"tab-content_sd\">\n <app-call-history (makeCallEv)=\"makeCallFromContact($event)\"></app-call-history>\n </div>\n }\n\n @if (bottomActiveTab === 'settings_sd') {\n <div class=\"tab-content_sd\">\n <app-device-selector (change)=\"handleDeviceSelection($event)\"></app-device-selector>\n </div>\n }\n </div>\n\n <div class=\"tabs_sd\">\n <button class=\"tab_heading_btn\" (click)=\"bottomSelectTab('recent_sd')\"\n [class.active]=\"bottomActiveTab === 'recent_sd'\">\n <span class=\"nav_icon\">\n <svg width=\"19px\" viewBox=\"0 0 512 512\">\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=\"nav_heading_sd\">Recent</span>\n </button>\n\n <button class=\"tab_heading_btn\" (click)=\"bottomSelectTab('keypad_sd')\"\n [class.active]=\"bottomActiveTab === 'keypad_sd'\">\n <span class=\"nav_icon\">\n <svg width=\"20px\" viewBox=\"0 0 512 512\">\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=\"nav_heading_sd\">Keypad</span>\n </button>\n\n <button class=\"tab_heading_btn\" (click)=\"bottomSelectTab('settings_sd')\"\n [class.active]=\"bottomActiveTab === 'settings_sd'\">\n <span class=\"nav_icon\">\n <svg width=\"19px\" viewBox=\"-0.03 0 16.079 16.079\">\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 </span>\n <span class=\"nav_heading_sd\">Preferences</span>\n </button>\n </div>\n} @else {\n <ng-container *ngTemplateOutlet=\"showActiveCallDiv\"></ng-container>\n}\n\n\n<!-- ////////////// -->\n\n <!-- Active Call Div -->\n \n <ng-template #showActiveCallDiv>\n\n\n @if (showTranscriptionPopup) {\n <div class=\"transcription-popup\">\n <div class=\"transcription-header\">\n <span>Live Transcription</span>\n <button class=\"close-btn\" (click)=\"showTranscriptionPopup = false\">\u00D7</button>\n </div>\n <div class=\"transcription-body\">\n <p>{{ transcriptText }}</p>\n </div>\n </div>\n}\n\n\n\n\n\n\n\n<div class=\"container_call\">\n <div class=\"container_call_header\">\n <div class=\"container_call_header_inner\">\n\n @if (!conferenceParticipants || conferenceParticipants.length <= 1) {\n <!-- ------------ add call list swap and merge area start ---------------- -->\n @if (activeCalls.length > 1) {\n <div class=\"container_swap_merge_list\">\n <div class=\"container_conference_contact_list_inner\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n <div class=\"outer_container_swap_merge\">\n @for (call of activeCalls; track call.phoneNumber; let i = $index) {\n @if (i !== currentActiveCallIndex) {\n <div class=\"container_swap_merge_item\"\n (click)=\"swapLinesToIndex(i)\"\n [ngClass]=\"{ 'active-call': i === currentActiveCallIndex, 'other-call': i !== currentActiveCallIndex }\">\n\n <!-- Avatar -->\n <div class=\"container_recent_item_image\">\n <div class=\"container_swap_merge_item_image_inner\">\n <!-- svg avatar here -->\n </div>\n </div>\n\n <!-- Call Info -->\n <div class=\"container_recent_item_left\">\n <div class=\"container_recent_item_left_inner\">\n <div class=\"contact_field\">{{ call.phoneNumber }}</div>\n @if (call.isOnHold) {\n <div class=\"onhold_st\">On hold</div>\n }\n </div>\n\n <!-- Action Buttons -->\n <div class=\"container_recent_item_right\">\n <div class=\"right_field\">\n <button class=\"button_swap_merge\">\n <div class=\"button_icon\">\n <!-- merge svg -->\n </div>\n <div class=\"button_text\">Merge</div>\n </button>\n </div>\n <div class=\"right_field\">\n <button class=\"button_swap_merge\">\n <div class=\"button_icon\">\n <!-- swap svg -->\n </div>\n <div class=\"button_text\">Swap</div>\n </button>\n </div>\n </div>\n </div>\n </div>\n }\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n <!-- ------------ add call list swap and merge area end ---------------- -->\n\n @if (isCalling) {\n <div class=\"container_call_info\">Calling...</div>\n } @else {\n @if (isactiveCall) {\n <div class=\"container_call_info\">\n {{ formatTime(activeCalls[currentActiveCallIndex].duration) }}\n </div>\n }\n @if (showCallDisconnected) {\n <div class=\"container_call_info_blinker\">\n <!-- disconnected svg -->\n {{ this.istransfer ? 'Call Transferred' : 'Call ended' }}\n </div>\n }\n }\n\n <div class=\"container_call_ani\">\n @if (isCalling && displayCallingNumber && activeCalls.length === 0) {\n <!-- show what the user dialed while call is spinning up -->\n <div class=\"container_call_ani_number\">\n {{ displayCallingNumber }}\n </div>} \n @else if (activeCalls.length > 0) {\n <div class=\"container_call_ani_number\">\n {{ activeCalls[currentActiveCallIndex].lookupPhoneNumber.country?.flag }}\n {{ activeCalls[currentActiveCallIndex].phoneNumber }}\n \n </div>\n <div class=\"container_call_ani_name\">\n {{ activeCalls[currentActiveCallIndex].lookupPhoneNumber.phoneNumber?.location }}\n </div>\n } @else {\n <div class=\"container_call_ani_number\">\n {{ lastDisconnectedCall?.lookupPhoneNumber?.country?.flag }}\n {{ lastDisconnectedCall?.phoneNumber }}\n </div>\n <div class=\"container_call_ani_name\">\n {{ lastDisconnectedCall?.lookupPhoneNumber?.phoneNumber?.location }}\n </div>\n }\n\n <div class=\"container_call_ani_image\">\n <div class=\"container_call_ani_image_inner\" [ngClass]=\"{ 'call_animation': isactiveCall }\">\n <!-- big avatar svg -->\n </div>\n </div>\n </div>\n\n } @else {\n <!-- Conference Call Placeholder -->\n <!-- @if block can render conference call template here -->\n }\n\n </div>\n </div>\n\n <div class=\"container_call_content\">\n <div class=\"container_call_dnis\">\n <span>Ext. {{ extensionNumber }}</span>\n </div>\n\n <div class=\"container_call_options\">\n <div class=\"container_dialpad_row margin_bottom_16\">\n <button class=\"button_call_option button_elevated\"\n [ngClass]=\"{ 'button_disabled': !isactiveCall && activeCalls.length < 4 }\"\n (click)=\"onAddCall()\"\n [disabled]=\"!isactiveCall\">\n <div class=\"button_icon\"> \n <svg fill=\"#000000\" width=\"20\" viewBox=\"0 0 52 52\" enable-background=\"new 0 0 52 52\"\n xml:space=\"preserve\">\n <path fill=\"currentColor\" d=\"M30,29h16.5c0.8,0,1.5-0.7,1.5-1.5v-3c0-0.8-0.7-1.5-1.5-1.5H30c-0.6,0-1-0.4-1-1V5.5C29,4.7,28.3,4,27.5,4\n h-3C23.7,4,23,4.7,23,5.5V22c0,0.6-0.4,1-1,1H5.5C4.7,23,4,23.7,4,24.5v3C4,28.3,4.7,29,5.5,29H22c0.6,0,1,0.4,1,1v16.5\n c0,0.8,0.7,1.5,1.5,1.5h3c0.8,0,1.5-0.7,1.5-1.5V30C29,29.4,29.4,29,30,29z\" />\n </svg>\n </div>\n <div class=\"button_text\">Add</div>\n </button>\n\n @if (activeCalls.length > 0) {\n <button class=\"button_call_option\" (click)=\"onAddCall()\" type=\"button\">\n <div class=\"button_icon\"> <svg width=\"20\" viewBox=\"0 0 52 52\" aria-hidden=\"true\">\n <path fill=\"currentColor\"\n d=\"M30,29h16.5c0.8,0,1.5-0.7,1.5-1.5v-3c0-0.8-0.7-1.5-1.5-1.5H30c-0.6,0-1-0.4-1-1V5.5C29,4.7,28.3,4,27.5,4h-3\n C23.7,4,23,4.7,23,5.5V22c0,0.6-0.4,1-1,1H5.5C4.7,23,4,23.7,4,24.5v3C4,28.3,4.7,29,5.5,29H22c0.6,0,1,0.4,1,1v16.5\n c0,0.8,0.7,1.5,1.5,1.5h3c0.8,0,1.5-0.7,1.5-1.5V30C29,29.4,29.4,29,30,29z\"/>\n </svg></div>\n <div class=\"button_text\">Conference</div>\n </button>\n }\n\n @if (!isRecording) {\n <button class=\"button_call_option button_elevated\"\n [ngClass]=\"{ 'button_disabled': !isactiveCall }\"\n [disabled]=\"!isactiveCall\">\n <div class=\"button_icon\"> <svg width=\"22px\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path fill=\"currentColor\" d=\"M3 10L3 14M7.5 6L7.5 18M12 3V21M16.5 6V18M21 10V14\" stroke=\"#000000\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg></div>\n <div class=\"button_text\">Record</div>\n </button>\n } @else {\n <button class=\"button_call_option button_elevated\"\n [ngClass]=\"{ 'button_disabled': !isactiveCall }\"\n [disabled]=\"!isactiveCall\">\n <div class=\"button_icon\"><svg width=\"22px\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path fill=\"currentColor\" d=\"M3 10L3 14M7.5 6L7.5 18M12 3V21M16.5 6V18M21 10V14\" stroke=\"#000000\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg></div>\n <div class=\"button_text\">Stop</div>\n </button>\n }\n\n <button class=\"button_call_option button_elevated\"\n [ngClass]=\"{ 'button_disabled': !isactiveCall }\"\n [disabled]=\"!isactiveCall\"\n (click)=\"isCallTransferOpen = !isCallTransferOpen\">\n <div class=\"button_icon\"> <svg width=\"25px\" height=\"25px\" viewBox=\"0 0 48 48\" version=\"1\" enable-background=\"new 0 0 48 48\">\n <path fill=\"currentColor\"\n d=\"M39.2,8.4l-1.8,1.8c-6.3,6.5-5.4,22,0,27.6l1.8,1.8c0.5,0.5,1.3,0.5,1.8,0l3.6-3.7c0.5-0.5,0.5-1.3,0-1.8 l-3.4-3.4h-4.8c-1.3-1.3-1.3-12.1,0-13.4h4.8l3.3-3.4c0.5-0.5,0.5-1.3,0-1.8L41,8.4C40.5,7.9,39.7,7.9,39.2,8.4z\" />\n <path fill=\"currentColor\"\n d=\"M11.2,8.4l-1.8,1.8c-6.3,6.5-5.4,22,0,27.6l1.8,1.8c0.5,0.5,1.3,0.5,1.8,0l3.6-3.7c0.5-0.5,0.5-1.3,0-1.8 l-3.4-3.4H8.5c-1.3-1.3-1.3-12.1,0-13.4h4.8l3.3-3.4c0.5-0.5,0.5-1.3,0-1.8L13,8.4C12.5,7.9,11.7,7.9,11.2,8.4z\" />\n <g fill=\"currentColor\">\n <polygon points=\"25.3,18.6 30.7,24 25.3,29.4\" />\n <rect x=\"16\" y=\"22\" width=\"11\" height=\"4\" />\n </g>\n </svg></div>\n <div class=\"button_text\">Transfer</div>\n </button>\n\n @if (isCallTransferOpen) {\n <ng-container *ngTemplateOutlet=\"callTransferTemplate\"></ng-container>\n }\n </div>\n\n <!-- Mute / Unmute -->\n <div class=\"container_dialpad_row\">\n @if (activeCalls.length > 0 && !this.activeCalls[this.currentActiveCallIndex].isMuted) {\n <button class=\"button_call_option button_elevated\"\n (click)=\"toggleMute()\"\n [ngClass]=\"{ 'button_disabled': showCallDisconnected }\">\n <div class=\"button_icon\"> <svg viewBox=\"0 0 384 512\" width=\"16\">\n <path fill=\"currentColor\"\n d=\"M192 0C139 0 96 43 96 96l0 160c0 53 43 96 96 96s96-43 96-96l0-160c0-53-43-96-96-96zM64 216c0-13.3-10.7-24-24-24s-24 10.7-24 24l0 40c0 89.1 66.2 162.7 152 174.4l0 33.6-48 0c-13.3 0-24 10.7-24 24s10.7 24 24 24l72 0 72 0c13.3 0 24-10.7 24-24s-10.7-24-24-24l-48 0 0-33.6c85.8-11.7 152-85.3 152-174.4l0-40c0-13.3-10.7-24-24-24s-24 10.7-24 24l0 40c0 70.7-57.3 128-128 128s-128-57.3-128-128l0-40z\" />\n </svg></div>\n <div class=\"button_text\">Mute</div>\n </button>\n } @else if (activeCalls.length > 0 && this.activeCalls[this.currentActiveCallIndex].isMuted) {\n <button class=\"button_call_option button_active button_elevated\" (click)=\"toggleMute()\">\n <div class=\"button_icon\"> <svg width=\"26\" viewBox=\"0 0 640 512\">\n <path fill=\"currentColor\"\n d=\"M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L472.1 344.7c15.2-26 23.9-56.3 23.9-88.7l0-40c0-13.3-10.7-24-24-24s-24 10.7-24 24l0 40c0 21.2-5.1 41.1-14.2 58.7L416 300.8 416 96c0-53-43-96-96-96s-96 43-96 96l0 54.3L38.8 5.1zM344 430.4c20.4-2.8 39.7-9.1 57.3-18.2l-43.1-33.9C346.1 382 333.3 384 320 384c-70.7 0-128-57.3-128-128l0-8.7L144.7 210c-.5 1.9-.7 3.9-.7 6l0 40c0 89.1 66.2 162.7 152 174.4l0 33.6-48 0c-13.3 0-24 10.7-24 24s10.7 24 24 24l72 0 72 0c13.3 0 24-10.7 24-24s-10.7-24-24-24l-48 0 0-33.6z\" />\n </svg></div>\n <div class=\"button_text\">Unmute</div>\n </button>\n }\n\n <!-- Hold / Unhold -->\n @if (activeCalls.length > 0 && !this.activeCalls[this.currentActiveCallIndex].isOnHold) {\n <button class=\"button_call_option button_elevated\"\n [ngClass]=\"{ 'button_disabled': !isactiveCall }\"\n [disabled]=\"!isactiveCall\"\n (click)=\"toggleHold()\">\n <div class=\"button_icon\"> <svg viewBox=\"0 0 320 512\" width=\"14\">\n <path fill=\"currentColor\" d=\"M128 64L0 64 0 448l128 0 0-384zm192 0L192 64l0 384 128 0 0-384z\" />\n </svg></div>\n <div class=\"button_text\">Hold</div>\n </button>\n } @else if (activeCalls.length > 0 && this.activeCalls[this.currentActiveCallIndex].isOnHold) {\n <button class=\"button_call_option button_active button_elevated\" (click)=\"toggleHold()\">\n <div class=\"button_icon\">\n <svg viewBox=\"0 0 320 512\" width=\"14\">\n <path fill=\"currentColor\" d=\"M128 64L0 64 0 448l128 0 0-384zm192 0L192 64l0 384 128 0 0-384z\" />\n </svg></div>\n <div class=\"button_text\">Unhold</div>\n </button>\n \n }\n\n <!-- Keypad -->\n <button class=\"button_call_option button_elevated\"\n [class.button_active]=\"isDailpadOpen\"\n (click)=\"menuDailpad()\"\n [ngClass]=\"{ 'button_disabled': showCallDisconnected }\">\n <div class=\"button_icon\"> <svg width=\"22px\" height=\"22px\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M256,400a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M256,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M256,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M256,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M384,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M384,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M384,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M128,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M128,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M128,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n </svg></div>\n <div class=\"button_text\">{{ isDailpadOpen ? 'Hide' : 'Keypad' }}</div>\n </button>\n\n @if (isDailpadOpen) {\n <div class=\"container_popup_dialpad\">\n <div class=\"container_popup_dialpad_inner\">\n <div [formGroup]=\"dtmfForm\">\n <div class=\"container_dtmf_input\">\n <input type=\"tel\" formControlName=\"dtmf\">\n </div>\n <div class=\"container_dialpad_digits\">\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('1')\">1</button>\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('2')\">2</button>\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('3')\">3</button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('4')\">4</button>\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('5')\">5</button>\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('6')\">6</button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('7')\">7</button>\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('8')\">8</button>\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('9')\">9</button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('*')\">\n <svg viewBox=\"0 0 512 512\" height=\"17px\">\n <path fill=\"currentColor\"\n d=\"M208 32c0-17.7 14.3-32 32-32l32 0c17.7 0 32 14.3 32 32l0 140.9 122-70.4c15.3-8.8 34.9-3.6 43.7 11.7l16 27.7c8.8 15.3 3.6 34.9-11.7 43.7L352 256l122 70.4c15.3 8.8 20.6 28.4 11.7 43.7l-16 27.7c-8.8 15.3-28.4 20.6-43.7 11.7L304 339.1 304 480c0 17.7-14.3 32-32 32l-32 0c-17.7 0-32-14.3-32-32l0-140.9L86 409.6c-15.3 8.8-34.9 3.6-43.7-11.7l-16-27.7c-8.8-15.3-3.6-34.9 11.7-43.7L160 256 38 185.6c-15.3-8.8-20.5-28.4-11.7-43.7l16-27.7C51.1 98.8 70.7 93.6 86 102.4l122 70.4L208 32z\" />\n </svg>\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('0')\">0</button>\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('#')\">\n <svg height=\"19px\" viewBox=\"0 0 448 512\">\n <path fill=\"currentColor\"\n d=\"M181.3 32.4c17.4 2.9 29.2 19.4 26.3 36.8L197.8 128l95.1 0 11.5-69.3c2.9-17.4 19.4-29.2 36.8-26.3s29.2 19.4 26.3 36.8L357.8 128l58.2 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-68.9 0L325.8 320l58.2 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-68.9 0-11.5 69.3c-2.9 17.4-19.4 29.2-36.8 26.3s-29.2-19.4-26.3-36.8l9.8-58.7-95.1 0-11.5 69.3c-2.9 17.4-19.4 29.2-36.8 26.3s-29.2-19.4-26.3-36.8L90.2 384 32 384c-17.7 0-32-14.3-32-32s14.3-32 32-32l68.9 0 21.3-128L64 192c-17.7 0-32-14.3-32-32s14.3-32 32-32l68.9 0 11.5-69.3c2.9-17.4 19.4-29.2 36.8-26.3zM187.1 192L165.8 320l95.1 0 21.3-128-95.1 0z\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Call Control Buttons -->\n <div class=\"container_dialpad_buttons\">\n <div class=\"container_dialpad_row\">\n @if (!showCallDisconnected || isCalling) {\n <button class=\"button_dialpad_digit button_call_red\" (click)=\"dropCurrentCall()\">\n <svg width=\"25\" viewBox=\"0 0 640 512\">\n <path 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 </svg>\n </button>\n } @else if (showCallDisconnected && !isCalling) {\n <button class=\"button_dialpad_digit button_call_green\"\n (click)=\"onRedial()\"\n [ngClass]=\"{ 'button_call_disabled': !phoneNumber }\">\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</div>\n</ng-template>\n\n\n <!-- ////////////////// -->\n <!-- Conference Call Template -->\n <ng-template #conferenceCallTemplate>\n<div class=\"container_active_call_header\">\n <div class=\"container_active_call_avatar\">\n <div class=\"container_active_call_avatar_inner\">\n <svg viewBox=\"0 0 212 212\" height=\"45px\" width=\"45px\" version=\"1.1\" x=\"0px\" y=\"0px\"\n enable-background=\"new 0 0 212 212\">\n <path fill=\"#DFE5E7\"\n d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\">\n </path>\n <g>\n <path fill=\"#FFFFFF\"\n d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 c-0.964-1.144-2.024-2.326-3.184-3.527c-1.741-1.802-3.71-3.646-5.924-5.47c-2.952-2.431-6.339-4.824-10.204-7.026 c-1.877-1.07-3.873-2.092-5.98-3.055c-0.062-0.028-0.118-0.059-0.18-0.087c-9.792-4.44-22.106-7.529-37.416-7.529 s-27.624,3.089-37.416,7.529c-0.338,0.153-0.653,0.318-0.985,0.474c-1.431,0.674-2.806,1.376-4.128,2.101 c-0.716,0.393-1.417,0.792-2.101,1.197c-3.421,2.027-6.475,4.191-9.15,6.395c-2.213,1.823-4.182,3.668-5.924,5.47 c-1.161,1.201-2.22,2.384-3.184,3.527c-0.964,1.144-1.832,2.25-2.609,3.299c-0.778,1.049-1.464,2.04-2.065,2.955 c-0.557,0.848-1.033,1.622-1.447,2.324c-0.033,0.056-0.073,0.119-0.104,0.174c-0.435,0.744-0.79,1.392-1.07,1.926 c-0.559,1.068-0.818,1.678-0.818,1.678v0.398c18.285,17.927,43.322,28.985,70.945,28.985c27.678,0,52.761-11.103,71.055-29.095 v-0.289c0,0-0.619-1.45-1.992-3.778C174.594,173.238,174.117,172.463,173.561,171.615z\">\n </path>\n <path fill=\"#FFFFFF\"\n d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 c1.772-0.532,3.482-1.188,5.12-1.958c2.184-1.027,4.242-2.258,6.15-3.67c2.863-2.119,5.39-4.646,7.509-7.509 c0.706-0.954,1.367-1.945,1.98-2.971c0.919-1.539,1.729-3.155,2.422-4.84c0.462-1.123,0.872-2.277,1.226-3.458 c0.177-0.591,0.341-1.188,0.49-1.792c0.299-1.208,0.542-2.443,0.725-3.701c0.275-1.887,0.417-3.827,0.417-5.811 c0-1.984-0.142-3.925-0.417-5.811c-0.184-1.258-0.426-2.493-0.725-3.701c-0.15-0.604-0.313-1.202-0.49-1.793 c-0.354-1.181-0.764-2.335-1.226-3.458c-0.693-1.685-1.504-3.301-2.422-4.84c-0.613-1.026-1.274-2.017-1.98-2.971 c-2.119-2.863-4.646-5.39-7.509-7.509c-1.909-1.412-3.966-2.643-6.15-3.67c-1.638-0.77-3.348-1.426-5.12-1.958 c-1.181-0.355-2.39-0.655-3.624-0.896c-2.468-0.484-5.035-0.737-7.68-0.737c-21.162,0-37.345,16.183-37.345,37.345 C68.657,109.317,84.84,125.5,106.002,125.5z\">\n </path>\n </g>\n </svg>\n </div>\n </div>\n\n <div class=\"container_active_call_info\">\n <div class=\"container_active_call_info_inner\">\n <div class=\"container_active_call_number\">Conference call</div>\n <div class=\"container_active_call_details\">\n <div class=\"container_active_call_details_inner\">\n <div class=\"container_active_call_icon_green\">\n <svg viewBox=\"0 0 512 512\" width=\"12\">\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 </div>\n <div class=\"container_active_call_status_green\">\n with {{ conferenceParticipants?.length }} people\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"container_active_call_options\">\n <div class=\"button_active_call_options button_active_call_options_highlighted\">\n <span (click)=\"isConfereceList = !isConfereceList\" class=\"container_active_call_options_button\">\n <svg viewBox=\"0 0 448 512\" width=\"16px\">\n <path fill=\"currentColor\"\n d=\"M201.4 374.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 306.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z\" />\n </svg>\n </span>\n </div>\n </div>\n</div>\n\n<!-- Conference List -->\n@if (isConfereceList) {\n <div class=\"container_conference_contact_list\">\n <div class=\"container_conference_contact_list_inner\">\n <div class=\"scrollbox container_conference_contact_list_scrollbox\">\n <div class=\"scrollbox-content\">\n\n @for (person of conferenceParticipants; track person.id) {\n <div class=\"container_conference_contact_item\">\n <!-- Avatar -->\n <div class=\"container_contact_item_image\">\n <div class=\"container_contact_item_image_inner\">\n <svg viewBox=\"0 0 212 212\" height=\"49px\" width=\"49px\" version=\"1.1\" x=\"0px\" y=\"0px\"\n enable-background=\"new 0 0 212 212\">\n <path fill=\"#DFE5E7\"\n d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\">\n </path>\n <g>\n <path fill=\"#FFFFFF\"\n d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 c-0.964-1.144-2.024-2.326-3.184-3.527c-1.741-1.802-3.71-3.646-5.924-5.47c-2.952-2.431-6.339-4.824-10.204-7.026 c-1.877-1.07-3.873-2.092-5.98-3.055c-0.062-0.028-0.118-0.059-0.18-0.087c-9.792-4.44-22.106-7.529-37.416-7.529 s-27.624,3.089-37.416,7.529c-0.338,0.153-0.653,0.318-0.985,0.474c-1.431,0.674-2.806,1.376-4.128,2.101 c-0.716,0.393-1.417,0.792-2.101,1.197c-3.421,2.027-6.475,4.191-9.15,6.395c-2.213,1.823-4.182,3.668-5.924,5.47 c-1.161,1.201-2.22,2.384-3.184,3.527c-0.964,1.144-1.832,2.25-2.609,3.299c-0.778,1.049-1.464,2.04-2.065,2.955 c-0.557,0.848-1.033,1.622-1.447,2.324c-0.033,0.056-0.073,0.119-0.104,0.174c-0.435,0.744-0.79,1.392-1.07,1.926 c-0.559,1.068-0.818,1.678-0.818,1.678v0.398c18.285,17.927,43.322,28.985,70.945,28.985c27.678,0,52.761-11.103,71.055-29.095 v-0.289c0,0-0.619-1.45-1.992-3.778C174.594,173.238,174.117,172.463,173.561,171.615z\">\n </path>\n <path fill=\"#FFFFFF\"\n d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 c1.772-0.532,3.482-1.188,5.12-1.958c2.184-1.027,4.242-2.258,6.15-3.67c2.863-2.119,5.39-4.646,7.509-7.509 c0.706-0.954,1.367-1.945,1.98-2.971c0.919-1.539,1.729-3.155,2.422-4.84c0.462-1.123,0.872-2.277,1.226-3.458 c0.177-0.591,0.341-1.188,0.49-1.792c0.299-1.208,0.542-2.443,0.725-3.701c0.275-1.887,0.417-3.827,0.417-5.811 c0-1.984-0.142-3.925-0.417-5.811c-0.184-1.258-0.426-2.493-0.725-3.701c-0.15-0.604-0.313-1.202-0.49-1.793 c-0.354-1.181-0.764-2.335-1.226-3.458c-0.693-1.685-1.504-3.301-2.422-4.84c-0.613-1.026-1.274-2.017-1.98-2.971 c-2.119-2.863-4.646-5.39-7.509-7.509c-1.909-1.412-3.966-2.643-6.15-3.67c-1.638-0.77-3.348-1.426-5.12-1.958 c-1.181-0.355-2.39-0.655-3.624-0.896c-2.468-0.484-5.035-0.737-7.68-0.737c-21.162,0-37.345,16.183-37.345,37.345 C68.657,109.317,84.84,125.5,106.002,125.5z\">\n </path>\n </g>\n </svg>\n </div>\n </div>\n\n <!-- Name and Time -->\n <div class=\"container_contact_item_left\">\n <div class=\"container_contact_item_left_inner\">\n <div class=\"contact_field\">{{ person.name }}</div>\n <div class=\"contact_field_green\">{{ person.duration }}</div>\n </div>\n </div>\n\n <!-- End Button -->\n <div class=\"container_contact_item_right\">\n <div class=\"right_field\">\n <button class=\"button_disconnect_call\">\n <svg width=\"22\" viewBox=\"0 0 640 512\">\n <path 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 </path>\n </svg>\n </button>\n </div>\n </div>\n </div>\n\n @if (!$last) {\n <div class=\"container_separator\"></div>\n }\n }\n\n </div>\n </div>\n </div>\n </div>\n}\n\n</ng-template>\n\n\n <ng-template #callTransferTemplate>\n <div class=\"container_transfer_call\">\n <div class=\"container_transfer_call_inner\">\n <div class=\"container_button_close\">\n <span (click)=\"isCallTransferOpen = false\" title=\"Close\">\n <i class=\"fa-sharp fa-solid fa-xmark\"></i>\n </span>\n </div>\n\n <!-- First Div -->\n <div class=\"container_transfer_call_content\" @slideInOut>\n @if (currentView === 'transferListpage') {\n <div class=\"container_active_call_duration\">{{ formatTime(callDuration)}}</div>\n\n <div class=\"container_active_call_header margin_bottom_16 shadow_st\">\n <div class=\"container_active_call_avatar\">\n <div class=\"container_active_call_avatar_inner\">\n <svg viewBox=\"0 0 212 212\" height=\"45px\" width=\"45px\" version=\"1.1\" x=\"0px\" y=\"0px\"\n enable-background=\"new 0 0 212 212\">\n <path fill=\"#DFE5E7\"\n d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\">\n </path>\n <g>\n <path fill=\"#FFFFFF\"\n d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 c-0.964-1.144-2.024-2.326-3.184-3.527c-1.741-1.802-3.71-3.646-5.924-5.47c-2.952-2.431-6.339-4.824-10.204-7.026 c-1.877-1.07-3.873-2.092-5.98-3.055c-0.062-0.028-0.118-0.059-0.18-0.087c-9.792-4.44-22.106-7.529-37.416-7.529 s-27.624,3.089-37.416,7.529c-0.338,0.153-0.653,0.318-0.985,0.474c-1.431,0.674-2.806,1.376-4.128,2.101 c-0.716,0.393-1.417,0.792-2.101,1.197c-3.421,2.027-6.475,4.191-9.15,6.395c-2.213,1.823-4.182,3.668-5.924,5.47 c-1.161,1.201-2.22,2.384-3.184,3.527c-0.964,1.144-1.832,2.25-2.609,3.299c-0.778,1.049-1.464,2.04-2.065,2.955 c-0.557,0.848-1.033,1.622-1.447,2.324c-0.033,0.056-0.073,0.119-0.104,0.174c-0.435,0.744-0.79,1.392-1.07,1.926 c-0.559,1.068-0.818,1.678-0.818,1.678v0.398c18.285,17.927,43.322,28.985,70.945,28.985c27.678,0,52.761-11.103,71.055-29.095 v-0.289c0,0-0.619-1.45-1.992-3.778C174.594,173.238,174.117,172.463,173.561,171.615z\">\n </path>\n <path fill=\"#FFFFFF\"\n d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 c1.772-0.532,3.482-1.188,5.12-1.958c2.184-1.027,4.242-2.258,6.15-3.67c2.863-2.119,5.39-4.646,7.509-7.509 c0.706-0.954,1.367-1.945,1.98-2.971c0.919-1.539,1.729-3.155,2.422-4.84c0.462-1.123,0.872-2.277,1.226-3.458 c0.177-0.591,0.341-1.188,0.49-1.792c0.299-1.208,0.542-2.443,0.725-3.701c0.275-1.887,0.417-3.827,0.417-5.811 c0-1.984-0.142-3.925-0.417-5.811c-0.184-1.258-0.426-2.493-0.725-3.701c-0.15-0.604-0.313-1.202-0.49-1.793 c-0.354-1.181-0.764-2.335-1.226-3.458c-0.693-1.685-1.504-3.301-2.422-4.84c-0.613-1.026-1.274-2.017-1.98-2.971 c-2.119-2.863-4.646-5.39-7.509-7.509c-1.909-1.412-3.966-2.643-6.15-3.67c-1.638-0.77-3.348-1.426-5.12-1.958 c-1.181-0.355-2.39-0.655-3.624-0.896c-2.468-0.484-5.035-0.737-7.68-0.737c-21.162,0-37.345,16.183-37.345,37.345 C68.657,109.317,84.84,125.5,106.002,125.5z\">\n </path>\n </g>\n </svg>\n </div>\n </div>\n <div class=\"container_active_call_info\">\n <div class=\"container_active_call_info_inner\">\n <div class=\"container_active_call_number\">{{ lookupPhoneNumber?.country?.flag }}\n {{ lookupPhoneNumber?.phoneNumber }}</div>\n <div class=\"container_active_call_details\">\n <div class=\"container_active_call_details_inner\">\n <div class=\"container_active_call_icon_green\">\n <svg viewBox=\"0 0 512 512\" width=\"12\">\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 </div>\n <div class=\"container_active_call_status_green\">Active call</div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"container_contact_item_right\">\n <div class=\"right_field right_field_highlighted\">\n <span class=\"right_field_content\">Ext. {{extensionNumber}}</span>\n </div>\n </div>\n </div>\n\n <!-- Tabs -->\n <div class=\"container_transfer_tab_buttons\">\n <button class=\"button_transfer_tab\" (click)=\"selectTab('tab1')\" [class.active]=\"activeTab === 'tab1'\">\n <svg width=\"18px\" viewBox=\"0 0 512 512\">\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> Recent</button>\n <button class=\"button_transfer_tab\" (click)=\"selectTab('tab2')\" [class.active]=\"activeTab === 'tab2'\">\n <svg width=\"20px\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\"\n d=\"M15.71,12.71a6,6,0,1,0-7.42,0,10,10,0,0,0-6.22,8.18,1,1,0,0,0,2,.22,8,8,0,0,1,15.9,0,1,1,0,0,0,1,.89h.11a1,1,0,0,0,.88-1.1A10,10,0,0,0,15.71,12.71ZM12,12a4,4,0,1,1,4-4A4,4,0,0,1,12,12Z\" />\n </svg> Internal</button>\n <button class=\"button_transfer_tab\" (click)=\"selectTab('tab3')\" [class.active]=\"activeTab === 'tab3'\">\n <svg width=\"18px\" height=\"18px\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M256,400a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M256,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M256,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M256,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M384,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M384,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M384,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M128,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M128,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M128,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" /></svg>\n Dail</button>\n </div>\n\n <!-- Tab 1 -->\n @if (activeTab === 'tab1') {\n <!-- <div class=\"container_transfer_tab_content\">\n <app-call-history (makeCallEv)=\"makeCallFromContact($event)\"></app-call-history>\n </div> -->\n <div class=\"container_transfer_tab_content\">\n <app-call-history [mode]=\"'transfer'\" (transferEv)=\"transferToFromHistory($event)\"> </app-call-history>\n</div>\n }\n\n <!-- Tab 2 -->\n @if (activeTab === 'tab2') {\n <div class=\"container_transfer_tab_content\">\n <div class=\"container_transfer_internal_search\">\n <input type=\"search\" placeholder=\"Type to search\">\n </div>\n <div class=\"container_transfer_contact_list\">\n <div class=\"container_transfer_contact_list_inner\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n <!-- Instead of repeating static contacts, render via array -->\n @for (contact of internalContacts; track contact.ext) {\n <div class=\"container_contact_item\" (click)=\"goToDiv('transferDetails'); makeCallFromContact(contact.phone)\">\n <div class=\"container_contact_item_image\">\n <div class=\"container_contact_item_image_inner\">\n <svg viewBox=\"0 0 212 212\" height=\"49px\" width=\"49px\" version=\"1.1\" x=\"0px\" y=\"0px\"\n enable-background=\"new 0 0 212 212\">\n <path fill=\"#DFE5E7\"\n d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\">\n </path>\n <g>\n <path fill=\"#FFFFFF\"\n d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 c-0.964-1.144-2.024-2.326-3.184-3.527c-1.741-1.802-3.71-3.646-5.924-5.47c-2.952-2.431-6.339-4.824-10.204-7.026 c-1.877-1.07-3.873-2.092-5.98-3.055c-0.062-0.028-0.118-0.059-0.18-0.087c-9.792-4.44-22.106-7.529-37.416-7.529 s-27.624,3.089-37.416,7.529c-0.338,0.153-0.653,0.318-0.985,0.474c-1.431,0.674-2.806,1.376-4.128,2.101 c-0.716,0.393-1.417,0.792-2.101,1.197c-3.421,2.027-6.475,4.191-9.15,6.395c-2.213,1.823-4.182,3.668-5.924,5.47 c-1.161,1.201-2.22,2.384-3.184,3.527c-0.964,1.144-1.832,2.25-2.609,3.299c-0.778,1.049-1.464,2.04-2.065,2.955 c-0.557,0.848-1.033,1.622-1.447,2.324c-0.033,0.056-0.073,0.119-0.104,0.174c-0.435,0.744-0.79,1.392-1.07,1.926 c-0.559,1.068-0.818,1.678-0.818,1.678v0.398c18.285,17.927,43.322,28.985,70.945,28.985c27.678,0,52.761-11.103,71.055-29.095 v-0.289c0,0-0.619-1.45-1.992-3.778C174.594,173.238,174.117,172.463,173.561,171.615z\">\n </path>\n <path fill=\"#FFFFFF\"\n d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 c1.772-0.532,3.482-1.188,5.12-1.958c2.184-1.027,4.242-2.258,6.15-3.67c2.863-2.119,5.39-4.646,7.509-7.509 c0.706-0.954,1.367-1.945,1.98-2.971c0.919-1.539,1.729-3.155,2.422-4.84c0.462-1.123,0.872-2.277,1.226-3.458 c0.177-0.591,0.341-1.188,0.49-1.792c0.299-1.208,0.542-2.443,0.725-3.701c0.275-1.887,0.417-3.827,0.417-5.811 c0-1.984-0.142-3.925-0.417-5.811c-0.184-1.258-0.426-2.493-0.725-3.701c-0.15-0.604-0.313-1.202-0.49-1.793 c-0.354-1.181-0.764-2.335-1.226-3.458c-0.693-1.685-1.504-3.301-2.422-4.84c-0.613-1.026-1.274-2.017-1.98-2.971 c-2.119-2.863-4.646-5.39-7.509-7.509c-1.909-1.412-3.966-2.643-6.15-3.67c-1.638-0.77-3.348-1.426-5.12-1.958 c-1.181-0.355-2.39-0.655-3.624-0.896c-2.468-0.484-5.035-0.737-7.68-0.737c-21.162,0-37.345,16.183-37.345,37.345 C68.657,109.317,84.84,125.5,106.002,125.5z\">\n </path>\n </g>\n </svg>\n </div>\n </div>\n <div class=\"container_contact_item_left\">\n <div class=\"container_contact_item_left_inner\">\n <div class=\"contact_field\">{{ contact.name }}</div>\n <div class=\"contact_field\">{{ contact.phone }}</div>\n @if (contact.role) {\n <div class=\"contact_field_grey\">\n <div class=\"contact_field_highlighted\"><span>{{ contact.role }}</span></div>\n </div>\n }\n </div>\n </div>\n <div class=\"container_contact_item_right\">\n <div class=\"right_field\">\n <span class=\"right_field_content\">Ext. {{ contact.ext }}</span>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Tab 3 -->\n @if (activeTab === 'tab3') {\n <div class=\"container_transfer_tab_content\">\n <form [formGroup]=\"transferForm\">\n <div class=\"container_transfer_contact_list\">\n <div class=\"container_phone_number_input margin_bottom_16\">\n <button class=\"button_phonebook\" (click)=\"isDirectoryOpen = !isDirectoryOpen\">\uD83D\uDCD6</button>\n <input placeholder=\"Phone Number\" type=\"tel\" formControlName=\"target\">\n <button class=\"button_backspace\" (click)=\"onBackspace()\"></button>\n </div>\n\n @if (isDirectoryOpen) {\n <div class=\"container_transfer_internal_contact_list\">\n <div class=\"container_transfer_contact_list_inner\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n @for (directoryContact of directoryContacts; track directoryContact.id) {\n <div class=\"container_contact_item\">\n <div class=\"container_contact_item_left\">\n <div class=\"container_contact_item_left_inner\">\n <div class=\"contact_field\">{{ directoryContact.name }}</div>\n <div class=\"contact_field\">{{ directoryContact.phone }}</div>\n </div>\n </div>\n <div class=\"container_contact_item_right\">\n <div class=\"right_field right_field_highlighted\">\n <span class=\"right_field_content\">\n <div class=\"container_rating\">\n @for (star of [1,2,3,4,5]; track $index) {\n <span [class.filled]=\"star <= directoryContact.rating\">\u2605</span>\n }\n </div>\n </span>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Dialpad -->\n <div class=\"container_dialpad_digits\">\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('1')\">1</button>\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('2')\">2</button>\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('3')\">3</button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('4')\">4</button>\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('5')\">5</button>\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('6')\">6</button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('7')\">7</button>\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('8')\">8</button>\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('9')\">9</button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('*')\">\n <svg viewBox=\"0 0 512 512\" height=\"17px\">\n <path fill=\"currentColor\" d=\"M208 32c0-17.7 14.3-32 32-32l32 0c17.7 0 32 14.3 32 32l0 140.9\n 122-70.4c15.3-8.8 34.9-3.6 43.7 11.7l16 27.7c8.8 15.3 3.6 34.9-11.7\n 43.7L352 256l122 70.4c15.3 8.8 20.6 28.4 11.7 43.7l-16 27.7c-8.8\n 15.3-28.4 20.6-43.7 11.7L304 339.1 304 480c0 17.7-14.3 32-32 32l-32\n 0c-17.7 0-32-14.3-32-32l0-140.9L86 409.6c-15.3 8.8-34.9\n 3.6-43.7-11.7l-16-27.7c-8.8-15.3-3.6-34.9 11.7-43.7L160 256 38\n 185.6c-15.3-8.8-20.5-28.4-11.7-43.7l16-27.7C51.1 98.8 70.7 93.6 86\n 102.4l122 70.4L208 32z\" />\n </svg>\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('0')\">0</button>\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('#')\">\n <svg height=\"19px\" viewBox=\"0 0 448 512\">\n <path fill=\"currentColor\" d=\"M181.3 32.4c17.4 2.9 29.2 19.4 26.3\n36.8L197.8 128l95.1 0 11.5-69.3c2.9-17.4 19.4-29.2 36.8-26.3s29.2 19.4\n26.3 36.8L357.8 128l58.2 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-68.9\n0L325.8 320l58.2 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-68.9 0-11.5\n69.3c-2.9 17.4-19.4 29.2-36.8 26.3s-29.2-19.4-26.3-36.8l9.8-58.7-95.1\n0-11.5 69.3c-2.9 17.4-19.4 29.2-36.8 26.3s-29.2-19.4-26.3-36.8L90.2\n384 32 384c-17.7 0-32-14.3-32-32s14.3-32 32-32l68.9 0 21.3-128L64\n192c-17.7 0-32-14.3-32-32s14.3-32 32-32l68.9 0 11.5-69.3c2.9-17.4\n19.4-29.2 36.8-26.3zM187.1 192L165.8 320l95.1 0 21.3-128-95.1 0z\" />\n </svg></button>\n </div>\n </div>\n\n <div class=\"container_dialpad_buttons\">\n <div class=\"container_dialpad_row\">\n @if (isAddingNewCall) {\n <button class=\"button_dialpad_digit button_call_green\"\n (click)=\"makeCall(transferForm.value.target)\"\n [disabled]=\"!phoneNumber\"\n [ngClass]=\"{ 'button_call_disabled': !phoneNumber }\">\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 type=\"submit\" class=\"button_dialpad_digit button_call_green\" (click)=\"onTransferCall()\"> <svg height=\"20px\" viewBox=\"0 0 52 52\" enable-background=\"new 0 0 52 52\" xml:space=\"preserve\">\n <g>\n <path fill=\"currentColor\" d=\"M48.5,37.9L42.4,33c-1.4-1.1-3.4-1.2-4.8-0.1l-5.2,3.8c-0.6,0.5-1.5,0.4-2.1-0.2l-7.8-7l-7-7.8\n c-0.6-0.6-0.6-1.4-0.2-2.1l3.8-5.2c1.1-1.4,1-3.4-0.1-4.8l-4.9-6.1c-1.5-1.8-4.2-2-5.9-0.3L3,8.4c-0.8,0.8-1.2,1.9-1.2,3\n c0.5,10.2,5.1,19.9,11.9,26.7S30.2,49.5,40.4,50c1.1,0.1,2.2-0.4,3-1.2l5.2-5.2C50.5,42.1,50.4,39.3,48.5,37.9z\" />\n <path fill=\"currentColor\" d=\"M48.4,2H33c-1,0-1.3,1.1-0.5,1.9l4.9,5l-9,9.1c-0.5,0.5-0.5,1.4,0,1.9l3.7,3.7c0.5,0.5,1.3,0.5,1.9,0\n l9.1-9.1l5.1,4.9C48.9,20.3,50,20,50,19V3.7C50,3,49.1,2,48.4,2z\" />\n </g>\n </svg></button>\n }\n </div>\n </div>\n </div>\n </form>\n </div>\n }\n }\n</div>\n\n <!-- Second Div -->\n @if (currentView === 'transferDetails') {\n <div class=\"container_transfer_call_content\" @slideInOut>\n <div class=\"container_active_call_duration\">00:10</div>\n <div class=\"container_active_call_header shadow_st\">\n <div class=\"container_active_call_avatar\">\n <div class=\"container_active_call_avatar_inner\">\n <svg viewBox=\"0 0 212 212\" height=\"45px\" width=\"45px\" version=\"1.1\" x=\"0px\" y=\"0px\"\n enable-background=\"new 0 0 212 212\">\n <path fill=\"#DFE5E7\"\n d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\"></path>\n <g>\n <path fill=\"#FFFFFF\"\n d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 ...\"></path>\n <path fill=\"#FFFFFF\"\n d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 ...\"></path>\n </g>\n </svg>\n </div>\n </div>\n\n <div class=\"container_active_call_info\">\n <div class=\"container_active_call_info_inner\">\n <div class=\"container_active_call_number\">\n {{ lookupPhoneNumber?.country?.flag }} {{ lookupPhoneNumber?.phoneNumber }}\n </div>\n <div class=\"container_active_call_details\">\n <div class=\"container_active_call_details_inner\">\n <div class=\"container_active_call_icon_grey\">\n <svg viewBox=\"0 0 320 512\" width=\"12\">\n <path fill=\"currentColor\"\n d=\"M128 64L0 64 0 448l128 0 0-384zm192 0L192 64l0 384 128 0 0-384z\"></path>\n </svg>\n </div>\n <div class=\"container_active_call_status_grey\">On hold</div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"container_contact_item_right\">\n <div class=\"right_field right_field_highlighted\">\n <span class=\"right_field_content\">Ext. {{ extensionNumber }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"container_transfer_call_details\">\n <div class=\"container_call_ani_number padding_top_nt\">+91 (654) 9876549</div>\n <div class=\"container_call_ani_name\">Rajeev kumar singh</div>\n <div class=\"container_call_ani_image\">\n <div class=\"container_call_ani_image_inner\">\n <svg viewBox=\"0 0 212 212\" height=\"85\" width=\"85\" version=\"1.1\" x=\"0px\" y=\"0px\"\n enable-background=\"new 0 0 212 212\">\n <path fill=\"#DFE5E7\"\n d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\"></path>\n <g>\n <path fill=\"#FFFFFF\"\n d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 ...\"></path>\n <path fill=\"#FFFFFF\"\n d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 ...\"></path>\n </g>\n </svg>\n </div>\n </div>\n </div>\n\n <div class=\"container_call_dnis\">\n <span>Ext. {{ extensionNumber }}</span>\n </div>\n\n <div class=\"container_call_options margin_bottom_nt\">\n <div class=\"container_dialpad_row margin_bottom_16\">\n <button class=\"button_call_option\" (click)=\"mergeCall()\">\n <div class=\"button_icon\"><svg width=\"22\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\"\n d=\"M32 64C14.3 64 0 78.3 0 96s14.3 32 32 32l97.2 0c9.7 0 18.9 4.4 25 12L247 256 154.2 372c-6.1 7.6-15.3 12-25 12L32 384c-17.7 0-32 14.3-32 32s14.3 32 32 32l97.2 0c29.2 0 56.7-13.3 75-36l99.2-124 80.6 0 0 32c0 12.9 7.8 24.6 19.8 29.6s25.7 2.2 34.9-6.9l64-64c6-6 9.4-14.1 9.4-22.6s-3.4-16.6-9.4-22.6l-64-64c-9.2-9.2-22.9-11.9-34.9-6.9s-19.8 16.6-19.8 29.6l0 32-80.6 0L204.2 100c-18.2-22.8-45.8-36-75-36L32 64z\"></path>\n </svg></div>\n <div class=\"button_text\">Merge</div>\n </button>\n\n <button class=\"button_call_option\">\n <div class=\"button_icon\"> <svg width=\"26px\" viewBox=\"0 0 640 512\">\n <path fill=\"currentColor\"\n d=\"M150.6 73.4c-12.5-12.5-32.8-12.5-45.3 0l-96 96c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L96 173.3 96 320c0 53 43 96 96 96l112 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-112 0c-17.7 0-32-14.3-32-32l0-146.7 41.4 41.4c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3l-96-96zM336 96c-17.7 0-32 14.3-32 32s14.3 32 32 32l112 0c17.7 0 32-14.3 32-32l0 146.7-41.4-41.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l96 96c12.5 12.5 32.8 12.5 45.3 0l96-96c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L544 338.7 544 192c0-53-43-96-96-96L336 96z\"></path>\n </svg></div>\n <div class=\"button_text\">Swap</div>\n </button>\n\n <button class=\"button_call_option\">\n <div class=\"button_icon\"><svg width=\"19px\" viewBox=\"0 0 52 52\">\n <path fill=\"currentColor\"\n d=\"M48.5,37.9L42.4,33c-1.4-1.1-3.4-1.2-4.8-0.1l-5.2,3.8c-0.6,0.5-1.5,0.4-2.1-0.2l-7.8-7l-7-7.8 c-0.6-0.6-0.6-1.4-0.2-2.1l3.8-5.2c1.1-1.4,1-3.4-0.1-4.8l-4.9-6.1c-1.5-1.8-4.2-2-5.9-0.3L3,8.4c-0.8,0.8-1.2,1.9-1.2,3 c0.5,10.2,5.1,19.9,11.9,26.7S30.2,49.5,40.4,50c1.1,0.1,2.2-0.4,3-1.2l5.2-5.2C50.5,42.1,50.4,39.3,48.5,37.9z\"></path>\n <path fill=\"currentColor\"\n d=\"M48.4,2H33c-1,0-1.3,1.1-0.5,1.9l4.9,5l-9,9.1c-0.5,0.5-0.5,1.4,0,1.9l3.7,3.7c0.5,0.5,1.3,0.5,1.9,0 l9.1-9.1l5.1,4.9C48.9,20.3,50,20,50,19V3.7C50,3,49.1,2,48.4,2z\"></path>\n </svg>\n</div>\n <div class=\"button_text\">Transfer</div>\n </button>\n </div>\n </div>\n\n <div class=\"container_transfer_disconnect\">\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit button_call_red\" (click)=\"goToDiv('transferListpage')\">\n <svg width=\"36px\" viewBox=\"0 0 76 76\">\n <path fill=\"currentColor\"\n d=\"M 16.2013,39.582L 15.4175,39.4096L 14.8094,38.9315L 14.4029,38.2193L 14.25,37.364L 14.25,34.9055C 14.25,33.184 14.6023,31.6057 15.3069,30.1704C 16.0116,28.7352 16.9698,27.4788 18.1818,26.4013C 19.3937,25.3237 20.8095,24.4424 22.429,23.7573C 24.0486,23.0722 25.7732,22.6277 27.6031,22.4239L 31.304,22.0792L 34.9918,21.8256L 39.109,21.715L 42.966,21.8451L 46.101,22.0987L 48.9628,22.489C 50.7276,22.7318 52.3883,23.199 53.945,23.8906C 55.5017,24.5822 56.8567,25.4625 58.0101,26.5313C 59.1635,27.6002 60.0752,28.8468 60.7451,30.2712C 61.4151,31.6956 61.75,33.2599 61.75,34.964L 61.75,37.4486L 61.5874,38.2681L 61.1386,38.9511L 60.4785,39.4096L 59.6752,39.582L 51.8897,39.582L 51.0994,39.4096L 50.4588,38.9413L 50.0327,38.2584L 49.8799,37.4226L 49.8799,32.1217L 49.7075,31.1656L 49.2295,30.3818L 48.5075,29.8452C 48.23,29.7108 47.9286,29.6436 47.6034,29.6436L 28.7413,29.6436C 28.4161,29.6436 28.0974,29.7108 27.7852,29.8452L 26.9722,30.3818L 26.4128,31.1851C 26.2697,31.4973 26.1982,31.8225 26.1982,32.1607L 26.1982,37.364L 26.0356,38.2193L 25.5803,38.9315L 24.9104,39.4096L 24.1038,39.582L 16.2013,39.582 Z M 34.8333,41.1667L 41.1666,41.1667L 41.1667,52.6458L 45.9167,47.8958L 45.9167,54.2292L 38,62.5417L 30.0833,54.2292L 30.0833,47.8958L 34.8333,52.6458L 34.8333,41.1667 Z \" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n}\n\n\n\n\n\n\n\n\n\n\n\n </div>\n </div>\n </ng-template>\n\n \n\n\n</ng-template>\n\n<div id=\"videoPanel\" style=\"display: none\">\n <audio #rmtAudio id=\"rmtAudio\" autoplay></audio>\n <audio #lclAudio id=\"lclAudio\" autoplay muted></audio>\n <video #rmtVideo id=\"rmtVideo\" autoplay></video>\n <video #lclVideo id=\"lclVideo\" autoplay muted controls title=\"Local Video\"></video>\n</div>\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Open+Sans:300,400,500,600,700,800\";@import\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css\";:host{--sd-app-color: #ff6633;--sd-app-color-dark: #ff5805;--sd-app-color-light: #fe8c66;--sd-text-font-family: \"Open Sans\", \"sans-serif\", \"Helvetica Neue\", \"Helvetica\", \"Arial\";--sd-text-color: #666;--sd-text-color-inverse: #fff;--sd-text-color-light: #ccc;--sd-text-color-medium: #999;--sd-text-color-dark: #333;--sd-background-color: #fff;--sd-border-color-light: #e3e3e3;--sd-border-color-dark: #c9c9c9}.message_label{width:100%;font-size:13px;font-family:var(--sd-text-font-family);letter-spacing:-.25px;border-radius:4px;font-weight:600;border:1px solid #f5c6cb;padding:8px 11px;position:relative}.error_message{color:#e1143c;background-color:#f8d7da;border-color:#dfadb2}.success_message{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert_message{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.properties_form_field{width:100%;font-size:13px!important;font-family:var(--sd-text-font-family)!important;font-weight:600!important;letter-spacing:-.24px!important;color:#555!important}.container_avaya_login{width:100%;height:calc(100vh - 51px);padding:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.container_avaya_login_inner{margin:0 auto;width:100%;max-width:370px;padding:65px 20px 20px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:flex}.container_connection_status_overlay{width:100%;height:100%;position:absolute;left:0;right:0;bottom:0;background-color:#6669;display:flex;justify-content:center;z-index:9999999;padding:20px}.container_connection_status{width:100%;background:var(--sd-background-color);padding:0 10px;border-radius:8px;font-family:var(--sd-text-font-family);font-size:13px;font-weight:600;color:var(--sd-text-color);display:flex;height:42px;align-items:center;position:relative;box-shadow:#32325d40 0 6px 12px -2px,#0000004d 0 3px 7px -3px}.container_connection_status span{padding:0 0 0 8px}.container_connection_status .fa-circle-dot{color:#f66060}.container_connection_status_loader{position:absolute;right:15px}.container_avaya_login_content{position:relative;width:100%}.container_avaya_logo{margin:0;padding:0 26px 24px;width:100%;text-align:center}.container_avaya_logo_image{margin:0 auto;width:120px;height:35px;background:var(--sd-background-color) url(data:image/png;base64,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) center no-repeat;background-size:120px}.container_avaya_logo h3{margin:0;padding:6px 0 0;font-family:var(--sd-text-font-family);font-size:18px;font-weight:700;letter-spacing:-.45px;color:var(--sd-text-color-dark);position:relative}.container_avaya_logo h3 span{font-size:8px;position:absolute;top:8px}.container_avaya_login_error{width:100%;white-space:normal}.container_avaya_login_form{width:100%;margin:0;padding:26px 0 0;position:relative}.container_avaya_login_form form{width:100%;margin:0;padding:0}.container_avaya_login_form .form_field{margin:0;padding:0;width:100%}.avaya_login_button_area{padding:10px 0 0}.container_icon_eye{position:absolute;right:15px}.container_avaya_login_form .button_submit_login{font:14px / 48px var(--sd-text-font-family);display:inline-block;height:48px;background:#cd1f1e;color:var(--sd-text-color-inverse);border:1px solid #cd1f1e;font-weight:600;padding:0 12px;border-radius:4px;outline:none;letter-spacing:-.24px;cursor:pointer;width:100%;position:relative}.container_avaya_login_form .button_submit_login_loader{background:#cd1f1e!important;color:var(--sd-text-color-inverse)!important;border:1px solid #cd1f1e!important;cursor:auto}.container_avaya_login_form .button_submit_login:disabled{background:#f1f1f1;color:var(--sd-text-color-medium);border:1px solid #f1f1f1}.button_submit_loader:after{content:\"\";position:absolute;width:16px;height:16px;inset:0;margin:auto;border:3px solid transparent;border-top-color:#fff;border-radius:50%;animation:button_submit_loader_spinner 1s ease infinite}@keyframes button_submit_loader_spinner{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.container_avaya_softphone{width:100%;height:100%;position:relative}.container_avaya_softphone_inner{width:100%;position:absolute;top:0;left:0;right:0;padding:0;height:calc(100% - 51px);font-family:var(--sd-text-font-family);font-size:13px;font-weight:600;color:var(--sd-text-color);line-height:normal;background:var(--sd-background-color);-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:#000}.container_call{margin:0 auto;padding:0;position:relative;width:100%;height:100%;background:var(--sd-background-color)}.container_dialpad_header{width:100%;position:relative;font-family:var(--sd-text-font-family);font-size:13px;font-weight:600;color:var(--sd-text-color);z-index:99999;background:var(--sd-background-color);padding:15px 15px 0}.container_dialpad_header_inner2{width:100%;margin:0;padding:15px 15px 0;background:#f7f7f7;background:linear-gradient(180deg,#f7f7f7 72%,#fff);border-radius:12px 12px 0 0;position:relative}.container_avaya_extension{width:100%;position:relative;display:flex;flex-direction:row;align-items:center;padding:8px 10px;border:1px solid var(--sd-border-color-light);border-radius:12px;margin-bottom:15px;background:#f0f0f0}.container_avaya_extension_left{display:flex;flex-basis:auto;flex-direction:column;flex-grow:1;justify-content:center}.container_avaya_extension_left .extension_label{display:flex;align-items:center;line-height:normal;text-align:left}.container_avaya_extension_left .extension_number{display:flex;align-items:center;line-height:20px}.container_avaya_extension_right{flex-basis:auto;flex-direction:column;flex-grow:1;text-align:right;justify-items:flex-end}.container_avaya_extension_right button{background:none;border:none;outline:none;color:#a6a6a6;font-weight:600;border-radius:50%;align-items:center;justify-content:center;-webkit-transition-duration:.3s;transition-duration:.3s;background:#f0f0f0;height:38px;width:38px}.container_avaya_extension_right button:hover{color:var(--sd-text-color-dark);background:var(--sd-border-color-light)}.dialpad_container_sd{position:absolute;width:100%;right:0;left:0;top:101px;height:calc(100vh - 101px);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}.scrollbox{height:100%;overflow-y:scroll;overflow-x:hidden;visibility:hidden;padding:0 0 7px;position:relative;scroll-behavior:smooth;scrollbar-width:thin;width:100%}.scrollbox-content,.scrollbox:hover,.scrollbox:focus{visibility:visible}.container_contact_item{width:100%;position:relative;display:flex;flex-direction:row;align-items:center;padding:10px;border:1px solid var(--sd-border-color-light);border-radius:8px;overflow:hidden;margin-bottom:10px;cursor:pointer}.container_contact_item_image{display:flex}.container_contact_item_image_inner{margin:0 auto;padding:0;width:50px;height:50px;position:relative}.container_contact_item_left{display:flex;flex-basis:auto;flex-direction:column;flex-grow:1}.container_contact_item_left_inner{display:flex;flex-basis:1;flex-direction:column;padding:0 0 0 10px}.container_contact_item_left .contact_field{font-size:13px;margin-bottom:2px}.contact_dark{color:var(--sd-text-color-dark)}.contact_gray{color:var(--sd-text-color-medium)}.container_contact_item_left .contact_field_grey{font-size:12px;color:var(--sd-text-color);padding-top:2px;display:flex}.container_contact_item_left .contact_field_green{font-size:13px;margin-bottom:2px;color:#6c0}.container_contact_item_left .contact_field_highlighted{display:flex;font-size:11px;color:var(--sd-text-color-medium)}.container_contact_item_left .contact_field_highlighted span{background:#6c0;border-radius:3px;text-transform:uppercase;color:var(--sd-text-color-inverse);font-size:9px;padding:2px 4px}.container_contact_item_right{display:flex;flex-direction:row}.container_contact_item_right .right_field{display:flex;flex-basis:auto;justify-content:right}.container_contact_item_right .right_field_highlighted{font-size:16px;color:#29abe0}.container_contact_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)}.container_contact_item_right .right_recent_content{display:inline-block;padding:0;font-size:11px;color:var(--sd-text-color)}.container_contact_item_right .container_rating{font-size:11px;cursor:pointer}.container_contact_item_right .container_rating span{color:gray;transition:color .3s}.container_contact_item_right .container_rating span.filled{color:gold}.container_dialpad_digits{width:100%;display:flex;justify-content:center;margin-bottom:10px;flex-direction:column}.container_dialpad_row{display:flex;column-gap:10px;flex-direction:row;flex-shrink:0;justify-content:center;margin-bottom:10px}.button_dialpad_digit{display:block;width:50px;height:50px;display:flex;column-gap:20px;margin:0 10px;align-items:center;justify-content:center;line-height:normal;border-radius:50%;outline:none;border:none;font-size:22px;font-weight:700;color:var(--sd-text-color-dark);background:var(--sd-background-color);-webkit-transition-duration:.3s;transition-duration:.3s;box-shadow:#0000001a 0 0 5px,#0000001a 0 0 1px;border:1px solid #ebebeb}.button_dialpad_digit:hover{background:#000;color:var(--sd-text-color-inverse)}.button_call_green{background:#6c0;color:var(--sd-text-color-inverse);width:60px;height:60px;-webkit-transition-duration:.3s;transition-duration:.3s}.button_call_green:hover{background:#5ab400;color:var(--sd-text-color-inverse);width:60px;height:60px}.button_call_red{background:#e0261f;color:var(--sd-text-color-inverse);width:60px;height:60px;-webkit-transition-duration:.3s;transition-duration:.3s;z-index:9999}.button_call_red:hover{background:#cf211a}.button_call_disabled{background:#eee;color:var(--sd-text-color-light);width:60px;height:60px;-webkit-transition-duration:.3s;transition-duration:.3s}.container_dialpad_buttons{width:100%;display:flex;justify-content:center;padding-top:0;margin-bottom:6px}.container_call_header{width:100%;position:absolute;top:0;left:0;right:0;height:221px;font-family:var(--sd-text-font-family);font-size:13px;font-weight:600;color:var(--sd-text-color);z-index:99;background:var(--sd-background-color)}.container_call_header_inner{width:100%;margin:0;padding:10px 15px 15px;position:relative}.container_call_info{display:flex;justify-content:center;font-size:14px;font-weight:600;width:100%;color:var(--sd-text-color)}.container_call_info_blinker{display:flex;justify-content:center;font-size:14px;font-weight:600;width:100%;color:red;animation:blinker 1s linear infinite}@keyframes blinker{26%{opacity:0}}.container_call_ani{width:100%;margin:0;padding:0}.container_call_ani_number{text-align:center;font-size:20px;font-weight:600;padding-top:26px}.container_call_ani_name{text-align:center;font-size:13px;font-weight:600;padding-top:2px}.container_call_ani_image{margin:0;padding:24px 0 0;width:100%}.container_call_ani_image_inner{display:flex;align-items:center;flex:0 0 auto;padding:0;width:85px;height:85px;position:relative;margin:0 auto;border-radius:100%}.container_call_content{width:100%;position:absolute;top:221px;left:0;right:0;height:calc(100% - 221px);font-family:var(--sd-text-font-family);font-size:13px;font-weight:600;color:var(--sd-text-color);padding-top:20px;display:flex;flex-basis:auto;flex-direction:column;align-items:center;justify-content:center}.container_call_dnis{width:100%;text-align:center;padding-bottom:16px}.container_call_dnis span{display:inline-block;border-radius:26px;border:1px solid #e5e5e5;padding:5px 16px}.container_call_options{width:100%;display:flex;justify-content:center;margin-bottom:16px;flex-direction:column}.button_call_option{display:block;width:80px;height:60px;display:flex;flex-direction:column;flex-shrink:0;column-gap:0px;margin:0 10px;align-items:center;justify-content:center;line-height:normal;outline:none;border:none;font-size:12px;font-weight:600;color:var(--sd-text-color-dark);background:none;-webkit-transition-duration:.3s;transition-duration:.3s;position:relative}.button_call_option .button_icon{display:flex;justify-content:center;align-items:center;height:40px}.button_call_option .button_text{display:flex;justify-content:center;color:var(--sd-text-color)}.button_active{color:#67cc02}.button_elevated{position:relative;z-index:9999}.button_disabled{color:gray;cursor:not-allowed;pointer-events:none;opacity:.6}.button_call_option[disabled],.button_disabled{opacity:.5;pointer-events:none;display:inline-flex}.container_popup_dialpad{position:absolute;z-index:999;left:0;right:0;bottom:0}.container_popup_dialpad_inner{background:#f1f1f1;background:linear-gradient(180deg,#f1f1f1 44%,#fff);margin:0 auto;padding:10px 15px 20px;border-radius:8px;width:88%;position:relative;height:475px}.container_popup_dialpad .button_close{position:absolute;right:-15px;top:-17px;z-index:9}.container_popup_dialpad .button_close span{width:32px;height:32px;background:var(--sd-background-color);display:flex;align-items:center;justify-content:center;border-radius:50%;cursor:pointer;box-shadow:#0000001a 0 0 5px,#0000001a 0 0 1px;border:1px solid #ebebeb}.container_popup_dialpad .button_close span:hover{background:#f1f1f1;color:var(--sd-text-color-dark)}.container_popup_dialpad .button_close span .fa-xmark{font-size:1.4em;font-weight:400}.container_dtmf_input{width:100%;margin:0;padding:0 0 10px;position:relative}.container_dtmf_input input{width:100%;display:flex;height:38px;outline:none;text-align:center;align-items:center;border:1px solid #f1f1f1;font-size:26px;font-weight:400;color:transparent;text-shadow:0 0 0 #000;padding:0;background:#f1f1f1}.container_active_call_header{width:100%;position:relative;display:flex;flex-direction:row;align-items:center;padding:10px;border:1px solid var(--sd-border-color-light);border-radius:12px;overflow:hidden}.container_active_call_avatar{display:flex}@keyframes play1{0%{transform:scale(1)}15%{box-shadow:0 0 0 2px #57b84666}25%{box-shadow:0 0 0 3px #98d48266,0 0 0 20px #fff3}25%{box-shadow:0 0 0 5px #bde4a966,0 0 0 30px #fff3}}.container_active_call_avatar_inner{margin:0 auto;padding:0;width:50px;height:50px;background:#dfe6e8;color:var(--sd-text-color-dark);position:relative;animation:play1 2s ease infinite;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;border-radius:100%;overflow:hidden;display:flex;justify-content:center;align-items:center}.container_active_call_info{display:flex;flex-basis:auto;flex-direction:column;flex-grow:1}.container_active_call_info_inner{display:flex;flex-basis:1;flex-direction:column;padding:0 0 0 10px}.container_active_call_duration{display:flex;justify-content:center;font-size:14px;font-weight:600;width:100%;color:var(--sd-text-color);margin-bottom:10px}.container_active_call_number{font-size:13px;margin-bottom:2px}.container_active_call_details{font-size:13px;color:#6c0;padding-top:2px}.container_active_call_details_inner{display:flex;margin:0;padding:0;justify-content:left}.container_active_call_icon_grey{display:flex;width:18px;height:16px;justify-content:center;align-items:center;color:var(--sd-text-color-medium)}.container_active_call_icon_green{display:flex;width:18px;height:16px;justify-content:center;align-items:center;color:#6c0}.container_active_call_status_green{display:flex;justify-content:center;align-items:center;color:#6c0;padding-left:6px;font-size:12px}.container_active_call_status_grey{display:flex;justify-content:center;align-items:center;color:var(--sd-text-color-medium);padding-left:6px;font-size:12px}.container_active_call_options{display:flex;flex-direction:row}.container_active_call_options .button_active_call_options{display:flex;flex-basis:auto;justify-content:right}.container_active_call_options .button_active_call_options_highlighted{font-size:16px;color:#29abe0}.container_active_call_options_button{display:flex;border-radius:26px;border:none;padding:0;font-size:11px;color:var(--sd-text-color);width:32px;height:32px;justify-content:center;align-items:center}.container_active_call_options_button:hover{background:#f1f1f1}.container_conference_contact_list{position:relative;width:100%;background:#f7f7f7;border-top:1px solid #eee;border-bottom:1px solid #eee;height:149px;padding:0;margin-top:16px}.container_swap_merge_contact_list{position:relative;width:100%;background:var(--sd-background-color);height:149px;padding:0;margin-top:32px}.container_conference_contact_list_inner{margin:0;padding:0;position:relative;width:100%;height:100%}.container_conference_contact_list_scrollbox{padding:12px 15px}.container_conference_contact_item{width:100%;position:relative;display:flex;flex-direction:row;align-items:center;padding:0 10px;overflow:hidden;cursor:pointer}.button_disconnect_call{display:block;width:42px;height:42px;display:flex;margin:0;align-items:center;justify-content:center;line-height:normal;border-radius:50%;outline:none;border:none;color:#e0261f;background:#f7f7f7;-webkit-transition-duration:.3s;transition-duration:.3s}.button_disconnect_call:hover{color:var(--sd-text-color-inverse);background:#e0261f;-webkit-transition-duration:.3s;transition-duration:.3s}.container_separator{height:1px;width:100%;background:#ededed;margin:11px 0}.container_transfer_call{position:absolute;z-index:99999;left:0;right:0;bottom:-51px;width:100%;background:var(--sd-background-color)}.container_transfer_call_inner{background:var(--sd-background-color);box-shadow:#11111a1a 0 4px 16px,#11111a0d 0 8px 32px;padding:20px 15px 10px;border-radius:0;width:100%;position:relative;height:596px;overflow:hidden}.container_transfer_call_inner h2{font-family:var(--sd-text-font-family);font-size:20px;font-weight:700;color:var(--sd-text-color-dark);letter-spacing:-1px;padding:0;line-height:normal;text-transform:capitalize;margin-bottom:15px}.container_button_close{position:absolute;right:4px;top:4px}.container_button_close span{width:36px;height:36px;background:var(--sd-background-color);display:flex;align-items:center;justify-content:center;border-radius:50%;cursor:pointer}.container_button_close span:hover{background:var(--sd-background-color)}.container_button_close .fa-xmark{font-size:1.6em;font-weight:400;color:var(--sd-text-color-light)}.container_button_close span:hover .fa-xmark:hover{color:var(--sd-text-color-dark)}.container_transfer_call_content{margin:0;padding:5px 0 0;width:100%;background:var(--sd-background-color);min-height:485px}.container_transfer_call_content h3{font-family:var(--sd-text-font-family);font-size:14px;font-weight:700;color:var(--sd-text-color);letter-spacing:-.26px;padding:8px 0 0;line-height:normal;text-transform:capitalize;margin-bottom:15px}.container_transfer_call_content h3 span{color:var(--sd-text-color-dark)}.container_transfer_call_details{width:100%;margin:0;padding:10px 15px 69px;position:relative}.container_transfer_tab_buttons{display:flex;gap:10px;align-items:center;margin-bottom:15px}.button_transfer_tab{padding:10px;border:none;font-family:var(--sd-text-font-family);font-size:13px;font-weight:600;color:var(--sd-text-color);background-color:var(--sd-border-color-light);cursor:pointer;width:105px;border-radius:28px;outline:none}.button_transfer_tab.active{background-color:var(--sd-app-color);color:#fff}.container_transfer_tab_content{margin:0;padding:0;width:100%}.container_transfer_internal_search{margin:0 0 15px;padding:0;width:100%}.container_transfer_internal_search input{padding:0 16px;width:100%;outline:none;display:block;border:1px solid var(--sd-border-color-dark);color:var(--sd-text-color-medium);font-size:12px;letter-spacing:-.25px;font-family:var(--sd-text-font-family);background:var(--sd-background-color);font-style:italic;font-weight:400;position:relative;border-radius:27px;height:48px}.container_transfer_contact_list{width:100%;margin:0;padding:0;position:relative;height:336px}.container_transfer_contact_list_inner{width:100%;position:relative;height:100%}.container_transfer_internal_contact_list{position:absolute;width:100%;left:0;right:0;background:var(--sd-background-color);height:332px}.container_transfer_disconnect{width:100%;display:flex;justify-content:center;padding-top:3px;margin-bottom:6px}.container_avaya_footer{width:100%;padding:0;background:#f7f7f7;font-family:var(--sd-text-font-family);font-size:13px;font-weight:600;color:var(--sd-text-color-medium);position:relative;display:flex;height:51px;justify-content:center;align-items:center;border-top:1px solid var(--sd-border-color-light);-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:999;position:absolute;bottom:0;left:0}.margin_bottom_16{margin-bottom:16px}.margin_bottom_nt{margin-bottom:10px}.padding_top_nt{padding-top:7px}.shadow_st{box-shadow:#00000026 0 2px 8px}.call_animation{animation:play 2s ease infinite;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}.mini-call-switcher{display:flex;justify-content:center;margin-top:10px}.mini-call{padding:6px 12px;margin:0 6px;background:#eaeaea;border-radius:8px;cursor:pointer;font-size:14px}.mini-call.active{background-color:#c6f6d5;font-weight:700}.history-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#00000080;z-index:999}.history-popup{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:var(--sd-background-color);padding:20px;z-index:1000;box-shadow:0 2px 10px #0000004d;border-radius:5px;width:600px;max-height:80vh;overflow-y:auto}.history-content{position:relative}.history-content h3{margin-top:0}.close-btn{background:transparent;border:none;font-size:1.5rem;position:absolute;top:0;right:0;cursor:pointer}.history-content table{width:100%;border-collapse:collapse;margin-top:1rem}.history-content th,.history-content td{padding:.5rem;border:1px solid var(--sd-text-color-light)}@keyframes play{0%{transform:scale(1)}15%{box-shadow:0 0 0 4px #57b84680}25%{box-shadow:0 0 0 5px #98d48266,0 0 0 20px #fff3}25%{box-shadow:0 0 0 10px #c2e5b180,0 0 0 30px #fff3}}::-webkit-input-placeholder{color:#ddd}::-moz-placeholder{color:var(--sd-text-color-dark)}:-ms-input-placeholder{color:var(--sd-text-color-dark)}:-moz-placeholder{color:var(--sd-text-color-dark)}.slide_st{left:-100px;-webkit-animation:slide .5s forwards;-webkit-animation-delay:2s;animation:slide .5s forwards;animation-delay:0s}@-webkit-keyframes slide{to{left:0}}@keyframes slide{to{left:0}}.tabs_sd{width:100%;position:absolute;bottom:0;left:0;right:0;display:flex;height:51px;border-top:1px solid var(--sd-border-color-light);background:#f9f9f9;z-index:999999}.tab_heading_btn{display:flex;flex-basis:auto;flex-direction:column;flex-grow:1;justify-content:center;min-width:0;align-items:center;padding:0;border:none;cursor:pointer;width:25%;font-family:var(--sd-text-font-family);font-size:11px;font-weight:600;line-height:normal;color:var(--sd-text-color-medium);background:none;transition:background-color .3s linear;-webkit-transition:background-color .3s linear;-o-transition:background-color .3s linear;-ms-transition:background-color .3s linear}.nav_icon{display:flex;align-items:center;justify-content:center;height:22px;margin-bottom:1px}.nav_heading_sd{display:flex;align-items:center}.tab_heading_btn.active{color:var(--sd-app-color);background:url(data:image/gif;base64,R0lGODlhNwACAIAAAP9mMwAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OTc3NywgMjAyMy8wNi8yNS0yMzo1NzoxNCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODA1QUIyRjkwRDVFMTFGMDg4RUU4ODJGQTgxQUNDOEMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODA1QUIyRkEwRDVFMTFGMDg4RUU4ODJGQTgxQUNDOEMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4MDVBQjJGNzBENUUxMUYwODhFRTg4MkZBODFBQ0M4QyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4MDVBQjJGODBENUUxMUYwODhFRTg4MkZBODFBQ0M4QyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAAAAAAALAAAAAA3AAIAAAIJhI+py+0Po0wFADs=) top center no-repeat}.tab-content_sd{width:100%;height:100%;font-family:var(--sd-text-font-family);font-size:13px;font-weight:600;line-height:normal;background:var(--sd-background-color);-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}.container_transfer_fav_list{width:100%;margin:0;padding:0;position:relative;height:376px}.outer_container_swap_merge{width:100%;margin:0;padding:0}.container_swap_merge_item{width:100%;position:relative;display:flex;flex-direction:row;height:72px;border-radius:8px;overflow:hidden}.container_recent_item_image{display:flex;align-items:center}.container_swap_merge_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}.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}.onhold_st{font-family:var(--sd-text-font-family);font-size:12px;color:var(--sd-text-color-medium);font-weight:600}.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}.button_swap_merge{display:block;width:32px;height:45px;display:flex;flex-direction:column;flex-shrink:0;column-gap:0px;margin:0 0 0 28px;align-items:center;justify-content:center;line-height:normal;outline:none;border:none;font-size:12px;font-weight:600;color:var(--sd-text-color-dark);background:none;-webkit-transition-duration:.3s;transition-duration:.3s;position:relative;pointer-events:all;cursor:pointer}.button_swap_merge .button_icon{display:flex;justify-content:center;align-items:center;height:40px}.button_swap_merge .button_text{display:flex;justify-content:center;color:var(--sd-text-color-dark)}@media only screen and (max-width: 767px){.previewcontent{width:95%!important}.bgSecWrap .numberArrow{left:0!important;top:-20px!important}.transcription-popup{position:fixed;bottom:20px;right:20px;width:320px;max-height:250px;background:#fff;border-radius:10px;box-shadow:0 4px 12px #0003;padding:12px;z-index:1000;display:flex;flex-direction:column}.transcription-header{display:flex;justify-content:space-between;align-items:center;font-weight:700;font-size:14px;margin-bottom:8px}.transcription-body{overflow-y:auto;font-size:13px;line-height:1.4;color:#333}.close-btn{border:none;background:transparent;font-size:18px;cursor:pointer}}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.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$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i10.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i10.MatLabel, selector: "mat-label" }, { kind: "directive", type: i10.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i10.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i11.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: "directive", type: i5.NativeElementInjectorDirective, selector: "[ngModel], [formControl], [formControlName]" }, { kind: "component", type: CallHistoryComponent, selector: "app-call-history", inputs: ["mode"], outputs: ["makeCallEv", "transferEv"] }, { kind: "component", type: DialpadComponent, selector: "app-dialpad", inputs: ["contacts"], outputs: ["makeCallEv"] }, { kind: "component", type: DeviceSelectorComponent, selector: "app-device-selector", inputs: ["selectedAudioInputId", "selectedAudioOutputId"], outputs: ["change"] }], animations: [
|
|
2794
|
+
trigger('slideInOut', [
|
|
2795
|
+
transition(':enter', [
|
|
2796
|
+
style({ transform: 'translateX(100%)', opacity: 0 }),
|
|
2797
|
+
animate('300ms ease-in', style({ transform: 'translateX(0)', opacity: 1 })),
|
|
2798
|
+
]),
|
|
2799
|
+
transition(':leave', [
|
|
2800
|
+
animate('300ms ease-out', style({ transform: 'translateX(-100%)', opacity: 0 })),
|
|
2801
|
+
]),
|
|
2802
|
+
]),
|
|
2803
|
+
] });
|
|
2804
|
+
}
|
|
2805
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: AvayaIPOWidgetComponent, decorators: [{
|
|
2806
|
+
type: Component,
|
|
2807
|
+
args: [{ selector: 'snugdesk-avaya-ipo-widget', animations: [
|
|
2808
|
+
trigger('slideInOut', [
|
|
2809
|
+
transition(':enter', [
|
|
2810
|
+
style({ transform: 'translateX(100%)', opacity: 0 }),
|
|
2811
|
+
animate('300ms ease-in', style({ transform: 'translateX(0)', opacity: 1 })),
|
|
2812
|
+
]),
|
|
2813
|
+
transition(':leave', [
|
|
2814
|
+
animate('300ms ease-out', style({ transform: 'translateX(-100%)', opacity: 0 })),
|
|
2815
|
+
]),
|
|
2816
|
+
]),
|
|
2817
|
+
], standalone: false, template: "@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\n @if (isReconnectingInProgress) {\n <span>Reconnecting to the server...</span>\n }\n\n @if (isFailoverInProgress) {\n <span>Failover in progress...</span>\n }\n\n @if (isFailbackInProgress) {\n <span>Failback in progress...</span>\n }\n\n <div class=\"container_connection_status_loader\">\n <div class=\"container_three_dot_loader\">\n <span class=\"dot\"></span>\n <span class=\"dot\"></span>\n <span class=\"dot\"></span>\n </div>\n </div>\n </div>\n </div>\n}\n\n\n\n@if (showLoginForm) {\n <!-- Login Form -->\n <div class=\"container_avaya_login\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n <div class=\"container_avaya_login_inner\">\n <div class=\"container_avaya_login_content\">\n\n <div class=\"container_avaya_logo\">\n <div class=\"container_avaya_logo_image\"></div>\n <h3>IP Office<span>TM</span></h3>\n </div>\n\n @if (hasAvayaSocketError || hasAvayaLoginError || hasAvayaLoginConflictError || hasAvayaDeviceError) {\n <div class=\"container_avaya_login_error\">\n <p class=\"message_label error_message\">\n @if (hasAvayaSocketError) {\n We're having trouble connecting to the server\n }\n @if (hasAvayaLoginError) {\n Invalid extension or password!\n }\n @if (hasAvayaLoginConflictError) {\n Another user is logged in with this extension\n }\n @if (hasAvayaDeviceError) {\n We're having trouble accessing your device\n }\n </p>\n </div>\n }\n\n <div class=\"container_avaya_login_form\">\n <form [formGroup]=\"loginForm\" (ngSubmit)=\"onLogin()\">\n\n <!-- Extension -->\n <div class=\"form_field\">\n <mat-form-field class=\"properties_form_field mat-form-field-outline\">\n <mat-label class=\"mdc-floating-disabled\">Extension</mat-label>\n <input matInput formControlName=\"ipoExtensionNo\" autocomplete=\"ipoExtensionNo\"\n (keypress)=\"restrictNumeric($event)\" />\n\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 </div>\n\n <!-- Password -->\n <div class=\"form_field\">\n <mat-form-field class=\"properties_form_field mat-form-field-outline\">\n <mat-label class=\"mdc-floating-disabled\">Password</mat-label>\n <input matInput formControlName=\"ipoPassword\" autocomplete=\"avaya-ipo-password\"\n (keypress)=\"restrictNumeric($event)\" [type]=\"showLoginPassword ? 'text' : 'password'\" />\n\n <mat-icon matSuffix (click)=\"showLoginPassword = !showLoginPassword && !hasAvayaSocketError\">\n @if (showLoginPassword) {\n <span class=\"container_icon_eye\">\n <i class=\"fa-solid fa-eye\"></i>\n </span>\n } @else {\n <span class=\"container_icon_eye\">\n <i class=\"fa-solid fa-eye-slash\"></i>\n </span>\n }\n </mat-icon>\n\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 </div>\n\n <!-- Login button -->\n <div class=\"avaya_login_button_area\">\n <button type=\"submit\" class=\"button_submit_login\"\n [ngClass]=\"{ 'button_submit_login_loader': showLoginLoader }\"\n [disabled]=\"showLoginLoader\">\n @if (showLoginLoader) {\n <span class=\"button_submit_loader\"></span>\n } @else {\n <span>Login</span>\n }\n </button>\n </div>\n\n </form>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n} @else {\n <!-- Softphone UI -->\n <ng-container *ngTemplateOutlet=\"showSoftphoneDiv\"></ng-container>\n}\n\n<!-- Footer (always visible) -->\n<div class=\"container_avaya_footer\">© 2025 SNUG Technologies Pvt. Ltd.\n\n\n\n</div>\n\n\n\n\n\n<ng-template #showSoftphoneDiv>\n\n@if (!showActiveCall) {\n <div class=\"container_avaya_softphone_inner\">\n <!-- ------------------- Keypad work start ---------- -->\n @if (bottomActiveTab === 'keypad_sd') {\n <div class=\"tab-content_sd\">\n <div class=\"container_dialpad_header\">\n <div class=\"container_dialpad_header_inner2\">\n <div class=\"container_avaya_extension\">\n <div class=\"container_avaya_extension_left\">\n <div class=\"extension_label\">Extension</div>\n <div class=\"extension_number\">{{ extensionNumber }}</div>\n </div>\n <div class=\"container_avaya_extension_right\">\n <button title=\"Sign out\" (click)=\"onLogout()\">\n <svg width=\"16px\" fill=\"currentColor\" viewBox=\"0 0 512 512\">\n <path\n d=\"M377.9 105.9L500.7 228.7c7.2 7.2 11.3 17.1 11.3 27.3s-4.1 20.1-11.3 27.3L377.9 406.1c-6.4 6.4-15 9.9-24 9.9c-18.7 0-33.9-15.2-33.9-33.9l0-62.1-128 0c-17.7 0-32-14.3-32-32l0-64c0-17.7 14.3-32 32-32l128 0 0-62.1c0-18.7 15.2-33.9 33.9-33.9c9 0 17.6 3.6 24 9.9zM160 96L96 96c-17.7 0-32 14.3-32 32l0 256c0 17.7 14.3 32 32 32l64 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-64 0c-53 0-96-43-96-96L0 128C0 75 43 32 96 32l64 0c17.7 0 32 14.3 32 32s-14.3 32-32 32z\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"dialpad_container_sd\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n <app-dialpad [contacts]=\"contacts\" (makeCallEv)=\"makeCall($event)\"></app-dialpad>\n <!-- to do list -->\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- ------------------- Keypad work end ---------- -->\n\n @if (bottomActiveTab === 'recent_sd') {\n <div class=\"tab-content_sd\">\n <app-call-history (makeCallEv)=\"makeCallFromContact($event)\"></app-call-history>\n </div>\n }\n\n @if (bottomActiveTab === 'settings_sd') {\n <div class=\"tab-content_sd\">\n <app-device-selector (change)=\"handleDeviceSelection($event)\"></app-device-selector>\n </div>\n }\n </div>\n\n <div class=\"tabs_sd\">\n <button class=\"tab_heading_btn\" (click)=\"bottomSelectTab('recent_sd')\"\n [class.active]=\"bottomActiveTab === 'recent_sd'\">\n <span class=\"nav_icon\">\n <svg width=\"19px\" viewBox=\"0 0 512 512\">\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=\"nav_heading_sd\">Recent</span>\n </button>\n\n <button class=\"tab_heading_btn\" (click)=\"bottomSelectTab('keypad_sd')\"\n [class.active]=\"bottomActiveTab === 'keypad_sd'\">\n <span class=\"nav_icon\">\n <svg width=\"20px\" viewBox=\"0 0 512 512\">\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=\"nav_heading_sd\">Keypad</span>\n </button>\n\n <button class=\"tab_heading_btn\" (click)=\"bottomSelectTab('settings_sd')\"\n [class.active]=\"bottomActiveTab === 'settings_sd'\">\n <span class=\"nav_icon\">\n <svg width=\"19px\" viewBox=\"-0.03 0 16.079 16.079\">\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 </span>\n <span class=\"nav_heading_sd\">Preferences</span>\n </button>\n </div>\n} @else {\n <ng-container *ngTemplateOutlet=\"showActiveCallDiv\"></ng-container>\n}\n\n\n<!-- ////////////// -->\n\n <!-- Active Call Div -->\n \n <ng-template #showActiveCallDiv>\n\n\n @if (showTranscriptionPopup) {\n <div class=\"transcription-popup\">\n <div class=\"transcription-header\">\n <span>Live Transcription</span>\n <button class=\"close-btn\" (click)=\"showTranscriptionPopup = false\">\u00D7</button>\n </div>\n <div class=\"transcription-body\">\n <p>{{ transcriptText }}</p>\n </div>\n </div>\n}\n\n\n\n\n\n\n\n<div class=\"container_call\">\n <div class=\"container_call_header\">\n <div class=\"container_call_header_inner\">\n\n @if (!conferenceParticipants || conferenceParticipants.length <= 1) {\n <!-- ------------ add call list swap and merge area start ---------------- -->\n @if (activeCalls.length > 1) {\n <div class=\"container_swap_merge_list\">\n <div class=\"container_conference_contact_list_inner\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n <div class=\"outer_container_swap_merge\">\n @for (call of activeCalls; track call.phoneNumber; let i = $index) {\n @if (i !== currentActiveCallIndex) {\n <div class=\"container_swap_merge_item\"\n (click)=\"swapLinesToIndex(i)\"\n [ngClass]=\"{ 'active-call': i === currentActiveCallIndex, 'other-call': i !== currentActiveCallIndex }\">\n\n <!-- Avatar -->\n <div class=\"container_recent_item_image\">\n <div class=\"container_swap_merge_item_image_inner\">\n <!-- svg avatar here -->\n </div>\n </div>\n\n <!-- Call Info -->\n <div class=\"container_recent_item_left\">\n <div class=\"container_recent_item_left_inner\">\n <div class=\"contact_field\">{{ call.phoneNumber }}</div>\n @if (call.isOnHold) {\n <div class=\"onhold_st\">On hold</div>\n }\n </div>\n\n <!-- Action Buttons -->\n <div class=\"container_recent_item_right\">\n <div class=\"right_field\">\n <button class=\"button_swap_merge\">\n <div class=\"button_icon\">\n <!-- merge svg -->\n </div>\n <div class=\"button_text\">Merge</div>\n </button>\n </div>\n <div class=\"right_field\">\n <button class=\"button_swap_merge\">\n <div class=\"button_icon\">\n <!-- swap svg -->\n </div>\n <div class=\"button_text\">Swap</div>\n </button>\n </div>\n </div>\n </div>\n </div>\n }\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n <!-- ------------ add call list swap and merge area end ---------------- -->\n\n @if (isCalling) {\n <div class=\"container_call_info\">Calling...</div>\n } @else {\n @if (isactiveCall) {\n <div class=\"container_call_info\">\n {{ formatTime(activeCalls[currentActiveCallIndex].duration) }}\n </div>\n }\n @if (showCallDisconnected) {\n <div class=\"container_call_info_blinker\">\n <!-- disconnected svg -->\n {{ this.istransfer ? 'Call Transferred' : 'Call ended' }}\n </div>\n }\n }\n\n <div class=\"container_call_ani\">\n @if (isCalling && displayCallingNumber && activeCalls.length === 0) {\n <!-- show what the user dialed while call is spinning up -->\n <div class=\"container_call_ani_number\">\n {{ displayCallingNumber }}\n </div>} \n @else if (activeCalls.length > 0) {\n <div class=\"container_call_ani_number\">\n {{ activeCalls[currentActiveCallIndex].lookupPhoneNumber.country?.flag }}\n {{ activeCalls[currentActiveCallIndex].phoneNumber }}\n \n </div>\n <div class=\"container_call_ani_name\">\n {{ activeCalls[currentActiveCallIndex].lookupPhoneNumber.phoneNumber?.location }}\n </div>\n } @else {\n <div class=\"container_call_ani_number\">\n {{ lastDisconnectedCall?.lookupPhoneNumber?.country?.flag }}\n {{ lastDisconnectedCall?.phoneNumber }}\n </div>\n <div class=\"container_call_ani_name\">\n {{ lastDisconnectedCall?.lookupPhoneNumber?.phoneNumber?.location }}\n </div>\n }\n\n <div class=\"container_call_ani_image\">\n <div class=\"container_call_ani_image_inner\" [ngClass]=\"{ 'call_animation': isactiveCall }\">\n <!-- big avatar svg -->\n </div>\n </div>\n </div>\n\n } @else {\n <!-- Conference Call Placeholder -->\n <!-- @if block can render conference call template here -->\n }\n\n </div>\n </div>\n\n <div class=\"container_call_content\">\n <div class=\"container_call_dnis\">\n <span>Ext. {{ extensionNumber }}</span>\n </div>\n\n <div class=\"container_call_options\">\n <div class=\"container_dialpad_row margin_bottom_16\">\n <button class=\"button_call_option button_elevated\"\n [ngClass]=\"{ 'button_disabled': !isactiveCall && activeCalls.length < 4 }\"\n (click)=\"onAddCall()\"\n [disabled]=\"!isactiveCall\">\n <div class=\"button_icon\"> \n <svg fill=\"#000000\" width=\"20\" viewBox=\"0 0 52 52\" enable-background=\"new 0 0 52 52\"\n xml:space=\"preserve\">\n <path fill=\"currentColor\" d=\"M30,29h16.5c0.8,0,1.5-0.7,1.5-1.5v-3c0-0.8-0.7-1.5-1.5-1.5H30c-0.6,0-1-0.4-1-1V5.5C29,4.7,28.3,4,27.5,4\n h-3C23.7,4,23,4.7,23,5.5V22c0,0.6-0.4,1-1,1H5.5C4.7,23,4,23.7,4,24.5v3C4,28.3,4.7,29,5.5,29H22c0.6,0,1,0.4,1,1v16.5\n c0,0.8,0.7,1.5,1.5,1.5h3c0.8,0,1.5-0.7,1.5-1.5V30C29,29.4,29.4,29,30,29z\" />\n </svg>\n </div>\n <div class=\"button_text\">Add</div>\n </button>\n\n @if (activeCalls.length > 0) {\n <button class=\"button_call_option\" (click)=\"onAddCall()\" type=\"button\">\n <div class=\"button_icon\"> <svg width=\"20\" viewBox=\"0 0 52 52\" aria-hidden=\"true\">\n <path fill=\"currentColor\"\n d=\"M30,29h16.5c0.8,0,1.5-0.7,1.5-1.5v-3c0-0.8-0.7-1.5-1.5-1.5H30c-0.6,0-1-0.4-1-1V5.5C29,4.7,28.3,4,27.5,4h-3\n C23.7,4,23,4.7,23,5.5V22c0,0.6-0.4,1-1,1H5.5C4.7,23,4,23.7,4,24.5v3C4,28.3,4.7,29,5.5,29H22c0.6,0,1,0.4,1,1v16.5\n c0,0.8,0.7,1.5,1.5,1.5h3c0.8,0,1.5-0.7,1.5-1.5V30C29,29.4,29.4,29,30,29z\"/>\n </svg></div>\n <div class=\"button_text\">Conference</div>\n </button>\n }\n\n @if (!isRecording) {\n <button class=\"button_call_option button_elevated\"\n [ngClass]=\"{ 'button_disabled': !isactiveCall }\"\n [disabled]=\"!isactiveCall\">\n <div class=\"button_icon\"> <svg width=\"22px\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path fill=\"currentColor\" d=\"M3 10L3 14M7.5 6L7.5 18M12 3V21M16.5 6V18M21 10V14\" stroke=\"#000000\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg></div>\n <div class=\"button_text\">Record</div>\n </button>\n } @else {\n <button class=\"button_call_option button_elevated\"\n [ngClass]=\"{ 'button_disabled': !isactiveCall }\"\n [disabled]=\"!isactiveCall\">\n <div class=\"button_icon\"><svg width=\"22px\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path fill=\"currentColor\" d=\"M3 10L3 14M7.5 6L7.5 18M12 3V21M16.5 6V18M21 10V14\" stroke=\"#000000\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg></div>\n <div class=\"button_text\">Stop</div>\n </button>\n }\n\n <button class=\"button_call_option button_elevated\"\n [ngClass]=\"{ 'button_disabled': !isactiveCall }\"\n [disabled]=\"!isactiveCall\"\n (click)=\"isCallTransferOpen = !isCallTransferOpen\">\n <div class=\"button_icon\"> <svg width=\"25px\" height=\"25px\" viewBox=\"0 0 48 48\" version=\"1\" enable-background=\"new 0 0 48 48\">\n <path fill=\"currentColor\"\n d=\"M39.2,8.4l-1.8,1.8c-6.3,6.5-5.4,22,0,27.6l1.8,1.8c0.5,0.5,1.3,0.5,1.8,0l3.6-3.7c0.5-0.5,0.5-1.3,0-1.8 l-3.4-3.4h-4.8c-1.3-1.3-1.3-12.1,0-13.4h4.8l3.3-3.4c0.5-0.5,0.5-1.3,0-1.8L41,8.4C40.5,7.9,39.7,7.9,39.2,8.4z\" />\n <path fill=\"currentColor\"\n d=\"M11.2,8.4l-1.8,1.8c-6.3,6.5-5.4,22,0,27.6l1.8,1.8c0.5,0.5,1.3,0.5,1.8,0l3.6-3.7c0.5-0.5,0.5-1.3,0-1.8 l-3.4-3.4H8.5c-1.3-1.3-1.3-12.1,0-13.4h4.8l3.3-3.4c0.5-0.5,0.5-1.3,0-1.8L13,8.4C12.5,7.9,11.7,7.9,11.2,8.4z\" />\n <g fill=\"currentColor\">\n <polygon points=\"25.3,18.6 30.7,24 25.3,29.4\" />\n <rect x=\"16\" y=\"22\" width=\"11\" height=\"4\" />\n </g>\n </svg></div>\n <div class=\"button_text\">Transfer</div>\n </button>\n\n @if (isCallTransferOpen) {\n <ng-container *ngTemplateOutlet=\"callTransferTemplate\"></ng-container>\n }\n </div>\n\n <!-- Mute / Unmute -->\n <div class=\"container_dialpad_row\">\n @if (activeCalls.length > 0 && !this.activeCalls[this.currentActiveCallIndex].isMuted) {\n <button class=\"button_call_option button_elevated\"\n (click)=\"toggleMute()\"\n [ngClass]=\"{ 'button_disabled': showCallDisconnected }\">\n <div class=\"button_icon\"> <svg viewBox=\"0 0 384 512\" width=\"16\">\n <path fill=\"currentColor\"\n d=\"M192 0C139 0 96 43 96 96l0 160c0 53 43 96 96 96s96-43 96-96l0-160c0-53-43-96-96-96zM64 216c0-13.3-10.7-24-24-24s-24 10.7-24 24l0 40c0 89.1 66.2 162.7 152 174.4l0 33.6-48 0c-13.3 0-24 10.7-24 24s10.7 24 24 24l72 0 72 0c13.3 0 24-10.7 24-24s-10.7-24-24-24l-48 0 0-33.6c85.8-11.7 152-85.3 152-174.4l0-40c0-13.3-10.7-24-24-24s-24 10.7-24 24l0 40c0 70.7-57.3 128-128 128s-128-57.3-128-128l0-40z\" />\n </svg></div>\n <div class=\"button_text\">Mute</div>\n </button>\n } @else if (activeCalls.length > 0 && this.activeCalls[this.currentActiveCallIndex].isMuted) {\n <button class=\"button_call_option button_active button_elevated\" (click)=\"toggleMute()\">\n <div class=\"button_icon\"> <svg width=\"26\" viewBox=\"0 0 640 512\">\n <path fill=\"currentColor\"\n d=\"M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L472.1 344.7c15.2-26 23.9-56.3 23.9-88.7l0-40c0-13.3-10.7-24-24-24s-24 10.7-24 24l0 40c0 21.2-5.1 41.1-14.2 58.7L416 300.8 416 96c0-53-43-96-96-96s-96 43-96 96l0 54.3L38.8 5.1zM344 430.4c20.4-2.8 39.7-9.1 57.3-18.2l-43.1-33.9C346.1 382 333.3 384 320 384c-70.7 0-128-57.3-128-128l0-8.7L144.7 210c-.5 1.9-.7 3.9-.7 6l0 40c0 89.1 66.2 162.7 152 174.4l0 33.6-48 0c-13.3 0-24 10.7-24 24s10.7 24 24 24l72 0 72 0c13.3 0 24-10.7 24-24s-10.7-24-24-24l-48 0 0-33.6z\" />\n </svg></div>\n <div class=\"button_text\">Unmute</div>\n </button>\n }\n\n <!-- Hold / Unhold -->\n @if (activeCalls.length > 0 && !this.activeCalls[this.currentActiveCallIndex].isOnHold) {\n <button class=\"button_call_option button_elevated\"\n [ngClass]=\"{ 'button_disabled': !isactiveCall }\"\n [disabled]=\"!isactiveCall\"\n (click)=\"toggleHold()\">\n <div class=\"button_icon\"> <svg viewBox=\"0 0 320 512\" width=\"14\">\n <path fill=\"currentColor\" d=\"M128 64L0 64 0 448l128 0 0-384zm192 0L192 64l0 384 128 0 0-384z\" />\n </svg></div>\n <div class=\"button_text\">Hold</div>\n </button>\n } @else if (activeCalls.length > 0 && this.activeCalls[this.currentActiveCallIndex].isOnHold) {\n <button class=\"button_call_option button_active button_elevated\" (click)=\"toggleHold()\">\n <div class=\"button_icon\">\n <svg viewBox=\"0 0 320 512\" width=\"14\">\n <path fill=\"currentColor\" d=\"M128 64L0 64 0 448l128 0 0-384zm192 0L192 64l0 384 128 0 0-384z\" />\n </svg></div>\n <div class=\"button_text\">Unhold</div>\n </button>\n \n }\n\n <!-- Keypad -->\n <button class=\"button_call_option button_elevated\"\n [class.button_active]=\"isDailpadOpen\"\n (click)=\"menuDailpad()\"\n [ngClass]=\"{ 'button_disabled': showCallDisconnected }\">\n <div class=\"button_icon\"> <svg width=\"22px\" height=\"22px\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M256,400a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M256,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M256,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M256,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M384,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M384,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M384,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M128,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M128,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M128,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n </svg></div>\n <div class=\"button_text\">{{ isDailpadOpen ? 'Hide' : 'Keypad' }}</div>\n </button>\n\n @if (isDailpadOpen) {\n <div class=\"container_popup_dialpad\">\n <div class=\"container_popup_dialpad_inner\">\n <div [formGroup]=\"dtmfForm\">\n <div class=\"container_dtmf_input\">\n <input type=\"tel\" formControlName=\"dtmf\">\n </div>\n <div class=\"container_dialpad_digits\">\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('1')\">1</button>\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('2')\">2</button>\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('3')\">3</button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('4')\">4</button>\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('5')\">5</button>\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('6')\">6</button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('7')\">7</button>\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('8')\">8</button>\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('9')\">9</button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('*')\">\n <svg viewBox=\"0 0 512 512\" height=\"17px\">\n <path fill=\"currentColor\"\n d=\"M208 32c0-17.7 14.3-32 32-32l32 0c17.7 0 32 14.3 32 32l0 140.9 122-70.4c15.3-8.8 34.9-3.6 43.7 11.7l16 27.7c8.8 15.3 3.6 34.9-11.7 43.7L352 256l122 70.4c15.3 8.8 20.6 28.4 11.7 43.7l-16 27.7c-8.8 15.3-28.4 20.6-43.7 11.7L304 339.1 304 480c0 17.7-14.3 32-32 32l-32 0c-17.7 0-32-14.3-32-32l0-140.9L86 409.6c-15.3 8.8-34.9 3.6-43.7-11.7l-16-27.7c-8.8-15.3-3.6-34.9 11.7-43.7L160 256 38 185.6c-15.3-8.8-20.5-28.4-11.7-43.7l16-27.7C51.1 98.8 70.7 93.6 86 102.4l122 70.4L208 32z\" />\n </svg>\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('0')\">0</button>\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('#')\">\n <svg height=\"19px\" viewBox=\"0 0 448 512\">\n <path fill=\"currentColor\"\n d=\"M181.3 32.4c17.4 2.9 29.2 19.4 26.3 36.8L197.8 128l95.1 0 11.5-69.3c2.9-17.4 19.4-29.2 36.8-26.3s29.2 19.4 26.3 36.8L357.8 128l58.2 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-68.9 0L325.8 320l58.2 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-68.9 0-11.5 69.3c-2.9 17.4-19.4 29.2-36.8 26.3s-29.2-19.4-26.3-36.8l9.8-58.7-95.1 0-11.5 69.3c-2.9 17.4-19.4 29.2-36.8 26.3s-29.2-19.4-26.3-36.8L90.2 384 32 384c-17.7 0-32-14.3-32-32s14.3-32 32-32l68.9 0 21.3-128L64 192c-17.7 0-32-14.3-32-32s14.3-32 32-32l68.9 0 11.5-69.3c2.9-17.4 19.4-29.2 36.8-26.3zM187.1 192L165.8 320l95.1 0 21.3-128-95.1 0z\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Call Control Buttons -->\n <div class=\"container_dialpad_buttons\">\n <div class=\"container_dialpad_row\">\n @if (!showCallDisconnected || isCalling) {\n <button class=\"button_dialpad_digit button_call_red\" (click)=\"dropCurrentCall()\">\n <svg width=\"25\" viewBox=\"0 0 640 512\">\n <path 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 </svg>\n </button>\n } @else if (showCallDisconnected && !isCalling) {\n <button class=\"button_dialpad_digit button_call_green\"\n (click)=\"onRedial()\"\n [ngClass]=\"{ 'button_call_disabled': !phoneNumber }\">\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</div>\n</ng-template>\n\n\n <!-- ////////////////// -->\n <!-- Conference Call Template -->\n <ng-template #conferenceCallTemplate>\n<div class=\"container_active_call_header\">\n <div class=\"container_active_call_avatar\">\n <div class=\"container_active_call_avatar_inner\">\n <svg viewBox=\"0 0 212 212\" height=\"45px\" width=\"45px\" version=\"1.1\" x=\"0px\" y=\"0px\"\n enable-background=\"new 0 0 212 212\">\n <path fill=\"#DFE5E7\"\n d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\">\n </path>\n <g>\n <path fill=\"#FFFFFF\"\n d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 c-0.964-1.144-2.024-2.326-3.184-3.527c-1.741-1.802-3.71-3.646-5.924-5.47c-2.952-2.431-6.339-4.824-10.204-7.026 c-1.877-1.07-3.873-2.092-5.98-3.055c-0.062-0.028-0.118-0.059-0.18-0.087c-9.792-4.44-22.106-7.529-37.416-7.529 s-27.624,3.089-37.416,7.529c-0.338,0.153-0.653,0.318-0.985,0.474c-1.431,0.674-2.806,1.376-4.128,2.101 c-0.716,0.393-1.417,0.792-2.101,1.197c-3.421,2.027-6.475,4.191-9.15,6.395c-2.213,1.823-4.182,3.668-5.924,5.47 c-1.161,1.201-2.22,2.384-3.184,3.527c-0.964,1.144-1.832,2.25-2.609,3.299c-0.778,1.049-1.464,2.04-2.065,2.955 c-0.557,0.848-1.033,1.622-1.447,2.324c-0.033,0.056-0.073,0.119-0.104,0.174c-0.435,0.744-0.79,1.392-1.07,1.926 c-0.559,1.068-0.818,1.678-0.818,1.678v0.398c18.285,17.927,43.322,28.985,70.945,28.985c27.678,0,52.761-11.103,71.055-29.095 v-0.289c0,0-0.619-1.45-1.992-3.778C174.594,173.238,174.117,172.463,173.561,171.615z\">\n </path>\n <path fill=\"#FFFFFF\"\n d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 c1.772-0.532,3.482-1.188,5.12-1.958c2.184-1.027,4.242-2.258,6.15-3.67c2.863-2.119,5.39-4.646,7.509-7.509 c0.706-0.954,1.367-1.945,1.98-2.971c0.919-1.539,1.729-3.155,2.422-4.84c0.462-1.123,0.872-2.277,1.226-3.458 c0.177-0.591,0.341-1.188,0.49-1.792c0.299-1.208,0.542-2.443,0.725-3.701c0.275-1.887,0.417-3.827,0.417-5.811 c0-1.984-0.142-3.925-0.417-5.811c-0.184-1.258-0.426-2.493-0.725-3.701c-0.15-0.604-0.313-1.202-0.49-1.793 c-0.354-1.181-0.764-2.335-1.226-3.458c-0.693-1.685-1.504-3.301-2.422-4.84c-0.613-1.026-1.274-2.017-1.98-2.971 c-2.119-2.863-4.646-5.39-7.509-7.509c-1.909-1.412-3.966-2.643-6.15-3.67c-1.638-0.77-3.348-1.426-5.12-1.958 c-1.181-0.355-2.39-0.655-3.624-0.896c-2.468-0.484-5.035-0.737-7.68-0.737c-21.162,0-37.345,16.183-37.345,37.345 C68.657,109.317,84.84,125.5,106.002,125.5z\">\n </path>\n </g>\n </svg>\n </div>\n </div>\n\n <div class=\"container_active_call_info\">\n <div class=\"container_active_call_info_inner\">\n <div class=\"container_active_call_number\">Conference call</div>\n <div class=\"container_active_call_details\">\n <div class=\"container_active_call_details_inner\">\n <div class=\"container_active_call_icon_green\">\n <svg viewBox=\"0 0 512 512\" width=\"12\">\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 </div>\n <div class=\"container_active_call_status_green\">\n with {{ conferenceParticipants?.length }} people\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"container_active_call_options\">\n <div class=\"button_active_call_options button_active_call_options_highlighted\">\n <span (click)=\"isConfereceList = !isConfereceList\" class=\"container_active_call_options_button\">\n <svg viewBox=\"0 0 448 512\" width=\"16px\">\n <path fill=\"currentColor\"\n d=\"M201.4 374.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 306.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z\" />\n </svg>\n </span>\n </div>\n </div>\n</div>\n\n<!-- Conference List -->\n@if (isConfereceList) {\n <div class=\"container_conference_contact_list\">\n <div class=\"container_conference_contact_list_inner\">\n <div class=\"scrollbox container_conference_contact_list_scrollbox\">\n <div class=\"scrollbox-content\">\n\n @for (person of conferenceParticipants; track person.id) {\n <div class=\"container_conference_contact_item\">\n <!-- Avatar -->\n <div class=\"container_contact_item_image\">\n <div class=\"container_contact_item_image_inner\">\n <svg viewBox=\"0 0 212 212\" height=\"49px\" width=\"49px\" version=\"1.1\" x=\"0px\" y=\"0px\"\n enable-background=\"new 0 0 212 212\">\n <path fill=\"#DFE5E7\"\n d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\">\n </path>\n <g>\n <path fill=\"#FFFFFF\"\n d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 c-0.964-1.144-2.024-2.326-3.184-3.527c-1.741-1.802-3.71-3.646-5.924-5.47c-2.952-2.431-6.339-4.824-10.204-7.026 c-1.877-1.07-3.873-2.092-5.98-3.055c-0.062-0.028-0.118-0.059-0.18-0.087c-9.792-4.44-22.106-7.529-37.416-7.529 s-27.624,3.089-37.416,7.529c-0.338,0.153-0.653,0.318-0.985,0.474c-1.431,0.674-2.806,1.376-4.128,2.101 c-0.716,0.393-1.417,0.792-2.101,1.197c-3.421,2.027-6.475,4.191-9.15,6.395c-2.213,1.823-4.182,3.668-5.924,5.47 c-1.161,1.201-2.22,2.384-3.184,3.527c-0.964,1.144-1.832,2.25-2.609,3.299c-0.778,1.049-1.464,2.04-2.065,2.955 c-0.557,0.848-1.033,1.622-1.447,2.324c-0.033,0.056-0.073,0.119-0.104,0.174c-0.435,0.744-0.79,1.392-1.07,1.926 c-0.559,1.068-0.818,1.678-0.818,1.678v0.398c18.285,17.927,43.322,28.985,70.945,28.985c27.678,0,52.761-11.103,71.055-29.095 v-0.289c0,0-0.619-1.45-1.992-3.778C174.594,173.238,174.117,172.463,173.561,171.615z\">\n </path>\n <path fill=\"#FFFFFF\"\n d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 c1.772-0.532,3.482-1.188,5.12-1.958c2.184-1.027,4.242-2.258,6.15-3.67c2.863-2.119,5.39-4.646,7.509-7.509 c0.706-0.954,1.367-1.945,1.98-2.971c0.919-1.539,1.729-3.155,2.422-4.84c0.462-1.123,0.872-2.277,1.226-3.458 c0.177-0.591,0.341-1.188,0.49-1.792c0.299-1.208,0.542-2.443,0.725-3.701c0.275-1.887,0.417-3.827,0.417-5.811 c0-1.984-0.142-3.925-0.417-5.811c-0.184-1.258-0.426-2.493-0.725-3.701c-0.15-0.604-0.313-1.202-0.49-1.793 c-0.354-1.181-0.764-2.335-1.226-3.458c-0.693-1.685-1.504-3.301-2.422-4.84c-0.613-1.026-1.274-2.017-1.98-2.971 c-2.119-2.863-4.646-5.39-7.509-7.509c-1.909-1.412-3.966-2.643-6.15-3.67c-1.638-0.77-3.348-1.426-5.12-1.958 c-1.181-0.355-2.39-0.655-3.624-0.896c-2.468-0.484-5.035-0.737-7.68-0.737c-21.162,0-37.345,16.183-37.345,37.345 C68.657,109.317,84.84,125.5,106.002,125.5z\">\n </path>\n </g>\n </svg>\n </div>\n </div>\n\n <!-- Name and Time -->\n <div class=\"container_contact_item_left\">\n <div class=\"container_contact_item_left_inner\">\n <div class=\"contact_field\">{{ person.name }}</div>\n <div class=\"contact_field_green\">{{ person.duration }}</div>\n </div>\n </div>\n\n <!-- End Button -->\n <div class=\"container_contact_item_right\">\n <div class=\"right_field\">\n <button class=\"button_disconnect_call\">\n <svg width=\"22\" viewBox=\"0 0 640 512\">\n <path 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 </path>\n </svg>\n </button>\n </div>\n </div>\n </div>\n\n @if (!$last) {\n <div class=\"container_separator\"></div>\n }\n }\n\n </div>\n </div>\n </div>\n </div>\n}\n\n</ng-template>\n\n\n <ng-template #callTransferTemplate>\n <div class=\"container_transfer_call\">\n <div class=\"container_transfer_call_inner\">\n <div class=\"container_button_close\">\n <span (click)=\"isCallTransferOpen = false\" title=\"Close\">\n <i class=\"fa-sharp fa-solid fa-xmark\"></i>\n </span>\n </div>\n\n <!-- First Div -->\n <div class=\"container_transfer_call_content\" @slideInOut>\n @if (currentView === 'transferListpage') {\n <div class=\"container_active_call_duration\">{{ formatTime(callDuration)}}</div>\n\n <div class=\"container_active_call_header margin_bottom_16 shadow_st\">\n <div class=\"container_active_call_avatar\">\n <div class=\"container_active_call_avatar_inner\">\n <svg viewBox=\"0 0 212 212\" height=\"45px\" width=\"45px\" version=\"1.1\" x=\"0px\" y=\"0px\"\n enable-background=\"new 0 0 212 212\">\n <path fill=\"#DFE5E7\"\n d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\">\n </path>\n <g>\n <path fill=\"#FFFFFF\"\n d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 c-0.964-1.144-2.024-2.326-3.184-3.527c-1.741-1.802-3.71-3.646-5.924-5.47c-2.952-2.431-6.339-4.824-10.204-7.026 c-1.877-1.07-3.873-2.092-5.98-3.055c-0.062-0.028-0.118-0.059-0.18-0.087c-9.792-4.44-22.106-7.529-37.416-7.529 s-27.624,3.089-37.416,7.529c-0.338,0.153-0.653,0.318-0.985,0.474c-1.431,0.674-2.806,1.376-4.128,2.101 c-0.716,0.393-1.417,0.792-2.101,1.197c-3.421,2.027-6.475,4.191-9.15,6.395c-2.213,1.823-4.182,3.668-5.924,5.47 c-1.161,1.201-2.22,2.384-3.184,3.527c-0.964,1.144-1.832,2.25-2.609,3.299c-0.778,1.049-1.464,2.04-2.065,2.955 c-0.557,0.848-1.033,1.622-1.447,2.324c-0.033,0.056-0.073,0.119-0.104,0.174c-0.435,0.744-0.79,1.392-1.07,1.926 c-0.559,1.068-0.818,1.678-0.818,1.678v0.398c18.285,17.927,43.322,28.985,70.945,28.985c27.678,0,52.761-11.103,71.055-29.095 v-0.289c0,0-0.619-1.45-1.992-3.778C174.594,173.238,174.117,172.463,173.561,171.615z\">\n </path>\n <path fill=\"#FFFFFF\"\n d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 c1.772-0.532,3.482-1.188,5.12-1.958c2.184-1.027,4.242-2.258,6.15-3.67c2.863-2.119,5.39-4.646,7.509-7.509 c0.706-0.954,1.367-1.945,1.98-2.971c0.919-1.539,1.729-3.155,2.422-4.84c0.462-1.123,0.872-2.277,1.226-3.458 c0.177-0.591,0.341-1.188,0.49-1.792c0.299-1.208,0.542-2.443,0.725-3.701c0.275-1.887,0.417-3.827,0.417-5.811 c0-1.984-0.142-3.925-0.417-5.811c-0.184-1.258-0.426-2.493-0.725-3.701c-0.15-0.604-0.313-1.202-0.49-1.793 c-0.354-1.181-0.764-2.335-1.226-3.458c-0.693-1.685-1.504-3.301-2.422-4.84c-0.613-1.026-1.274-2.017-1.98-2.971 c-2.119-2.863-4.646-5.39-7.509-7.509c-1.909-1.412-3.966-2.643-6.15-3.67c-1.638-0.77-3.348-1.426-5.12-1.958 c-1.181-0.355-2.39-0.655-3.624-0.896c-2.468-0.484-5.035-0.737-7.68-0.737c-21.162,0-37.345,16.183-37.345,37.345 C68.657,109.317,84.84,125.5,106.002,125.5z\">\n </path>\n </g>\n </svg>\n </div>\n </div>\n <div class=\"container_active_call_info\">\n <div class=\"container_active_call_info_inner\">\n <div class=\"container_active_call_number\">{{ lookupPhoneNumber?.country?.flag }}\n {{ lookupPhoneNumber?.phoneNumber }}</div>\n <div class=\"container_active_call_details\">\n <div class=\"container_active_call_details_inner\">\n <div class=\"container_active_call_icon_green\">\n <svg viewBox=\"0 0 512 512\" width=\"12\">\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 </div>\n <div class=\"container_active_call_status_green\">Active call</div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"container_contact_item_right\">\n <div class=\"right_field right_field_highlighted\">\n <span class=\"right_field_content\">Ext. {{extensionNumber}}</span>\n </div>\n </div>\n </div>\n\n <!-- Tabs -->\n <div class=\"container_transfer_tab_buttons\">\n <button class=\"button_transfer_tab\" (click)=\"selectTab('tab1')\" [class.active]=\"activeTab === 'tab1'\">\n <svg width=\"18px\" viewBox=\"0 0 512 512\">\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> Recent</button>\n <button class=\"button_transfer_tab\" (click)=\"selectTab('tab2')\" [class.active]=\"activeTab === 'tab2'\">\n <svg width=\"20px\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\"\n d=\"M15.71,12.71a6,6,0,1,0-7.42,0,10,10,0,0,0-6.22,8.18,1,1,0,0,0,2,.22,8,8,0,0,1,15.9,0,1,1,0,0,0,1,.89h.11a1,1,0,0,0,.88-1.1A10,10,0,0,0,15.71,12.71ZM12,12a4,4,0,1,1,4-4A4,4,0,0,1,12,12Z\" />\n </svg> Internal</button>\n <button class=\"button_transfer_tab\" (click)=\"selectTab('tab3')\" [class.active]=\"activeTab === 'tab3'\">\n <svg width=\"18px\" height=\"18px\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M256,400a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M256,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M256,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M256,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M384,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M384,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M384,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M128,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M128,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M128,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" /></svg>\n Dail</button>\n </div>\n\n <!-- Tab 1 -->\n @if (activeTab === 'tab1') {\n <!-- <div class=\"container_transfer_tab_content\">\n <app-call-history (makeCallEv)=\"makeCallFromContact($event)\"></app-call-history>\n </div> -->\n <div class=\"container_transfer_tab_content\">\n <app-call-history [mode]=\"'transfer'\" (transferEv)=\"transferToFromHistory($event)\"> </app-call-history>\n</div>\n }\n\n <!-- Tab 2 -->\n @if (activeTab === 'tab2') {\n <div class=\"container_transfer_tab_content\">\n <div class=\"container_transfer_internal_search\">\n <input type=\"search\" placeholder=\"Type to search\">\n </div>\n <div class=\"container_transfer_contact_list\">\n <div class=\"container_transfer_contact_list_inner\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n <!-- Instead of repeating static contacts, render via array -->\n @for (contact of internalContacts; track contact.ext) {\n <div class=\"container_contact_item\" (click)=\"goToDiv('transferDetails'); makeCallFromContact(contact.phone)\">\n <div class=\"container_contact_item_image\">\n <div class=\"container_contact_item_image_inner\">\n <svg viewBox=\"0 0 212 212\" height=\"49px\" width=\"49px\" version=\"1.1\" x=\"0px\" y=\"0px\"\n enable-background=\"new 0 0 212 212\">\n <path fill=\"#DFE5E7\"\n d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\">\n </path>\n <g>\n <path fill=\"#FFFFFF\"\n d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 c-0.964-1.144-2.024-2.326-3.184-3.527c-1.741-1.802-3.71-3.646-5.924-5.47c-2.952-2.431-6.339-4.824-10.204-7.026 c-1.877-1.07-3.873-2.092-5.98-3.055c-0.062-0.028-0.118-0.059-0.18-0.087c-9.792-4.44-22.106-7.529-37.416-7.529 s-27.624,3.089-37.416,7.529c-0.338,0.153-0.653,0.318-0.985,0.474c-1.431,0.674-2.806,1.376-4.128,2.101 c-0.716,0.393-1.417,0.792-2.101,1.197c-3.421,2.027-6.475,4.191-9.15,6.395c-2.213,1.823-4.182,3.668-5.924,5.47 c-1.161,1.201-2.22,2.384-3.184,3.527c-0.964,1.144-1.832,2.25-2.609,3.299c-0.778,1.049-1.464,2.04-2.065,2.955 c-0.557,0.848-1.033,1.622-1.447,2.324c-0.033,0.056-0.073,0.119-0.104,0.174c-0.435,0.744-0.79,1.392-1.07,1.926 c-0.559,1.068-0.818,1.678-0.818,1.678v0.398c18.285,17.927,43.322,28.985,70.945,28.985c27.678,0,52.761-11.103,71.055-29.095 v-0.289c0,0-0.619-1.45-1.992-3.778C174.594,173.238,174.117,172.463,173.561,171.615z\">\n </path>\n <path fill=\"#FFFFFF\"\n d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 c1.772-0.532,3.482-1.188,5.12-1.958c2.184-1.027,4.242-2.258,6.15-3.67c2.863-2.119,5.39-4.646,7.509-7.509 c0.706-0.954,1.367-1.945,1.98-2.971c0.919-1.539,1.729-3.155,2.422-4.84c0.462-1.123,0.872-2.277,1.226-3.458 c0.177-0.591,0.341-1.188,0.49-1.792c0.299-1.208,0.542-2.443,0.725-3.701c0.275-1.887,0.417-3.827,0.417-5.811 c0-1.984-0.142-3.925-0.417-5.811c-0.184-1.258-0.426-2.493-0.725-3.701c-0.15-0.604-0.313-1.202-0.49-1.793 c-0.354-1.181-0.764-2.335-1.226-3.458c-0.693-1.685-1.504-3.301-2.422-4.84c-0.613-1.026-1.274-2.017-1.98-2.971 c-2.119-2.863-4.646-5.39-7.509-7.509c-1.909-1.412-3.966-2.643-6.15-3.67c-1.638-0.77-3.348-1.426-5.12-1.958 c-1.181-0.355-2.39-0.655-3.624-0.896c-2.468-0.484-5.035-0.737-7.68-0.737c-21.162,0-37.345,16.183-37.345,37.345 C68.657,109.317,84.84,125.5,106.002,125.5z\">\n </path>\n </g>\n </svg>\n </div>\n </div>\n <div class=\"container_contact_item_left\">\n <div class=\"container_contact_item_left_inner\">\n <div class=\"contact_field\">{{ contact.name }}</div>\n <div class=\"contact_field\">{{ contact.phone }}</div>\n @if (contact.role) {\n <div class=\"contact_field_grey\">\n <div class=\"contact_field_highlighted\"><span>{{ contact.role }}</span></div>\n </div>\n }\n </div>\n </div>\n <div class=\"container_contact_item_right\">\n <div class=\"right_field\">\n <span class=\"right_field_content\">Ext. {{ contact.ext }}</span>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Tab 3 -->\n @if (activeTab === 'tab3') {\n <div class=\"container_transfer_tab_content\">\n <form [formGroup]=\"transferForm\">\n <div class=\"container_transfer_contact_list\">\n <div class=\"container_phone_number_input margin_bottom_16\">\n <button class=\"button_phonebook\" (click)=\"isDirectoryOpen = !isDirectoryOpen\">\uD83D\uDCD6</button>\n <input placeholder=\"Phone Number\" type=\"tel\" formControlName=\"target\">\n <button class=\"button_backspace\" (click)=\"onBackspace()\"></button>\n </div>\n\n @if (isDirectoryOpen) {\n <div class=\"container_transfer_internal_contact_list\">\n <div class=\"container_transfer_contact_list_inner\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n @for (directoryContact of directoryContacts; track directoryContact.id) {\n <div class=\"container_contact_item\">\n <div class=\"container_contact_item_left\">\n <div class=\"container_contact_item_left_inner\">\n <div class=\"contact_field\">{{ directoryContact.name }}</div>\n <div class=\"contact_field\">{{ directoryContact.phone }}</div>\n </div>\n </div>\n <div class=\"container_contact_item_right\">\n <div class=\"right_field right_field_highlighted\">\n <span class=\"right_field_content\">\n <div class=\"container_rating\">\n @for (star of [1,2,3,4,5]; track $index) {\n <span [class.filled]=\"star <= directoryContact.rating\">\u2605</span>\n }\n </div>\n </span>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Dialpad -->\n <div class=\"container_dialpad_digits\">\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('1')\">1</button>\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('2')\">2</button>\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('3')\">3</button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('4')\">4</button>\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('5')\">5</button>\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('6')\">6</button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('7')\">7</button>\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('8')\">8</button>\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('9')\">9</button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('*')\">\n <svg viewBox=\"0 0 512 512\" height=\"17px\">\n <path fill=\"currentColor\" d=\"M208 32c0-17.7 14.3-32 32-32l32 0c17.7 0 32 14.3 32 32l0 140.9\n 122-70.4c15.3-8.8 34.9-3.6 43.7 11.7l16 27.7c8.8 15.3 3.6 34.9-11.7\n 43.7L352 256l122 70.4c15.3 8.8 20.6 28.4 11.7 43.7l-16 27.7c-8.8\n 15.3-28.4 20.6-43.7 11.7L304 339.1 304 480c0 17.7-14.3 32-32 32l-32\n 0c-17.7 0-32-14.3-32-32l0-140.9L86 409.6c-15.3 8.8-34.9\n 3.6-43.7-11.7l-16-27.7c-8.8-15.3-3.6-34.9 11.7-43.7L160 256 38\n 185.6c-15.3-8.8-20.5-28.4-11.7-43.7l16-27.7C51.1 98.8 70.7 93.6 86\n 102.4l122 70.4L208 32z\" />\n </svg>\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('0')\">0</button>\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('#')\">\n <svg height=\"19px\" viewBox=\"0 0 448 512\">\n <path fill=\"currentColor\" d=\"M181.3 32.4c17.4 2.9 29.2 19.4 26.3\n36.8L197.8 128l95.1 0 11.5-69.3c2.9-17.4 19.4-29.2 36.8-26.3s29.2 19.4\n26.3 36.8L357.8 128l58.2 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-68.9\n0L325.8 320l58.2 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-68.9 0-11.5\n69.3c-2.9 17.4-19.4 29.2-36.8 26.3s-29.2-19.4-26.3-36.8l9.8-58.7-95.1\n0-11.5 69.3c-2.9 17.4-19.4 29.2-36.8 26.3s-29.2-19.4-26.3-36.8L90.2\n384 32 384c-17.7 0-32-14.3-32-32s14.3-32 32-32l68.9 0 21.3-128L64\n192c-17.7 0-32-14.3-32-32s14.3-32 32-32l68.9 0 11.5-69.3c2.9-17.4\n19.4-29.2 36.8-26.3zM187.1 192L165.8 320l95.1 0 21.3-128-95.1 0z\" />\n </svg></button>\n </div>\n </div>\n\n <div class=\"container_dialpad_buttons\">\n <div class=\"container_dialpad_row\">\n @if (isAddingNewCall) {\n <button class=\"button_dialpad_digit button_call_green\"\n (click)=\"makeCall(transferForm.value.target)\"\n [disabled]=\"!phoneNumber\"\n [ngClass]=\"{ 'button_call_disabled': !phoneNumber }\">\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 type=\"submit\" class=\"button_dialpad_digit button_call_green\" (click)=\"onTransferCall()\"> <svg height=\"20px\" viewBox=\"0 0 52 52\" enable-background=\"new 0 0 52 52\" xml:space=\"preserve\">\n <g>\n <path fill=\"currentColor\" d=\"M48.5,37.9L42.4,33c-1.4-1.1-3.4-1.2-4.8-0.1l-5.2,3.8c-0.6,0.5-1.5,0.4-2.1-0.2l-7.8-7l-7-7.8\n c-0.6-0.6-0.6-1.4-0.2-2.1l3.8-5.2c1.1-1.4,1-3.4-0.1-4.8l-4.9-6.1c-1.5-1.8-4.2-2-5.9-0.3L3,8.4c-0.8,0.8-1.2,1.9-1.2,3\n c0.5,10.2,5.1,19.9,11.9,26.7S30.2,49.5,40.4,50c1.1,0.1,2.2-0.4,3-1.2l5.2-5.2C50.5,42.1,50.4,39.3,48.5,37.9z\" />\n <path fill=\"currentColor\" d=\"M48.4,2H33c-1,0-1.3,1.1-0.5,1.9l4.9,5l-9,9.1c-0.5,0.5-0.5,1.4,0,1.9l3.7,3.7c0.5,0.5,1.3,0.5,1.9,0\n l9.1-9.1l5.1,4.9C48.9,20.3,50,20,50,19V3.7C50,3,49.1,2,48.4,2z\" />\n </g>\n </svg></button>\n }\n </div>\n </div>\n </div>\n </form>\n </div>\n }\n }\n</div>\n\n <!-- Second Div -->\n @if (currentView === 'transferDetails') {\n <div class=\"container_transfer_call_content\" @slideInOut>\n <div class=\"container_active_call_duration\">00:10</div>\n <div class=\"container_active_call_header shadow_st\">\n <div class=\"container_active_call_avatar\">\n <div class=\"container_active_call_avatar_inner\">\n <svg viewBox=\"0 0 212 212\" height=\"45px\" width=\"45px\" version=\"1.1\" x=\"0px\" y=\"0px\"\n enable-background=\"new 0 0 212 212\">\n <path fill=\"#DFE5E7\"\n d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\"></path>\n <g>\n <path fill=\"#FFFFFF\"\n d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 ...\"></path>\n <path fill=\"#FFFFFF\"\n d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 ...\"></path>\n </g>\n </svg>\n </div>\n </div>\n\n <div class=\"container_active_call_info\">\n <div class=\"container_active_call_info_inner\">\n <div class=\"container_active_call_number\">\n {{ lookupPhoneNumber?.country?.flag }} {{ lookupPhoneNumber?.phoneNumber }}\n </div>\n <div class=\"container_active_call_details\">\n <div class=\"container_active_call_details_inner\">\n <div class=\"container_active_call_icon_grey\">\n <svg viewBox=\"0 0 320 512\" width=\"12\">\n <path fill=\"currentColor\"\n d=\"M128 64L0 64 0 448l128 0 0-384zm192 0L192 64l0 384 128 0 0-384z\"></path>\n </svg>\n </div>\n <div class=\"container_active_call_status_grey\">On hold</div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"container_contact_item_right\">\n <div class=\"right_field right_field_highlighted\">\n <span class=\"right_field_content\">Ext. {{ extensionNumber }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"container_transfer_call_details\">\n <div class=\"container_call_ani_number padding_top_nt\">+91 (654) 9876549</div>\n <div class=\"container_call_ani_name\">Rajeev kumar singh</div>\n <div class=\"container_call_ani_image\">\n <div class=\"container_call_ani_image_inner\">\n <svg viewBox=\"0 0 212 212\" height=\"85\" width=\"85\" version=\"1.1\" x=\"0px\" y=\"0px\"\n enable-background=\"new 0 0 212 212\">\n <path fill=\"#DFE5E7\"\n d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\"></path>\n <g>\n <path fill=\"#FFFFFF\"\n d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 ...\"></path>\n <path fill=\"#FFFFFF\"\n d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 ...\"></path>\n </g>\n </svg>\n </div>\n </div>\n </div>\n\n <div class=\"container_call_dnis\">\n <span>Ext. {{ extensionNumber }}</span>\n </div>\n\n <div class=\"container_call_options margin_bottom_nt\">\n <div class=\"container_dialpad_row margin_bottom_16\">\n <button class=\"button_call_option\" (click)=\"mergeCall()\">\n <div class=\"button_icon\"><svg width=\"22\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\"\n d=\"M32 64C14.3 64 0 78.3 0 96s14.3 32 32 32l97.2 0c9.7 0 18.9 4.4 25 12L247 256 154.2 372c-6.1 7.6-15.3 12-25 12L32 384c-17.7 0-32 14.3-32 32s14.3 32 32 32l97.2 0c29.2 0 56.7-13.3 75-36l99.2-124 80.6 0 0 32c0 12.9 7.8 24.6 19.8 29.6s25.7 2.2 34.9-6.9l64-64c6-6 9.4-14.1 9.4-22.6s-3.4-16.6-9.4-22.6l-64-64c-9.2-9.2-22.9-11.9-34.9-6.9s-19.8 16.6-19.8 29.6l0 32-80.6 0L204.2 100c-18.2-22.8-45.8-36-75-36L32 64z\"></path>\n </svg></div>\n <div class=\"button_text\">Merge</div>\n </button>\n\n <button class=\"button_call_option\">\n <div class=\"button_icon\"> <svg width=\"26px\" viewBox=\"0 0 640 512\">\n <path fill=\"currentColor\"\n d=\"M150.6 73.4c-12.5-12.5-32.8-12.5-45.3 0l-96 96c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L96 173.3 96 320c0 53 43 96 96 96l112 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-112 0c-17.7 0-32-14.3-32-32l0-146.7 41.4 41.4c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3l-96-96zM336 96c-17.7 0-32 14.3-32 32s14.3 32 32 32l112 0c17.7 0 32-14.3 32-32l0 146.7-41.4-41.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l96 96c12.5 12.5 32.8 12.5 45.3 0l96-96c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L544 338.7 544 192c0-53-43-96-96-96L336 96z\"></path>\n </svg></div>\n <div class=\"button_text\">Swap</div>\n </button>\n\n <button class=\"button_call_option\">\n <div class=\"button_icon\"><svg width=\"19px\" viewBox=\"0 0 52 52\">\n <path fill=\"currentColor\"\n d=\"M48.5,37.9L42.4,33c-1.4-1.1-3.4-1.2-4.8-0.1l-5.2,3.8c-0.6,0.5-1.5,0.4-2.1-0.2l-7.8-7l-7-7.8 c-0.6-0.6-0.6-1.4-0.2-2.1l3.8-5.2c1.1-1.4,1-3.4-0.1-4.8l-4.9-6.1c-1.5-1.8-4.2-2-5.9-0.3L3,8.4c-0.8,0.8-1.2,1.9-1.2,3 c0.5,10.2,5.1,19.9,11.9,26.7S30.2,49.5,40.4,50c1.1,0.1,2.2-0.4,3-1.2l5.2-5.2C50.5,42.1,50.4,39.3,48.5,37.9z\"></path>\n <path fill=\"currentColor\"\n d=\"M48.4,2H33c-1,0-1.3,1.1-0.5,1.9l4.9,5l-9,9.1c-0.5,0.5-0.5,1.4,0,1.9l3.7,3.7c0.5,0.5,1.3,0.5,1.9,0 l9.1-9.1l5.1,4.9C48.9,20.3,50,20,50,19V3.7C50,3,49.1,2,48.4,2z\"></path>\n </svg>\n</div>\n <div class=\"button_text\">Transfer</div>\n </button>\n </div>\n </div>\n\n <div class=\"container_transfer_disconnect\">\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit button_call_red\" (click)=\"goToDiv('transferListpage')\">\n <svg width=\"36px\" viewBox=\"0 0 76 76\">\n <path fill=\"currentColor\"\n d=\"M 16.2013,39.582L 15.4175,39.4096L 14.8094,38.9315L 14.4029,38.2193L 14.25,37.364L 14.25,34.9055C 14.25,33.184 14.6023,31.6057 15.3069,30.1704C 16.0116,28.7352 16.9698,27.4788 18.1818,26.4013C 19.3937,25.3237 20.8095,24.4424 22.429,23.7573C 24.0486,23.0722 25.7732,22.6277 27.6031,22.4239L 31.304,22.0792L 34.9918,21.8256L 39.109,21.715L 42.966,21.8451L 46.101,22.0987L 48.9628,22.489C 50.7276,22.7318 52.3883,23.199 53.945,23.8906C 55.5017,24.5822 56.8567,25.4625 58.0101,26.5313C 59.1635,27.6002 60.0752,28.8468 60.7451,30.2712C 61.4151,31.6956 61.75,33.2599 61.75,34.964L 61.75,37.4486L 61.5874,38.2681L 61.1386,38.9511L 60.4785,39.4096L 59.6752,39.582L 51.8897,39.582L 51.0994,39.4096L 50.4588,38.9413L 50.0327,38.2584L 49.8799,37.4226L 49.8799,32.1217L 49.7075,31.1656L 49.2295,30.3818L 48.5075,29.8452C 48.23,29.7108 47.9286,29.6436 47.6034,29.6436L 28.7413,29.6436C 28.4161,29.6436 28.0974,29.7108 27.7852,29.8452L 26.9722,30.3818L 26.4128,31.1851C 26.2697,31.4973 26.1982,31.8225 26.1982,32.1607L 26.1982,37.364L 26.0356,38.2193L 25.5803,38.9315L 24.9104,39.4096L 24.1038,39.582L 16.2013,39.582 Z M 34.8333,41.1667L 41.1666,41.1667L 41.1667,52.6458L 45.9167,47.8958L 45.9167,54.2292L 38,62.5417L 30.0833,54.2292L 30.0833,47.8958L 34.8333,52.6458L 34.8333,41.1667 Z \" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n}\n\n\n\n\n\n\n\n\n\n\n\n </div>\n </div>\n </ng-template>\n\n \n\n\n</ng-template>\n\n<div id=\"videoPanel\" style=\"display: none\">\n <audio #rmtAudio id=\"rmtAudio\" autoplay></audio>\n <audio #lclAudio id=\"lclAudio\" autoplay muted></audio>\n <video #rmtVideo id=\"rmtVideo\" autoplay></video>\n <video #lclVideo id=\"lclVideo\" autoplay muted controls title=\"Local Video\"></video>\n</div>\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Open+Sans:300,400,500,600,700,800\";@import\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css\";:host{--sd-app-color: #ff6633;--sd-app-color-dark: #ff5805;--sd-app-color-light: #fe8c66;--sd-text-font-family: \"Open Sans\", \"sans-serif\", \"Helvetica Neue\", \"Helvetica\", \"Arial\";--sd-text-color: #666;--sd-text-color-inverse: #fff;--sd-text-color-light: #ccc;--sd-text-color-medium: #999;--sd-text-color-dark: #333;--sd-background-color: #fff;--sd-border-color-light: #e3e3e3;--sd-border-color-dark: #c9c9c9}.message_label{width:100%;font-size:13px;font-family:var(--sd-text-font-family);letter-spacing:-.25px;border-radius:4px;font-weight:600;border:1px solid #f5c6cb;padding:8px 11px;position:relative}.error_message{color:#e1143c;background-color:#f8d7da;border-color:#dfadb2}.success_message{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert_message{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.properties_form_field{width:100%;font-size:13px!important;font-family:var(--sd-text-font-family)!important;font-weight:600!important;letter-spacing:-.24px!important;color:#555!important}.container_avaya_login{width:100%;height:calc(100vh - 51px);padding:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.container_avaya_login_inner{margin:0 auto;width:100%;max-width:370px;padding:65px 20px 20px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:flex}.container_connection_status_overlay{width:100%;height:100%;position:absolute;left:0;right:0;bottom:0;background-color:#6669;display:flex;justify-content:center;z-index:9999999;padding:20px}.container_connection_status{width:100%;background:var(--sd-background-color);padding:0 10px;border-radius:8px;font-family:var(--sd-text-font-family);font-size:13px;font-weight:600;color:var(--sd-text-color);display:flex;height:42px;align-items:center;position:relative;box-shadow:#32325d40 0 6px 12px -2px,#0000004d 0 3px 7px -3px}.container_connection_status span{padding:0 0 0 8px}.container_connection_status .fa-circle-dot{color:#f66060}.container_connection_status_loader{position:absolute;right:15px}.container_avaya_login_content{position:relative;width:100%}.container_avaya_logo{margin:0;padding:0 26px 24px;width:100%;text-align:center}.container_avaya_logo_image{margin:0 auto;width:120px;height:35px;background:var(--sd-background-color) url(data:image/png;base64,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) center no-repeat;background-size:120px}.container_avaya_logo h3{margin:0;padding:6px 0 0;font-family:var(--sd-text-font-family);font-size:18px;font-weight:700;letter-spacing:-.45px;color:var(--sd-text-color-dark);position:relative}.container_avaya_logo h3 span{font-size:8px;position:absolute;top:8px}.container_avaya_login_error{width:100%;white-space:normal}.container_avaya_login_form{width:100%;margin:0;padding:26px 0 0;position:relative}.container_avaya_login_form form{width:100%;margin:0;padding:0}.container_avaya_login_form .form_field{margin:0;padding:0;width:100%}.avaya_login_button_area{padding:10px 0 0}.container_icon_eye{position:absolute;right:15px}.container_avaya_login_form .button_submit_login{font:14px / 48px var(--sd-text-font-family);display:inline-block;height:48px;background:#cd1f1e;color:var(--sd-text-color-inverse);border:1px solid #cd1f1e;font-weight:600;padding:0 12px;border-radius:4px;outline:none;letter-spacing:-.24px;cursor:pointer;width:100%;position:relative}.container_avaya_login_form .button_submit_login_loader{background:#cd1f1e!important;color:var(--sd-text-color-inverse)!important;border:1px solid #cd1f1e!important;cursor:auto}.container_avaya_login_form .button_submit_login:disabled{background:#f1f1f1;color:var(--sd-text-color-medium);border:1px solid #f1f1f1}.button_submit_loader:after{content:\"\";position:absolute;width:16px;height:16px;inset:0;margin:auto;border:3px solid transparent;border-top-color:#fff;border-radius:50%;animation:button_submit_loader_spinner 1s ease infinite}@keyframes button_submit_loader_spinner{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.container_avaya_softphone{width:100%;height:100%;position:relative}.container_avaya_softphone_inner{width:100%;position:absolute;top:0;left:0;right:0;padding:0;height:calc(100% - 51px);font-family:var(--sd-text-font-family);font-size:13px;font-weight:600;color:var(--sd-text-color);line-height:normal;background:var(--sd-background-color);-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:#000}.container_call{margin:0 auto;padding:0;position:relative;width:100%;height:100%;background:var(--sd-background-color)}.container_dialpad_header{width:100%;position:relative;font-family:var(--sd-text-font-family);font-size:13px;font-weight:600;color:var(--sd-text-color);z-index:99999;background:var(--sd-background-color);padding:15px 15px 0}.container_dialpad_header_inner2{width:100%;margin:0;padding:15px 15px 0;background:#f7f7f7;background:linear-gradient(180deg,#f7f7f7 72%,#fff);border-radius:12px 12px 0 0;position:relative}.container_avaya_extension{width:100%;position:relative;display:flex;flex-direction:row;align-items:center;padding:8px 10px;border:1px solid var(--sd-border-color-light);border-radius:12px;margin-bottom:15px;background:#f0f0f0}.container_avaya_extension_left{display:flex;flex-basis:auto;flex-direction:column;flex-grow:1;justify-content:center}.container_avaya_extension_left .extension_label{display:flex;align-items:center;line-height:normal;text-align:left}.container_avaya_extension_left .extension_number{display:flex;align-items:center;line-height:20px}.container_avaya_extension_right{flex-basis:auto;flex-direction:column;flex-grow:1;text-align:right;justify-items:flex-end}.container_avaya_extension_right button{background:none;border:none;outline:none;color:#a6a6a6;font-weight:600;border-radius:50%;align-items:center;justify-content:center;-webkit-transition-duration:.3s;transition-duration:.3s;background:#f0f0f0;height:38px;width:38px}.container_avaya_extension_right button:hover{color:var(--sd-text-color-dark);background:var(--sd-border-color-light)}.dialpad_container_sd{position:absolute;width:100%;right:0;left:0;top:101px;height:calc(100vh - 101px);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}.scrollbox{height:100%;overflow-y:scroll;overflow-x:hidden;visibility:hidden;padding:0 0 7px;position:relative;scroll-behavior:smooth;scrollbar-width:thin;width:100%}.scrollbox-content,.scrollbox:hover,.scrollbox:focus{visibility:visible}.container_contact_item{width:100%;position:relative;display:flex;flex-direction:row;align-items:center;padding:10px;border:1px solid var(--sd-border-color-light);border-radius:8px;overflow:hidden;margin-bottom:10px;cursor:pointer}.container_contact_item_image{display:flex}.container_contact_item_image_inner{margin:0 auto;padding:0;width:50px;height:50px;position:relative}.container_contact_item_left{display:flex;flex-basis:auto;flex-direction:column;flex-grow:1}.container_contact_item_left_inner{display:flex;flex-basis:1;flex-direction:column;padding:0 0 0 10px}.container_contact_item_left .contact_field{font-size:13px;margin-bottom:2px}.contact_dark{color:var(--sd-text-color-dark)}.contact_gray{color:var(--sd-text-color-medium)}.container_contact_item_left .contact_field_grey{font-size:12px;color:var(--sd-text-color);padding-top:2px;display:flex}.container_contact_item_left .contact_field_green{font-size:13px;margin-bottom:2px;color:#6c0}.container_contact_item_left .contact_field_highlighted{display:flex;font-size:11px;color:var(--sd-text-color-medium)}.container_contact_item_left .contact_field_highlighted span{background:#6c0;border-radius:3px;text-transform:uppercase;color:var(--sd-text-color-inverse);font-size:9px;padding:2px 4px}.container_contact_item_right{display:flex;flex-direction:row}.container_contact_item_right .right_field{display:flex;flex-basis:auto;justify-content:right}.container_contact_item_right .right_field_highlighted{font-size:16px;color:#29abe0}.container_contact_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)}.container_contact_item_right .right_recent_content{display:inline-block;padding:0;font-size:11px;color:var(--sd-text-color)}.container_contact_item_right .container_rating{font-size:11px;cursor:pointer}.container_contact_item_right .container_rating span{color:gray;transition:color .3s}.container_contact_item_right .container_rating span.filled{color:gold}.container_dialpad_digits{width:100%;display:flex;justify-content:center;margin-bottom:10px;flex-direction:column}.container_dialpad_row{display:flex;column-gap:10px;flex-direction:row;flex-shrink:0;justify-content:center;margin-bottom:10px}.button_dialpad_digit{display:block;width:50px;height:50px;display:flex;column-gap:20px;margin:0 10px;align-items:center;justify-content:center;line-height:normal;border-radius:50%;outline:none;border:none;font-size:22px;font-weight:700;color:var(--sd-text-color-dark);background:var(--sd-background-color);-webkit-transition-duration:.3s;transition-duration:.3s;box-shadow:#0000001a 0 0 5px,#0000001a 0 0 1px;border:1px solid #ebebeb}.button_dialpad_digit:hover{background:#000;color:var(--sd-text-color-inverse)}.button_call_green{background:#6c0;color:var(--sd-text-color-inverse);width:60px;height:60px;-webkit-transition-duration:.3s;transition-duration:.3s}.button_call_green:hover{background:#5ab400;color:var(--sd-text-color-inverse);width:60px;height:60px}.button_call_red{background:#e0261f;color:var(--sd-text-color-inverse);width:60px;height:60px;-webkit-transition-duration:.3s;transition-duration:.3s;z-index:9999}.button_call_red:hover{background:#cf211a}.button_call_disabled{background:#eee;color:var(--sd-text-color-light);width:60px;height:60px;-webkit-transition-duration:.3s;transition-duration:.3s}.container_dialpad_buttons{width:100%;display:flex;justify-content:center;padding-top:0;margin-bottom:6px}.container_call_header{width:100%;position:absolute;top:0;left:0;right:0;height:221px;font-family:var(--sd-text-font-family);font-size:13px;font-weight:600;color:var(--sd-text-color);z-index:99;background:var(--sd-background-color)}.container_call_header_inner{width:100%;margin:0;padding:10px 15px 15px;position:relative}.container_call_info{display:flex;justify-content:center;font-size:14px;font-weight:600;width:100%;color:var(--sd-text-color)}.container_call_info_blinker{display:flex;justify-content:center;font-size:14px;font-weight:600;width:100%;color:red;animation:blinker 1s linear infinite}@keyframes blinker{26%{opacity:0}}.container_call_ani{width:100%;margin:0;padding:0}.container_call_ani_number{text-align:center;font-size:20px;font-weight:600;padding-top:26px}.container_call_ani_name{text-align:center;font-size:13px;font-weight:600;padding-top:2px}.container_call_ani_image{margin:0;padding:24px 0 0;width:100%}.container_call_ani_image_inner{display:flex;align-items:center;flex:0 0 auto;padding:0;width:85px;height:85px;position:relative;margin:0 auto;border-radius:100%}.container_call_content{width:100%;position:absolute;top:221px;left:0;right:0;height:calc(100% - 221px);font-family:var(--sd-text-font-family);font-size:13px;font-weight:600;color:var(--sd-text-color);padding-top:20px;display:flex;flex-basis:auto;flex-direction:column;align-items:center;justify-content:center}.container_call_dnis{width:100%;text-align:center;padding-bottom:16px}.container_call_dnis span{display:inline-block;border-radius:26px;border:1px solid #e5e5e5;padding:5px 16px}.container_call_options{width:100%;display:flex;justify-content:center;margin-bottom:16px;flex-direction:column}.button_call_option{display:block;width:80px;height:60px;display:flex;flex-direction:column;flex-shrink:0;column-gap:0px;margin:0 10px;align-items:center;justify-content:center;line-height:normal;outline:none;border:none;font-size:12px;font-weight:600;color:var(--sd-text-color-dark);background:none;-webkit-transition-duration:.3s;transition-duration:.3s;position:relative}.button_call_option .button_icon{display:flex;justify-content:center;align-items:center;height:40px}.button_call_option .button_text{display:flex;justify-content:center;color:var(--sd-text-color)}.button_active{color:#67cc02}.button_elevated{position:relative;z-index:9999}.button_disabled{color:gray;cursor:not-allowed;pointer-events:none;opacity:.6}.button_call_option[disabled],.button_disabled{opacity:.5;pointer-events:none;display:inline-flex}.container_popup_dialpad{position:absolute;z-index:999;left:0;right:0;bottom:0}.container_popup_dialpad_inner{background:#f1f1f1;background:linear-gradient(180deg,#f1f1f1 44%,#fff);margin:0 auto;padding:10px 15px 20px;border-radius:8px;width:88%;position:relative;height:475px}.container_popup_dialpad .button_close{position:absolute;right:-15px;top:-17px;z-index:9}.container_popup_dialpad .button_close span{width:32px;height:32px;background:var(--sd-background-color);display:flex;align-items:center;justify-content:center;border-radius:50%;cursor:pointer;box-shadow:#0000001a 0 0 5px,#0000001a 0 0 1px;border:1px solid #ebebeb}.container_popup_dialpad .button_close span:hover{background:#f1f1f1;color:var(--sd-text-color-dark)}.container_popup_dialpad .button_close span .fa-xmark{font-size:1.4em;font-weight:400}.container_dtmf_input{width:100%;margin:0;padding:0 0 10px;position:relative}.container_dtmf_input input{width:100%;display:flex;height:38px;outline:none;text-align:center;align-items:center;border:1px solid #f1f1f1;font-size:26px;font-weight:400;color:transparent;text-shadow:0 0 0 #000;padding:0;background:#f1f1f1}.container_active_call_header{width:100%;position:relative;display:flex;flex-direction:row;align-items:center;padding:10px;border:1px solid var(--sd-border-color-light);border-radius:12px;overflow:hidden}.container_active_call_avatar{display:flex}@keyframes play1{0%{transform:scale(1)}15%{box-shadow:0 0 0 2px #57b84666}25%{box-shadow:0 0 0 3px #98d48266,0 0 0 20px #fff3}25%{box-shadow:0 0 0 5px #bde4a966,0 0 0 30px #fff3}}.container_active_call_avatar_inner{margin:0 auto;padding:0;width:50px;height:50px;background:#dfe6e8;color:var(--sd-text-color-dark);position:relative;animation:play1 2s ease infinite;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;border-radius:100%;overflow:hidden;display:flex;justify-content:center;align-items:center}.container_active_call_info{display:flex;flex-basis:auto;flex-direction:column;flex-grow:1}.container_active_call_info_inner{display:flex;flex-basis:1;flex-direction:column;padding:0 0 0 10px}.container_active_call_duration{display:flex;justify-content:center;font-size:14px;font-weight:600;width:100%;color:var(--sd-text-color);margin-bottom:10px}.container_active_call_number{font-size:13px;margin-bottom:2px}.container_active_call_details{font-size:13px;color:#6c0;padding-top:2px}.container_active_call_details_inner{display:flex;margin:0;padding:0;justify-content:left}.container_active_call_icon_grey{display:flex;width:18px;height:16px;justify-content:center;align-items:center;color:var(--sd-text-color-medium)}.container_active_call_icon_green{display:flex;width:18px;height:16px;justify-content:center;align-items:center;color:#6c0}.container_active_call_status_green{display:flex;justify-content:center;align-items:center;color:#6c0;padding-left:6px;font-size:12px}.container_active_call_status_grey{display:flex;justify-content:center;align-items:center;color:var(--sd-text-color-medium);padding-left:6px;font-size:12px}.container_active_call_options{display:flex;flex-direction:row}.container_active_call_options .button_active_call_options{display:flex;flex-basis:auto;justify-content:right}.container_active_call_options .button_active_call_options_highlighted{font-size:16px;color:#29abe0}.container_active_call_options_button{display:flex;border-radius:26px;border:none;padding:0;font-size:11px;color:var(--sd-text-color);width:32px;height:32px;justify-content:center;align-items:center}.container_active_call_options_button:hover{background:#f1f1f1}.container_conference_contact_list{position:relative;width:100%;background:#f7f7f7;border-top:1px solid #eee;border-bottom:1px solid #eee;height:149px;padding:0;margin-top:16px}.container_swap_merge_contact_list{position:relative;width:100%;background:var(--sd-background-color);height:149px;padding:0;margin-top:32px}.container_conference_contact_list_inner{margin:0;padding:0;position:relative;width:100%;height:100%}.container_conference_contact_list_scrollbox{padding:12px 15px}.container_conference_contact_item{width:100%;position:relative;display:flex;flex-direction:row;align-items:center;padding:0 10px;overflow:hidden;cursor:pointer}.button_disconnect_call{display:block;width:42px;height:42px;display:flex;margin:0;align-items:center;justify-content:center;line-height:normal;border-radius:50%;outline:none;border:none;color:#e0261f;background:#f7f7f7;-webkit-transition-duration:.3s;transition-duration:.3s}.button_disconnect_call:hover{color:var(--sd-text-color-inverse);background:#e0261f;-webkit-transition-duration:.3s;transition-duration:.3s}.container_separator{height:1px;width:100%;background:#ededed;margin:11px 0}.container_transfer_call{position:absolute;z-index:99999;left:0;right:0;bottom:-51px;width:100%;background:var(--sd-background-color)}.container_transfer_call_inner{background:var(--sd-background-color);box-shadow:#11111a1a 0 4px 16px,#11111a0d 0 8px 32px;padding:20px 15px 10px;border-radius:0;width:100%;position:relative;height:596px;overflow:hidden}.container_transfer_call_inner h2{font-family:var(--sd-text-font-family);font-size:20px;font-weight:700;color:var(--sd-text-color-dark);letter-spacing:-1px;padding:0;line-height:normal;text-transform:capitalize;margin-bottom:15px}.container_button_close{position:absolute;right:4px;top:4px}.container_button_close span{width:36px;height:36px;background:var(--sd-background-color);display:flex;align-items:center;justify-content:center;border-radius:50%;cursor:pointer}.container_button_close span:hover{background:var(--sd-background-color)}.container_button_close .fa-xmark{font-size:1.6em;font-weight:400;color:var(--sd-text-color-light)}.container_button_close span:hover .fa-xmark:hover{color:var(--sd-text-color-dark)}.container_transfer_call_content{margin:0;padding:5px 0 0;width:100%;background:var(--sd-background-color);min-height:485px}.container_transfer_call_content h3{font-family:var(--sd-text-font-family);font-size:14px;font-weight:700;color:var(--sd-text-color);letter-spacing:-.26px;padding:8px 0 0;line-height:normal;text-transform:capitalize;margin-bottom:15px}.container_transfer_call_content h3 span{color:var(--sd-text-color-dark)}.container_transfer_call_details{width:100%;margin:0;padding:10px 15px 69px;position:relative}.container_transfer_tab_buttons{display:flex;gap:10px;align-items:center;margin-bottom:15px}.button_transfer_tab{padding:10px;border:none;font-family:var(--sd-text-font-family);font-size:13px;font-weight:600;color:var(--sd-text-color);background-color:var(--sd-border-color-light);cursor:pointer;width:105px;border-radius:28px;outline:none}.button_transfer_tab.active{background-color:var(--sd-app-color);color:#fff}.container_transfer_tab_content{margin:0;padding:0;width:100%}.container_transfer_internal_search{margin:0 0 15px;padding:0;width:100%}.container_transfer_internal_search input{padding:0 16px;width:100%;outline:none;display:block;border:1px solid var(--sd-border-color-dark);color:var(--sd-text-color-medium);font-size:12px;letter-spacing:-.25px;font-family:var(--sd-text-font-family);background:var(--sd-background-color);font-style:italic;font-weight:400;position:relative;border-radius:27px;height:48px}.container_transfer_contact_list{width:100%;margin:0;padding:0;position:relative;height:336px}.container_transfer_contact_list_inner{width:100%;position:relative;height:100%}.container_transfer_internal_contact_list{position:absolute;width:100%;left:0;right:0;background:var(--sd-background-color);height:332px}.container_transfer_disconnect{width:100%;display:flex;justify-content:center;padding-top:3px;margin-bottom:6px}.container_avaya_footer{width:100%;padding:0;background:#f7f7f7;font-family:var(--sd-text-font-family);font-size:13px;font-weight:600;color:var(--sd-text-color-medium);position:relative;display:flex;height:51px;justify-content:center;align-items:center;border-top:1px solid var(--sd-border-color-light);-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:999;position:absolute;bottom:0;left:0}.margin_bottom_16{margin-bottom:16px}.margin_bottom_nt{margin-bottom:10px}.padding_top_nt{padding-top:7px}.shadow_st{box-shadow:#00000026 0 2px 8px}.call_animation{animation:play 2s ease infinite;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}.mini-call-switcher{display:flex;justify-content:center;margin-top:10px}.mini-call{padding:6px 12px;margin:0 6px;background:#eaeaea;border-radius:8px;cursor:pointer;font-size:14px}.mini-call.active{background-color:#c6f6d5;font-weight:700}.history-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#00000080;z-index:999}.history-popup{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:var(--sd-background-color);padding:20px;z-index:1000;box-shadow:0 2px 10px #0000004d;border-radius:5px;width:600px;max-height:80vh;overflow-y:auto}.history-content{position:relative}.history-content h3{margin-top:0}.close-btn{background:transparent;border:none;font-size:1.5rem;position:absolute;top:0;right:0;cursor:pointer}.history-content table{width:100%;border-collapse:collapse;margin-top:1rem}.history-content th,.history-content td{padding:.5rem;border:1px solid var(--sd-text-color-light)}@keyframes play{0%{transform:scale(1)}15%{box-shadow:0 0 0 4px #57b84680}25%{box-shadow:0 0 0 5px #98d48266,0 0 0 20px #fff3}25%{box-shadow:0 0 0 10px #c2e5b180,0 0 0 30px #fff3}}::-webkit-input-placeholder{color:#ddd}::-moz-placeholder{color:var(--sd-text-color-dark)}:-ms-input-placeholder{color:var(--sd-text-color-dark)}:-moz-placeholder{color:var(--sd-text-color-dark)}.slide_st{left:-100px;-webkit-animation:slide .5s forwards;-webkit-animation-delay:2s;animation:slide .5s forwards;animation-delay:0s}@-webkit-keyframes slide{to{left:0}}@keyframes slide{to{left:0}}.tabs_sd{width:100%;position:absolute;bottom:0;left:0;right:0;display:flex;height:51px;border-top:1px solid var(--sd-border-color-light);background:#f9f9f9;z-index:999999}.tab_heading_btn{display:flex;flex-basis:auto;flex-direction:column;flex-grow:1;justify-content:center;min-width:0;align-items:center;padding:0;border:none;cursor:pointer;width:25%;font-family:var(--sd-text-font-family);font-size:11px;font-weight:600;line-height:normal;color:var(--sd-text-color-medium);background:none;transition:background-color .3s linear;-webkit-transition:background-color .3s linear;-o-transition:background-color .3s linear;-ms-transition:background-color .3s linear}.nav_icon{display:flex;align-items:center;justify-content:center;height:22px;margin-bottom:1px}.nav_heading_sd{display:flex;align-items:center}.tab_heading_btn.active{color:var(--sd-app-color);background:url(data:image/gif;base64,R0lGODlhNwACAIAAAP9mMwAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OTc3NywgMjAyMy8wNi8yNS0yMzo1NzoxNCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODA1QUIyRjkwRDVFMTFGMDg4RUU4ODJGQTgxQUNDOEMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODA1QUIyRkEwRDVFMTFGMDg4RUU4ODJGQTgxQUNDOEMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4MDVBQjJGNzBENUUxMUYwODhFRTg4MkZBODFBQ0M4QyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4MDVBQjJGODBENUUxMUYwODhFRTg4MkZBODFBQ0M4QyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAAAAAAALAAAAAA3AAIAAAIJhI+py+0Po0wFADs=) top center no-repeat}.tab-content_sd{width:100%;height:100%;font-family:var(--sd-text-font-family);font-size:13px;font-weight:600;line-height:normal;background:var(--sd-background-color);-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}.container_transfer_fav_list{width:100%;margin:0;padding:0;position:relative;height:376px}.outer_container_swap_merge{width:100%;margin:0;padding:0}.container_swap_merge_item{width:100%;position:relative;display:flex;flex-direction:row;height:72px;border-radius:8px;overflow:hidden}.container_recent_item_image{display:flex;align-items:center}.container_swap_merge_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}.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}.onhold_st{font-family:var(--sd-text-font-family);font-size:12px;color:var(--sd-text-color-medium);font-weight:600}.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}.button_swap_merge{display:block;width:32px;height:45px;display:flex;flex-direction:column;flex-shrink:0;column-gap:0px;margin:0 0 0 28px;align-items:center;justify-content:center;line-height:normal;outline:none;border:none;font-size:12px;font-weight:600;color:var(--sd-text-color-dark);background:none;-webkit-transition-duration:.3s;transition-duration:.3s;position:relative;pointer-events:all;cursor:pointer}.button_swap_merge .button_icon{display:flex;justify-content:center;align-items:center;height:40px}.button_swap_merge .button_text{display:flex;justify-content:center;color:var(--sd-text-color-dark)}@media only screen and (max-width: 767px){.previewcontent{width:95%!important}.bgSecWrap .numberArrow{left:0!important;top:-20px!important}.transcription-popup{position:fixed;bottom:20px;right:20px;width:320px;max-height:250px;background:#fff;border-radius:10px;box-shadow:0 4px 12px #0003;padding:12px;z-index:1000;display:flex;flex-direction:column}.transcription-header{display:flex;justify-content:space-between;align-items:center;font-weight:700;font-size:14px;margin-bottom:8px}.transcription-body{overflow-y:auto;font-size:13px;line-height:1.4;color:#333}.close-btn{border:none;background:transparent;font-size:18px;cursor:pointer}}\n"] }]
|
|
2818
|
+
}], ctorParameters: () => [{ type: i1.HttpClient }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i1$1.FormBuilder }, { type: CountryService }, { type: PhoneNumberLookupService }, { type: AvayaIPOService }, { type: RecordingManagerService }, { type: CallSocketService }, { type: i8.SnugdeskAuthenticationService }, { type: i8.TenantService }, { type: i8.UserService }], propDecorators: { tenantId: [{
|
|
2819
|
+
type: Input,
|
|
2820
|
+
args: ['tenantId']
|
|
2821
|
+
}], userId: [{
|
|
2822
|
+
type: Input,
|
|
2823
|
+
args: ['userId']
|
|
2824
|
+
}], isVisible: [{
|
|
2825
|
+
type: Input,
|
|
2826
|
+
args: ['isVisible']
|
|
2827
|
+
}], containerHeightObservable: [{
|
|
2828
|
+
type: Input,
|
|
2829
|
+
args: ['containerHeightObservable']
|
|
2830
|
+
}], containerWidthObservable: [{
|
|
2831
|
+
type: Input,
|
|
2832
|
+
args: ['containerWidthObservable']
|
|
2833
|
+
}], notificationEvent: [{
|
|
2834
|
+
type: Output
|
|
2835
|
+
}] } });
|
|
2836
|
+
|
|
2837
|
+
class AvayaIPOWidgetModule {
|
|
2838
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: AvayaIPOWidgetModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
2839
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.9", ngImport: i0, type: AvayaIPOWidgetModule, declarations: [AvayaIPOWidgetComponent,
|
|
2840
|
+
CallHistoryComponent,
|
|
2841
|
+
DialpadComponent,
|
|
2842
|
+
DeviceSelectorComponent], imports: [CommonModule,
|
|
2843
|
+
FormsModule,
|
|
2844
|
+
ReactiveFormsModule,
|
|
2845
|
+
MatFormFieldModule,
|
|
2846
|
+
MatInputModule,
|
|
2847
|
+
MatError,
|
|
2848
|
+
MatFormField,
|
|
2849
|
+
MatLabel,
|
|
2850
|
+
NgxIntlTelInputModule], exports: [AvayaIPOWidgetComponent] });
|
|
2851
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: AvayaIPOWidgetModule, imports: [CommonModule,
|
|
2852
|
+
FormsModule,
|
|
2853
|
+
ReactiveFormsModule,
|
|
2854
|
+
MatFormFieldModule,
|
|
2855
|
+
MatInputModule,
|
|
2856
|
+
MatFormField,
|
|
2857
|
+
NgxIntlTelInputModule] });
|
|
2858
|
+
}
|
|
2859
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: AvayaIPOWidgetModule, decorators: [{
|
|
2860
|
+
type: NgModule,
|
|
2861
|
+
args: [{
|
|
2862
|
+
declarations: [
|
|
2863
|
+
AvayaIPOWidgetComponent,
|
|
2864
|
+
CallHistoryComponent,
|
|
2865
|
+
DialpadComponent,
|
|
2866
|
+
DeviceSelectorComponent,
|
|
2867
|
+
],
|
|
2868
|
+
imports: [
|
|
2869
|
+
CommonModule,
|
|
2870
|
+
FormsModule,
|
|
2871
|
+
ReactiveFormsModule,
|
|
2872
|
+
MatFormFieldModule,
|
|
2873
|
+
MatInputModule,
|
|
2874
|
+
MatError,
|
|
2875
|
+
MatFormField,
|
|
2876
|
+
MatLabel,
|
|
2877
|
+
NgxIntlTelInputModule,
|
|
2878
|
+
],
|
|
2879
|
+
exports: [AvayaIPOWidgetComponent],
|
|
2880
|
+
}]
|
|
2881
|
+
}] });
|
|
2882
|
+
|
|
2883
|
+
/*
|
|
2884
|
+
* Public API Surface of avaya-ipo-widget
|
|
2885
|
+
*/
|
|
2886
|
+
|
|
2887
|
+
/**
|
|
2888
|
+
* Generated bundle index. Do not edit.
|
|
2889
|
+
*/
|
|
2890
|
+
|
|
2891
|
+
export { AvayaIPOWidgetComponent, AvayaIPOWidgetModule };
|
|
2892
|
+
//# sourceMappingURL=snugdesk-avaya-ipo-widget.mjs.map
|