- <% number %>
+ <% agent.number %>
<% agent.name %>
-
diff --git a/bin/WorkerActiveCalls.php b/bin/WorkerActiveCalls.php
index 3882570..b2896bf 100644
--- a/bin/WorkerActiveCalls.php
+++ b/bin/WorkerActiveCalls.php
@@ -342,6 +342,25 @@ private function printActiveCalls():void
$queuesData[$call['lastQueue']]['calls'][] = $call;
}
}
+
+ // Move Unavailable agents to the end of the list (keep original order for the rest).
+ foreach ($queuesData as $qId => $queueTmpData) {
+ if (empty($queuesData[$qId]['agents']) || !is_array($queuesData[$qId]['agents'])) {
+ continue;
+ }
+ $availableAgents = [];
+ $unavailableAgents = [];
+ foreach ($queuesData[$qId]['agents'] as $agentNumber => $agentData) {
+ $state = $agentData['state'] ?? '';
+ if ($state === self::STATE_UNAVAILIBLE || $state === self::STATE_UNAVAILABLE) {
+ $unavailableAgents[$agentNumber] = $agentData;
+ } else {
+ $availableAgents[$agentNumber] = $agentData;
+ }
+ }
+ $queuesData[$qId]['agents'] = $availableAgents + $unavailableAgents;
+ }
+
$dataPrint = json_encode(['queues' => $queuesData, 'calls' => $calls], JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);
$newPrintHash = md5($dataPrint);
if($newPrintHash <> $this->lastPrintHash){
@@ -370,7 +389,8 @@ private function printActiveCalls():void
/**
* Поиск связанного канала.
* @param $linkedId
- * @param $srcChan
+ * @param $dstChannel
+ * @param $tmpBridgeStart
* @return bool
*/
private function findBridgeChannel($linkedId, &$dstChannel, &$tmpBridgeStart):bool
@@ -383,7 +403,6 @@ private function findBridgeChannel($linkedId, &$dstChannel, &$tmpBridgeStart):bo
while ( ($dstChannel === $srcChan || stripos($dstChannel, 'Local/') !== false) && $chFound ) {
$ch--;
if($ch < 0){
- print_r('ERROR, while');
break;
}
$chFound = false;
@@ -423,6 +442,7 @@ function ($matches) {
private function collectQueuesInfo():void
{
+ $this->logger->writeInfo('Update queues data...');
$this->queuesData = [];
$queues = CallQueues::find(['columns' => 'name,extension as number,uniqid as id']);
foreach ($queues as $queue){
@@ -433,7 +453,6 @@ private function collectQueuesInfo():void
foreach ($queuesAgents as $queuesAgent) {
$this->queuesData[$queuesAgent->queue]['agents'][] = $queuesAgent->extension;
}
-
if(!$this->init){
return;
}
@@ -454,10 +473,8 @@ private function collectQueuesInfo():void
'Uniqueid' => $queueCall['Uniqueid'],
'Linkedid' => $linkedId
];
-
$this->callType[$linkedId]['queue'] = $queueCall['Queue'];
}
-
}
/**
diff --git a/public/assets/js/module-monitor-active-calls-index.js b/public/assets/js/module-monitor-active-calls-index.js
index 620553f..423314a 100644
--- a/public/assets/js/module-monitor-active-calls-index.js
+++ b/public/assets/js/module-monitor-active-calls-index.js
@@ -1,16 +1,22 @@
"use strict";
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
-function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
-function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
-function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
+function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
-function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
+function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
+function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
+function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
+function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
+function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
+function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
+function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
+function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
+function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
/*
* Copyright (C) MIKO LLC - All Rights Reserved
* Unauthorized copying of this file, via any medium is strictly prohibited
@@ -71,10 +77,12 @@ var ModuleMonitorActiveCalls = {
this.name = data.queues[queueId].name;
this.number = data.queues[queueId].number;
this.agents = data.queues[queueId].agents;
+ this.agentsList = this.buildAgentsList(this.agents);
this.calls = Array.isArray(data.queues[queueId].calls) ? data.queues[queueId].calls : [];
this.allCalls = data.calls;
} else {
this.calls = [];
+ this.agentsList = [];
}
if (queueNameEl.dropdown('is hidden')) {
queueNameEl.dropdown({
@@ -94,10 +102,31 @@ var ModuleMonitorActiveCalls = {
_this.normalizeAgentCards();
});
},
+ buildAgentsList: function buildAgentsList(agentsObj) {
+ var entries = Object.entries(agentsObj || {});
+ var available = [];
+ var unavailable = [];
+ for (var _i = 0, _entries = entries; _i < _entries.length; _i++) {
+ var _entries$_i = _slicedToArray(_entries[_i], 2),
+ number = _entries$_i[0],
+ agent = _entries$_i[1];
+ var state = (agent === null || agent === void 0 ? void 0 : agent.state) || '';
+ var item = _objectSpread({
+ number: number
+ }, agent);
+ if (state === 'Unavailable') {
+ unavailable.push(item);
+ } else {
+ available.push(item);
+ }
+ }
+ return available.concat(unavailable);
+ },
formatElapsedTime: function formatElapsedTime(enterTime) {
return window[className].formatElapsedTime(enterTime);
},
normalizeAgentCards: function normalizeAgentCards() {
+ var _this2 = this;
if (!this.$el) return;
// Cleanup artifacts from previous experiments (placeholders/spacers).
@@ -106,9 +135,9 @@ var ModuleMonitorActiveCalls = {
return el.remove();
});
- // Masonry-like layout via CSS columns to avoid empty gaps with different card heights.
- // We inject styles here because this project restricts edits to /public/assets/js/src/.
- this.ensureAgentCardsMasonry();
+ // Dense layout (masonry) that still fills left-to-right:
+ // flex-wrap can't place items into vertical gaps under tall cards.
+ this.ensureAgentCardsGridMasonry();
// Prevent "equal height" cards in one row (Semantic UI cards are flex).
var cardsContainer = this.$el.querySelector('.ui.cards.agent-cards');
@@ -126,6 +155,10 @@ var ModuleMonitorActiveCalls = {
headers.forEach(function (el) {
el.style.fontSize = '1em';
el.style.lineHeight = '1.2';
+ el.style.display = 'flex';
+ el.style.alignItems = 'center';
+ el.style.gap = '0.5em';
+ el.style.whiteSpace = 'nowrap';
});
var metas = this.$el.querySelectorAll('.ui.card.agent-card .meta.agent-peer');
metas.forEach(function (el) {
@@ -142,18 +175,31 @@ var ModuleMonitorActiveCalls = {
el.style.alignItems = 'center';
el.style.paddingTop = '0';
el.style.paddingBottom = '0';
+ // Allow label to shrink (otherwise long numbers force card wider than 180px)
+ el.style.flex = '0 1 auto';
+ el.style.minWidth = '0';
+ el.style.maxWidth = '14ch';
+ el.style.overflow = 'hidden';
+ el.style.textOverflow = 'ellipsis';
+ el.style.whiteSpace = 'nowrap';
});
var names = this.$el.querySelectorAll('.ui.card.agent-card .agent-name');
names.forEach(function (el) {
el.style.lineHeight = '1.2';
- el.style.display = 'inline-flex';
- el.style.alignItems = 'center';
+ // Ellipsis for long names (e.g. "Салтыков-Щедрин")
+ el.style.minWidth = '0';
+ el.style.flex = '1 1 auto';
+ el.style.overflow = 'hidden';
+ el.style.textOverflow = 'ellipsis';
+ el.style.whiteSpace = 'nowrap';
});
- // Tune vertical gap between cards so that:
- // 2 * (shortCardHeight + gap) ~= (tallCardHeight + gap)
- // This makes the masonry columns visually "grid-like".
- this.adjustAgentCardsGap();
+ // Grid masonry needs row-span calculation after layout.
+ requestAnimationFrame(function () {
+ requestAnimationFrame(function () {
+ _this2.layoutAgentCardsGridMasonry();
+ });
+ });
},
adjustAgentCardsGap: function adjustAgentCardsGap() {
if (!this.$el) return;
@@ -180,18 +226,109 @@ var ModuleMonitorActiveCalls = {
gap = Math.max(0, Math.min(20, Math.round(gap)));
container.style.setProperty('--agent-card-gap', "".concat(gap, "px"));
},
- ensureAgentCardsMasonry: function ensureAgentCardsMasonry() {
- var styleId = 'agent-cards-masonry-style';
- if (!document.getElementById(styleId)) {
- var styleEl = document.createElement('style');
+ adjustAgentCardsColumnCount: function adjustAgentCardsColumnCount() {
+ if (!this.$el) return;
+ var container = this.$el.querySelector('.ui.cards.agent-cards.agent-cards-masonry');
+ if (!container) return;
+ var w = container.clientWidth;
+ if (!w) return;
+
+ // Minimum acceptable card width in px (tune if needed)
+ var minCardWidth = 150;
+ var cs = window.getComputedStyle(container);
+ var gapRaw = cs.columnGap || cs.getPropertyValue('column-gap') || '16px';
+ var gapPx = parseFloat(gapRaw) || 16;
+ var count = Math.max(1, Math.min(12, Math.floor((w + gapPx) / (minCardWidth + gapPx))));
+ container.style.setProperty('--agent-card-col-count', String(count));
+ },
+ ensureAgentCardsGridMasonry: function ensureAgentCardsGridMasonry() {
+ var _this3 = this;
+ var styleId = 'agent-cards-layout-style';
+ var styleEl = document.getElementById(styleId);
+ if (!styleEl) {
+ styleEl = document.createElement('style');
styleEl.id = styleId;
- styleEl.textContent = "\n/* Masonry layout for agents cards (scoped) */\n.ui.cards.agent-cards.agent-cards-masonry {\n display: block !important;\n column-width: 240px;\n column-gap: 1em;\n /* Prevent overlap with the legend block below */\n margin-bottom: 1em !important;\n padding-bottom: 0.5em !important;\n}\n.ui.cards.agent-cards.agent-cards-masonry > .ui.card.agent-card {\n display: inline-block !important;\n width: 100% !important;\n margin: 0 0 var(--agent-card-gap, 12px) 0 !important;\n break-inside: avoid;\n -webkit-column-break-inside: avoid;\n page-break-inside: avoid;\n}\n\t\t\t\t\t\t".trim();
document.head.appendChild(styleEl);
}
+
+ // Grid masonry: fills left-to-right and can pack items into gaps.
+ styleEl.textContent = "\n.ui.cards.agent-cards.agent-cards-grid {\n display: grid !important;\n grid-template-columns: repeat(auto-fill, 240px);\n justify-content: start;\n gap: var(--agent-card-gap, 8px);\n grid-auto-rows: 1px;\n /* Prevent overlap with the legend block below */\n margin-bottom: 1em !important;\n}\n.ui.cards.agent-cards.agent-cards-grid > .ui.card.agent-card {\n width: 240px !important;\n margin: 0 !important;\n overflow: hidden;\n /* reset from previous layouts */\n align-self: start;\n}\n\t\t\t\t\t".trim();
var cardsContainer = this.$el && this.$el.querySelector ? this.$el.querySelector('.ui.cards.agent-cards') : null;
if (cardsContainer) {
- cardsContainer.classList.add('agent-cards-masonry');
+ cardsContainer.classList.remove('agent-cards-masonry');
+ cardsContainer.classList.remove('agent-cards-flex');
+ cardsContainer.classList.add('agent-cards-grid');
+
+ // Bind once: relayout on resize.
+ if (!this._agentCardsResizeBound) {
+ this._agentCardsResizeBound = true;
+ window.addEventListener('resize', function () {
+ _this3.layoutAgentCardsGridMasonry();
+ });
+ }
+ }
+ },
+ layoutAgentCardsGridMasonry: function layoutAgentCardsGridMasonry() {
+ if (!this.$el) return;
+ var grid = this.$el.querySelector('.ui.cards.agent-cards.agent-cards-grid');
+ if (!grid) return;
+ var cs = window.getComputedStyle(grid);
+ var rowHeight = parseFloat(cs.getPropertyValue('grid-auto-rows')) || 1;
+ var rowGap = parseFloat(cs.getPropertyValue('row-gap')) || parseFloat(cs.getPropertyValue('gap')) || 8;
+ var items = Array.from(grid.querySelectorAll('.ui.card.agent-card'));
+ if (!items.length) return;
+
+ // Reset row spans and min-heights to measure natural heights.
+ items.forEach(function (item) {
+ item.style.gridRowEnd = '';
+ item.style.minHeight = '';
+ });
+ var tall = items.filter(function (c) {
+ return c.querySelector('.meta.agent-peer');
+ });
+ var _short = items.filter(function (c) {
+ return !c.querySelector('.meta.agent-peer');
+ });
+
+ // If we don't have both types, just do normal masonry spans.
+ if (!tall.length || !_short.length) {
+ items.forEach(function (item) {
+ var h = item.getBoundingClientRect().height;
+ var span = Math.max(1, Math.ceil((h + rowGap) / (rowHeight + rowGap)));
+ item.style.gridRowEnd = "span ".concat(span);
+ });
+ return;
}
+ var hs = Math.max.apply(Math, _toConsumableArray(_short.map(function (c) {
+ return c.getBoundingClientRect().height;
+ })));
+ var ht = Math.max.apply(Math, _toConsumableArray(tall.map(function (c) {
+ return c.getBoundingClientRect().height;
+ })));
+
+ // Want: 2*(hs + g) = (ht + g) => g = ht - 2*hs
+ var g = ht - 2 * hs;
+ if (!Number.isFinite(g)) g = rowGap;
+ g = Math.max(0, Math.min(24, Math.round(g)));
+
+ // Apply gap and enforce min-heights so the relation holds visually.
+ grid.style.setProperty('--agent-card-gap', "".concat(g, "px"));
+ var shortH = Math.round(hs);
+ var tallH = Math.round(Math.max(ht, 2 * hs + g));
+ _short.forEach(function (c) {
+ c.style.minHeight = "".concat(shortH, "px");
+ });
+ tall.forEach(function (c) {
+ c.style.minHeight = "".concat(tallH, "px");
+ });
+
+ // Now compute row spans from final rendered heights.
+ var effectiveGap = g;
+ items.forEach(function (item) {
+ var h = item.getBoundingClientRect().height;
+ var span = Math.max(1, Math.ceil((h + effectiveGap) / (rowHeight + effectiveGap)));
+ item.style.gridRowEnd = "span ".concat(span);
+ });
},
getSrcNumForAgent: function getSrcNumForAgent(agentNumber) {
var result = '-';
@@ -296,6 +433,7 @@ var ModuleMonitorActiveCalls = {
"number": "",
"queues": [],
"agents": {},
+ "agentsList": [],
"calls": []
}
});
diff --git a/public/assets/js/module-monitor-active-calls-index.js.map b/public/assets/js/module-monitor-active-calls-index.js.map
index b660693..c6839fe 100644
--- a/public/assets/js/module-monitor-active-calls-index.js.map
+++ b/public/assets/js/module-monitor-active-calls-index.js.map
@@ -1 +1 @@
-{"version":3,"file":"module-monitor-active-calls-index.js","names":["idUrl","idForm","className","inputClassName","ModuleMonitorActiveCalls","isInit","queueNameSelector","$formObj","$","$checkBoxes","$dropDowns","activeChannelsUrl","globalRootUrl","activeChannelsUrlV2","executeCallUrl","saveUserActionUrl","$widget","undefined","validateRules","initialize","dropdown","onChange","value","text","$choice","window","onChangeSetting","val","userNumber","$widgetQueues","Vue","el","delimiters","methods","updatedCallsFromResponse","data","_this","queueNameEl","minWaitVisible","queues","queueId","id","name","number","agents","calls","Array","isArray","allCalls","$nextTick","normalizeAgentCards","formatElapsedTime","enterTime","$el","artifacts","querySelectorAll","forEach","remove","ensureAgentCardsMasonry","cardsContainer","querySelector","style","alignItems","alignContent","cards","card","alignSelf","headers","fontSize","lineHeight","metas","numLabels","display","paddingTop","paddingBottom","names","adjustAgentCardsGap","container","from","length","tallCard","find","c","shortCard","ht","getBoundingClientRect","height","hs","gap","Number","isFinite","Math","max","min","round","setProperty","concat","styleId","document","getElementById","styleEl","createElement","textContent","trim","head","appendChild","classList","add","getSrcNumForAgent","agentNumber","result","answeredFound","_iterator","_createForOfIteratorHelper","_step","s","n","done","call","dst_num","src_num","calledChannels","match","ch","bridgeChannels","err","e","f","i","tmpCall","spyer","spy_num","exten","hasPeerPhone","phone","String","getPeerPhoneLabel","getPeerNameLabel","$callsWidget","fullAccess","callIsVisible","dst_chan","queueData","EnterTime","getWaitTime","formatTimestampToTime","timestamp","ts","parseFloat","ms","date","Date","hours","getHours","padStart","minutes","getMinutes","seconds","getSeconds","answer","floor","now","secondToTime","start","getCallTime","queue","_data$calls","push","apply","_toConsumableArray","Extensions","updatePhonesRepresent","hangupAction","event","target","attr","parent","executeCallAction","action","ch1","ch2","joinAction","whisperAction","spChannel","listenAction","lines","checkbox","initializeForm","tab","removeClass","hide","updateLines","setInterval","diffSeconds","toString","settingName","_defineProperty","api","url","on","method","successTest","response","Object","keys","success","onSuccess","location","href","onFailure","console","log","onError","errorMessage","element","xhr","cbBeforeSendForm","settings","form","cbAfterSendForm","Form","ready"],"sources":["src/module-monitor-active-calls-index.js"],"sourcesContent":["/*\n * Copyright (C) MIKO LLC - All Rights Reserved\n * Unauthorized copying of this file, via any medium is strictly prohibited\n * Proprietary and confidential\n * Written by Nikolay Beketov, 11 2018\n *\n */\nconst idUrl = 'module-monitor-active-calls';\nconst idForm = 'module-monitor-active-calls-form';\nconst className = 'ModuleMonitorActiveCalls';\nconst inputClassName = 'mikopbx-module-input';\n\n/* global $, globalRootUrl, globalTranslate, Form, Config, Vue, Extensions */\nconst ModuleMonitorActiveCalls = {\n\tisInit: true,\n\tqueueNameSelector: '#app-queue div.scrolling.dropdown',\n\t$formObj: $('#'+idForm),\n\t$checkBoxes: $('#'+idForm+' .ui.checkbox'),\n\t$dropDowns: $('#'+idForm+' .ui.dropdown'),\n\tactiveChannelsUrl: globalRootUrl + idUrl + \"/getActiveChannels\",\n\tactiveChannelsUrlV2: globalRootUrl + idUrl + \"/getActiveChannelsV2\",\n\texecuteCallUrl: globalRootUrl + idUrl + \"/executeCall\",\n\tsaveUserActionUrl: globalRootUrl + idUrl + \"/saveUser\",\n\t$widget: undefined,\n\n\t/**\n\t * Field validation rules\n\t * https://semantic-ui.com/behaviors/form.html\n\t */\n\tvalidateRules: {},\n\t/**\n\t * On page load we init some Semantic UI library\n\t */\n\tinitialize() {\n\t\t$(\"#nowUser.dropdown.enable\").dropdown({\n\t\t\tonChange: function onChange(value, text, $choice) {\n\t\t\t\twindow[className].onChangeSetting('adminUserId', value);\n\t\t\t}\n\t\t});\n\t\t$(\"#minWaitVisible.dropdown.enable\").dropdown({\n\t\t\tonChange: function onChange(value, text, $choice) {\n\t\t\t\t$('#minWaitVisibleValue').val(value);\n\t\t\t\twindow[className].onChangeSetting('minWaitVisible', value);\n\t\t\t}\n\t\t});\n\t\tlet userNumber = $('#userNumber').val();\n\n\t\twindow[className].$widgetQueues = new Vue({\n\t\t\tel: '#app-queue',\n\t\t\tdelimiters: [\"<%\",\"%>\"],\n\t\t\tmethods: {\n\t\t\t\tupdatedCallsFromResponse(data) {\n\t\t\t\t\tlet queueNameEl = $(window[className].queueNameSelector);\n\t\t\t\t\tthis.minWaitVisible = 1*$('#minWaitVisibleValue').val();\n\n\t\t\t\t\tthis.queues = data.queues;\n\t\t\t\t\tlet queueId = $('#queueId').val();\n\t\t\t\t\tif (queueId in data.queues) {\n\t\t\t\t\t\tthis.id = data.queues[queueId].id;\n\t\t\t\t\t\tthis.name = data.queues[queueId].name;\n\t\t\t\t\t\tthis.number = data.queues[queueId].number;\n\t\t\t\t\t\tthis.agents = data.queues[queueId].agents;\n\t\t\t\t\t\tthis.calls = Array.isArray(data.queues[queueId].calls) ? data.queues[queueId].calls : [];\n\t\t\t\t\t\tthis.allCalls = data.calls;\n\t\t\t\t\t}else{\n\t\t\t\t\t\tthis.calls = [];\n\t\t\t\t\t}\n\t\t\t\t\tif(queueNameEl.dropdown('is hidden')){\n\t\t\t\t\t\tqueueNameEl.dropdown({\n\t\t\t\t\t\t\tonChange: function onChange(value, text, $choice) {\n\t\t\t\t\t\t\t\twindow[className].onChangeSetting('queueId', value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif(queueNameEl.dropdown('get value') === ''){\n\t\t\t\t\t\t\twindow[className].isInit = true;\n\t\t\t\t\t\t\tqueueNameEl.dropdown('set value', $('#queueId').val())\n\t\t\t\t\t\t\twindow[className].isInit = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Normalize Semantic UI Card typography after render\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tthis.normalizeAgentCards();\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tformatElapsedTime(enterTime) {\n\t\t\t\t\treturn window[className].formatElapsedTime(enterTime);\n\t\t\t\t},\n\t\t\t\tnormalizeAgentCards() {\n\t\t\t\t\tif (!this.$el) return;\n\n\t\t\t\t\t// Cleanup artifacts from previous experiments (placeholders/spacers).\n\t\t\t\t\tconst artifacts = this.$el.querySelectorAll('.agent-peer-placeholder, .agent-peer-spacer');\n\t\t\t\t\tartifacts.forEach((el) => el.remove());\n\n\t\t\t\t\t// Masonry-like layout via CSS columns to avoid empty gaps with different card heights.\n\t\t\t\t\t// We inject styles here because this project restricts edits to /public/assets/js/src/.\n\t\t\t\t\tthis.ensureAgentCardsMasonry();\n\n\t\t\t\t\t// Prevent \"equal height\" cards in one row (Semantic UI cards are flex).\n\t\t\t\t\tconst cardsContainer = this.$el.querySelector('.ui.cards.agent-cards');\n\t\t\t\t\tif (cardsContainer) {\n\t\t\t\t\t\tcardsContainer.style.alignItems = 'flex-start';\n\t\t\t\t\t\tcardsContainer.style.alignContent = 'flex-start';\n\t\t\t\t\t}\n\n\t\t\t\t\tconst cards = this.$el.querySelectorAll('.ui.cards.agent-cards > .ui.card.agent-card');\n\t\t\t\t\tcards.forEach((card) => {\n\t\t\t\t\t\tcard.style.alignSelf = 'flex-start';\n\t\t\t\t\t});\n\n\t\t\t\t\t// Semantic UI makes .header bigger than normal text; we need same font size.\n\t\t\t\t\tconst headers = this.$el.querySelectorAll('.ui.card.agent-card .header.agent-card-header');\n\t\t\t\t\theaders.forEach((el) => {\n\t\t\t\t\t\tel.style.fontSize = '1em';\n\t\t\t\t\t\tel.style.lineHeight = '1.2';\n\t\t\t\t\t});\n\n\t\t\t\t\tconst metas = this.$el.querySelectorAll('.ui.card.agent-card .meta.agent-peer');\n\t\t\t\t\tmetas.forEach((el) => {\n\t\t\t\t\t\tel.style.fontSize = '1em';\n\t\t\t\t\t\tel.style.lineHeight = '1.2';\n\t\t\t\t\t});\n\n\t\t\t\t\t// Normalize label/name typography so they have same text height.\n\t\t\t\t\tconst numLabels = this.$el.querySelectorAll('.ui.card.agent-card .agent-num-label');\n\t\t\t\t\tnumLabels.forEach((el) => {\n\t\t\t\t\t\tel.style.fontSize = '1em';\n\t\t\t\t\t\tel.style.lineHeight = '1.2';\n\t\t\t\t\t\tel.style.display = 'inline-flex';\n\t\t\t\t\t\tel.style.alignItems = 'center';\n\t\t\t\t\t\tel.style.paddingTop = '0';\n\t\t\t\t\t\tel.style.paddingBottom = '0';\n\t\t\t\t\t});\n\t\t\t\t\tconst names = this.$el.querySelectorAll('.ui.card.agent-card .agent-name');\n\t\t\t\t\tnames.forEach((el) => {\n\t\t\t\t\t\tel.style.lineHeight = '1.2';\n\t\t\t\t\t\tel.style.display = 'inline-flex';\n\t\t\t\t\t\tel.style.alignItems = 'center';\n\t\t\t\t\t});\n\n\t\t\t\t\t// Tune vertical gap between cards so that:\n\t\t\t\t\t// 2 * (shortCardHeight + gap) ~= (tallCardHeight + gap)\n\t\t\t\t\t// This makes the masonry columns visually \"grid-like\".\n\t\t\t\t\tthis.adjustAgentCardsGap();\n\t\t\t\t},\n\t\t\t\tadjustAgentCardsGap() {\n\t\t\t\t\tif (!this.$el) return;\n\t\t\t\t\tconst container = this.$el.querySelector('.ui.cards.agent-cards');\n\t\t\t\t\tif (!container) return;\n\n\t\t\t\t\tconst cards = Array.from(container.querySelectorAll('.ui.card.agent-card'));\n\t\t\t\t\tif (!cards.length) return;\n\n\t\t\t\t\tconst tallCard = cards.find((c) => c.querySelector('.meta.agent-peer'));\n\t\t\t\t\tconst shortCard = cards.find((c) => !c.querySelector('.meta.agent-peer'));\n\t\t\t\t\tif (!tallCard || !shortCard) return;\n\n\t\t\t\t\tconst ht = tallCard.getBoundingClientRect().height;\n\t\t\t\t\tconst hs = shortCard.getBoundingClientRect().height;\n\t\t\t\t\tif (!ht || !hs) return;\n\n\t\t\t\t\t// From 2*(hs+g) = ht+g => g = ht - 2*hs\n\t\t\t\t\tlet gap = ht - 2 * hs;\n\t\t\t\t\tif (!Number.isFinite(gap)) return;\n\n\t\t\t\t\t// Clamp to sane range; negative means \"no extra gap needed\".\n\t\t\t\t\tgap = Math.max(0, Math.min(20, Math.round(gap)));\n\n\t\t\t\t\tcontainer.style.setProperty('--agent-card-gap', `${gap}px`);\n\t\t\t\t},\n\t\t\t\tensureAgentCardsMasonry() {\n\t\t\t\t\tconst styleId = 'agent-cards-masonry-style';\n\t\t\t\t\tif (!document.getElementById(styleId)) {\n\t\t\t\t\t\tconst styleEl = document.createElement('style');\n\t\t\t\t\t\tstyleEl.id = styleId;\n\t\t\t\t\t\tstyleEl.textContent = `\n/* Masonry layout for agents cards (scoped) */\n.ui.cards.agent-cards.agent-cards-masonry {\n display: block !important;\n column-width: 240px;\n column-gap: 1em;\n /* Prevent overlap with the legend block below */\n margin-bottom: 1em !important;\n padding-bottom: 0.5em !important;\n}\n.ui.cards.agent-cards.agent-cards-masonry > .ui.card.agent-card {\n display: inline-block !important;\n width: 100% !important;\n margin: 0 0 var(--agent-card-gap, 12px) 0 !important;\n break-inside: avoid;\n -webkit-column-break-inside: avoid;\n page-break-inside: avoid;\n}\n\t\t\t\t\t\t`.trim();\n\t\t\t\t\t\tdocument.head.appendChild(styleEl);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst cardsContainer = this.$el && this.$el.querySelector\n\t\t\t\t\t\t? this.$el.querySelector('.ui.cards.agent-cards')\n\t\t\t\t\t\t: null;\n\t\t\t\t\tif (cardsContainer) {\n\t\t\t\t\t\tcardsContainer.classList.add('agent-cards-masonry');\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tgetSrcNumForAgent(agentNumber) {\n\t\t\t\t\tlet result = '-';\n\t\t\t\t\tlet answeredFound = false;\n\t\t\t\t\tfor (const call of this.calls) {\n\t\t\t\t\t\tif(call.dst_num === agentNumber){\n\t\t\t\t\t\t\tansweredFound = true;\n\t\t\t\t\t\t\tresult = call.src_num;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (call.calledChannels && Array.isArray(call.calledChannels)) {\n\t\t\t\t\t\t\tconst match = call.calledChannels.find(ch => ch.number === agentNumber);\n\t\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\t\tresult = call.src_num;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (call.bridgeChannels && Array.isArray(call.bridgeChannels)) {\n\t\t\t\t\t\t\tconst match = call.bridgeChannels.find(ch => (ch.src_num === agentNumber || ch.dst_num === agentNumber));\n\t\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\t\tif(match.src_num === agentNumber){\n\t\t\t\t\t\t\t\t\tresult = match.dst_num;\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\tresult = match.src_num;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tansweredFound = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(answeredFound === false){\n\t\t\t\t\t\tfor (let i = 0; i < this.allCalls.length; i++) {\n\t\t\t\t\t\t\tconst tmpCall = this.allCalls[i];\n\t\t\t\t\t\t\tif(tmpCall.src_num === agentNumber){\n\t\t\t\t\t\t\t\t// Исходящий\n\t\t\t\t\t\t\t\tif(tmpCall.dst_num === ''){\n\t\t\t\t\t\t\t\t\t// не ответа, дозвон.\n\t\t\t\t\t\t\t\t\tif (tmpCall.calledChannels && Array.isArray(tmpCall.calledChannels) && tmpCall.calledChannels.length) {\n\t\t\t\t\t\t\t\t\t\tconst match = tmpCall.calledChannels.find(ch => ch.number !== agentNumber);\n\t\t\t\t\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\t\t\t\t\tresult = match.number;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}else if(tmpCall.spyer){\n\t\t\t\t\t\t\t\t\t\t// шпионит за номером.\n\t\t\t\t\t\t\t\t\t\tresult = tmpCall.spy_num;\n\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t// нет вызываемых каналов, возможно это вызов на приложение / ivr.\n\t\t\t\t\t\t\t\t\t\tresult = tmpCall.exten;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\tresult = tmpCall.dst_num;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}else if(tmpCall.dst_num === agentNumber){\n\t\t\t\t\t\t\t\t// Входящий на агента, отвечен.\n\t\t\t\t\t\t\t\tresult = tmpCall.src_num;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\tif (tmpCall.calledChannels && Array.isArray(tmpCall.calledChannels)) {\n\t\t\t\t\t\t\t\t\tconst match = tmpCall.calledChannels.find(ch => ch.number === agentNumber);\n\t\t\t\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\t\t\t\tresult = tmpCall.src_num;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t},\n\t\t\t\thasPeerPhone(agentNumber) {\n\t\t\t\t\tconst phone = String(this.getSrcNumForAgent(agentNumber) || '').trim();\n\t\t\t\t\treturn phone !== '' && phone !== '-' && phone !== '—';\n\t\t\t\t},\n\t\t\t\tgetPeerPhoneLabel(agentNumber) {\n\t\t\t\t\tconst phone = String(this.getSrcNumForAgent(agentNumber) || '').trim();\n\t\t\t\t\treturn this.hasPeerPhone(agentNumber) ? phone : '—';\n\t\t\t\t},\n\t\t\t\tgetPeerNameLabel(agentNumber) {\n\t\t\t\t\t// Placeholder for future \"peer name\" feature\n\t\t\t\t\tvoid agentNumber;\n\t\t\t\t\treturn '—';\n\t\t\t\t}\n\t\t\t},\n\t\t\tdata: {\n\t\t\t\t\"minWaitVisible\": 30,\n\t\t\t\t\"name\": \"\",\n\t\t\t\t\"number\": \"\",\n\t\t\t\t\"queues\": [],\n\t\t\t\t\"agents\": {\n\t\t\t\t},\n\t\t\t\t\"calls\": [\n\t\t\t\t]\n\t\t\t},\n\t\t});\n\n\t\twindow[className].$callsWidget = new Vue({\n\t\t\tel: '#calls',\n\t\t\tdelimiters: [\"<%\",\"%>\"],\n\t\t\tdata: {\n\t\t\t\t\"minWaitVisible\": 30,\n\t\t\t\tuserNumber: userNumber,\n\t\t\t\tfullAccess: ($('#fullAccess').val() === \"1\" || userNumber === ''),\n\t\t\t\tcalls: [\n\t\t\t\t]\n\t\t\t},\n\t\t\tmethods: {\n\t\t\t\tcallIsVisible(call){\n\t\t\t\t\tif(call.dst_chan==='' && call.queueData.EnterTime !== undefined ){\n\t\t\t\t\t\treturn this.minWaitVisible <= this.getWaitTime(call);\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t\tformatTimestampToTime(timestamp) {\n\t\t\t\t\t// Если timestamp строка — приводим к числу\n\t\t\t\t\tconst ts = typeof timestamp === 'string' ? parseFloat(timestamp) : timestamp;\n\n\t\t\t\t\t// Если timestamp в секундах (меньше 1e10), умножаем на 1000\n\t\t\t\t\tconst ms = ts < 1e10 ? ts * 1000 : ts;\n\n\t\t\t\t\tconst date = new Date(ms);\n\n\t\t\t\t\tconst hours = String(date.getHours()).padStart(2, '0');\n\t\t\t\t\tconst minutes = String(date.getMinutes()).padStart(2, '0');\n\t\t\t\t\tconst seconds = String(date.getSeconds()).padStart(2, '0');\n\n\t\t\t\t\treturn `${hours}:${minutes}:${seconds}`;\n\t\t\t\t},\n\t\t\t\tgetWaitTime(call){\n\t\t\t\t\tlet answer = Math.floor(Date.now() / 1000);\n\t\t\t\t\tif(call.answer !== ''){\n\t\t\t\t\t\tanswer = call.answer\n\t\t\t\t\t}\n\t\t\t\t\treturn window[className].secondToTime(answer - call.start);\n\t\t\t\t},\n\t\t\t\tgetCallTime(call){\n\t\t\t\t\tif(call.answer === ''){\n\t\t\t\t\t\treturn '-';\n\t\t\t\t\t}\n\t\t\t\t\treturn window[className].formatElapsedTime(call.answer);\n\t\t\t\t},\n\t\t\t\tupdatedCallsFromResponse(data) {\n\t\t\t\t\tthis.minWaitVisible = 1*$('#minWaitVisibleValue').val();\n\t\t\t\t\t// Проходим по всем очередям\n\t\t\t\t\tfor (const queueId in data.queues) {\n\t\t\t\t\t\tconst queue = data.queues[queueId];\n\t\t\t\t\t\t// Проверяем, есть ли у очереди поле calls и является ли оно массивом\n\t\t\t\t\t\tif (Array.isArray(queue.calls)) {\n\t\t\t\t\t\t\t// Добавляем все вызовы из этой очереди в общий массив\n\t\t\t\t\t\t\tdata.calls.push(...queue.calls);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.calls = data.calls;\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tExtensions.updatePhonesRepresent('need-update');\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tformatElapsedTime(enterTime) {\n\t\t\t\t\treturn window[className].formatElapsedTime(enterTime);\n\t\t\t\t},\n\t\t\t\thangupAction(event) {\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'hangup', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2')});\n\t\t\t\t},\n\t\t\t\tjoinAction(event) {\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'join', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2'), number: this.userNumber});\n\t\t\t\t},\n\t\t\t\twhisperAction(event){\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlet spChannel = target.attr('data-ch1');\n\t\t\t\t\tif('incoming' === target.attr('data-call-type')){\n\t\t\t\t\t\tspChannel = target.attr('data-ch2');\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'whisper', ch1: spChannel, ch2: '', number: this.userNumber});\n\t\t\t\t},\n\t\t\t\tlistenAction(event){\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'listen', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2'), number: this.userNumber});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\twindow[className].$widget = new Vue({\n\t\t\tel: '#app',\n\t\t\tdelimiters: [\"<%\",\"%>\"],\n\t\t\tdata: {\n\t\t\t\tuserNumber: userNumber,\n\t\t\t\tfullAccess: ($('#fullAccess').val() === \"1\" || userNumber === ''),\n\t\t\t\tcalls: [\n\t\t\t\t]\n\t\t\t},\n\t\t\tmethods: {\n\t\t\t\tupdatedCallsFromResponse(lines) {\n\t\t\t\t\tthis.calls = lines;\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tExtensions.updatePhonesRepresent('need-update');\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\thangupAction(event) {\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'hangup', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2')});\n\t\t\t\t},\n\t\t\t\tjoinAction(event) {\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'join', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2'), number: this.userNumber});\n\t\t\t\t},\n\t\t\t\twhisperAction(event){\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlet spChannel = target.attr('data-ch1');\n\t\t\t\t\tif('incoming' === target.attr('data-call-type')){\n\t\t\t\t\t\tspChannel = target.attr('data-ch2');\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'whisper', ch1: spChannel, ch2: '', number: this.userNumber});\n\t\t\t\t},\n\t\t\t\tlistenAction(event){\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'listen', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2'), number: this.userNumber});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\twindow[className].$checkBoxes.checkbox();\n\t\twindow[className].$dropDowns.dropdown();\n\t\twindow[className].initializeForm();\n\t\t$('.menu .item').tab();\n\t\t//////\n\t\t// Удаляем отступы контейнера.\n\t\t$('#main-content-container').removeClass('container');\n\t\t$('#module-status-toggle-segment').hide();\n\t\t$('.ui.clearing.hidden.divider').remove();\n\t\t// Окончание форматирования базовой страницы\n\t\t//////\n\t\twindow[className].updateLines();\n\t\tsetInterval(window[className].updateLines, 2000);\n\t},\n\tformatElapsedTime(enterTime) {\n\t\tif (!enterTime) return '—';\n\n\t\tconst now = Math.floor(Date.now() / 1000);\n\t\tconst diffSeconds = now - enterTime;\n\n\t\treturn window[className].secondToTime(diffSeconds);\n\t},\n\tsecondToTime(diffSeconds){\n\t\tif (diffSeconds < 0) return '0';\n\t\t// Форматируем: чч:мм:сс или мм:сс, или просто секунды\n\t\tconst hours = Math.floor(diffSeconds / 3600);\n\t\tconst minutes = Math.floor((diffSeconds % 3600) / 60);\n\t\tconst seconds = Math.round(diffSeconds % 60);\n\t\tif (hours > 0) {\n\t\t\treturn `${hours}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n\t\t} else if (minutes > 0) {\n\t\t\treturn `${minutes}:${seconds.toString().padStart(2, '0')}`;\n\t\t} else {\n\t\t\treturn `${seconds}`;\n\t\t}\n\t},\n\tonChangeSetting(settingName, value) {\n\t\tif(window[className].isInit){\n\t\t\treturn;\n\t\t}\n\t\tlet data = {\n\t\t\t[settingName]: value\n\t\t};\n\t\t$.api({\n\t\t\turl: window[className].saveUserActionUrl,\n\t\t\ton: 'now',\n\t\t\tmethod: 'POST',\n\t\t\tdata: data,\n\t\t\tsuccessTest(response) {\n\t\t\t\treturn response !== undefined && Object.keys(response).length > 0 && response.success === true;\n\t\t\t},\n\t\t\tonSuccess(response) {\n\t\t\t\tif(settingName === 'queueId'){\n\t\t\t\t\t$('#queueId').val($(window[className].queueNameSelector).dropdown('get value'));\n\t\t\t\t}else if( settingName === 'adminUserId'){\n\t\t\t\t\twindow.location.href = window.location.href;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonFailure(response) {\n\t\t\t\tconsole.log(response);\n\t\t\t},\n\t\t\tonError(errorMessage, element, xhr) {\n\t\t\t\tconsole.log(errorMessage,xhr);\n\t\t\t}\n\t\t});\n\t},\n\texecuteCallAction(data) {\n\t\t$.api({\n\t\t\turl: window[className].executeCallUrl,\n\t\t\ton: 'now',\n\t\t\tmethod: 'POST',\n\t\t\tdata: data,\n\t\t\tsuccessTest(response) {\n\t\t\t\treturn response !== undefined && Object.keys(response).length > 0 && response.success === true;\n\t\t\t},\n\t\t\tonSuccess(response) {\n\t\t\t\tconsole.log(response);\n\t\t\t},\n\t\t\tonFailure(response) {\n\t\t\t\tconsole.log(response);\n\t\t\t},\n\t\t\tonError(errorMessage, element, xhr) {\n\t\t\t\tconsole.log(errorMessage,xhr);\n\t\t\t}\n\t\t});\n\t},\n\tupdateLines() {\n\t\t$.api({\n\t\t\turl: window[className].activeChannelsUrlV2,\n\t\t\ton: 'now',\n\t\t\tmethod: 'POST',\n\t\t\tsuccessTest(response) {\n\t\t\t\treturn response !== undefined && Object.keys(response).length > 0 && response.success === true;\n\t\t\t},\n\t\t\tonSuccess(response) {\n\t\t\t\twindow[className].$widgetQueues.updatedCallsFromResponse(response);\n\t\t\t\twindow[className].$callsWidget.updatedCallsFromResponse(response);\n\t\t\t},\n\t\t\tonFailure(response) {\n\t\t\t\tconsole.log(response);\n\t\t\t},\n\t\t\tonError(errorMessage, element, xhr) {\n\t\t\t\tconsole.log(errorMessage,xhr);\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * We can modify some data before form send\n\t * @param settings\n\t * @returns {*}\n\t */\n\tcbBeforeSendForm(settings) {\n\t\tconst result = settings;\n\t\tresult.data = window[className].$formObj.form('get values');\n\t\treturn result;\n\t},\n\t/**\n\t * Some actions after forms send\n\t */\n\tcbAfterSendForm() {\n\n\t},\n\t/**\n\t * Initialize form parameters\n\t */\n\tinitializeForm() {\n\t\tForm.$formObj = window[className].$formObj;\n\t\tForm.url = `${globalRootUrl}${idUrl}/save`;\n\t\tForm.validateRules = window[className].validateRules;\n\t\tForm.cbBeforeSendForm = window[className].cbBeforeSendForm;\n\t\tForm.cbAfterSendForm = window[className].cbAfterSendForm;\n\t\tForm.initialize();\n\t},\n};\n\n$(document).ready(() => {\n\twindow[className].initialize();\n});\n\n"],"mappings":"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","ignoreList":[]}
\ No newline at end of file
+{"version":3,"file":"module-monitor-active-calls-index.js","names":["idUrl","idForm","className","inputClassName","ModuleMonitorActiveCalls","isInit","queueNameSelector","$formObj","$","$checkBoxes","$dropDowns","activeChannelsUrl","globalRootUrl","activeChannelsUrlV2","executeCallUrl","saveUserActionUrl","$widget","undefined","validateRules","initialize","dropdown","onChange","value","text","$choice","window","onChangeSetting","val","userNumber","$widgetQueues","Vue","el","delimiters","methods","updatedCallsFromResponse","data","_this","queueNameEl","minWaitVisible","queues","queueId","id","name","number","agents","agentsList","buildAgentsList","calls","Array","isArray","allCalls","$nextTick","normalizeAgentCards","agentsObj","entries","Object","available","unavailable","_i","_entries","length","_entries$_i","_slicedToArray","agent","state","item","_objectSpread","push","concat","formatElapsedTime","enterTime","_this2","$el","artifacts","querySelectorAll","forEach","remove","ensureAgentCardsGridMasonry","cardsContainer","querySelector","style","alignItems","alignContent","cards","card","alignSelf","headers","fontSize","lineHeight","display","gap","whiteSpace","metas","numLabels","paddingTop","paddingBottom","flex","minWidth","maxWidth","overflow","textOverflow","names","requestAnimationFrame","layoutAgentCardsGridMasonry","adjustAgentCardsGap","container","from","tallCard","find","c","shortCard","ht","getBoundingClientRect","height","hs","Number","isFinite","Math","max","min","round","setProperty","adjustAgentCardsColumnCount","w","clientWidth","minCardWidth","cs","getComputedStyle","gapRaw","columnGap","getPropertyValue","gapPx","parseFloat","count","floor","String","_this3","styleId","styleEl","document","getElementById","createElement","head","appendChild","textContent","trim","classList","add","_agentCardsResizeBound","addEventListener","grid","rowHeight","rowGap","items","gridRowEnd","minHeight","tall","filter","short","h","span","ceil","apply","_toConsumableArray","map","g","shortH","tallH","effectiveGap","getSrcNumForAgent","agentNumber","result","answeredFound","_iterator","_createForOfIteratorHelper","_step","s","n","done","call","dst_num","src_num","calledChannels","match","ch","bridgeChannels","err","e","f","i","tmpCall","spyer","spy_num","exten","hasPeerPhone","phone","getPeerPhoneLabel","getPeerNameLabel","$callsWidget","fullAccess","callIsVisible","dst_chan","queueData","EnterTime","getWaitTime","formatTimestampToTime","timestamp","ts","ms","date","Date","hours","getHours","padStart","minutes","getMinutes","seconds","getSeconds","answer","now","secondToTime","start","getCallTime","queue","_data$calls","Extensions","updatePhonesRepresent","hangupAction","event","target","attr","parent","executeCallAction","action","ch1","ch2","joinAction","whisperAction","spChannel","listenAction","lines","checkbox","initializeForm","tab","removeClass","hide","updateLines","setInterval","diffSeconds","toString","settingName","_defineProperty","api","url","on","method","successTest","response","keys","success","onSuccess","location","href","onFailure","console","log","onError","errorMessage","element","xhr","cbBeforeSendForm","settings","form","cbAfterSendForm","Form","ready"],"sources":["src/module-monitor-active-calls-index.js"],"sourcesContent":["/*\n * Copyright (C) MIKO LLC - All Rights Reserved\n * Unauthorized copying of this file, via any medium is strictly prohibited\n * Proprietary and confidential\n * Written by Nikolay Beketov, 11 2018\n *\n */\nconst idUrl = 'module-monitor-active-calls';\nconst idForm = 'module-monitor-active-calls-form';\nconst className = 'ModuleMonitorActiveCalls';\nconst inputClassName = 'mikopbx-module-input';\n\n/* global $, globalRootUrl, globalTranslate, Form, Config, Vue, Extensions */\nconst ModuleMonitorActiveCalls = {\n\tisInit: true,\n\tqueueNameSelector: '#app-queue div.scrolling.dropdown',\n\t$formObj: $('#'+idForm),\n\t$checkBoxes: $('#'+idForm+' .ui.checkbox'),\n\t$dropDowns: $('#'+idForm+' .ui.dropdown'),\n\tactiveChannelsUrl: globalRootUrl + idUrl + \"/getActiveChannels\",\n\tactiveChannelsUrlV2: globalRootUrl + idUrl + \"/getActiveChannelsV2\",\n\texecuteCallUrl: globalRootUrl + idUrl + \"/executeCall\",\n\tsaveUserActionUrl: globalRootUrl + idUrl + \"/saveUser\",\n\t$widget: undefined,\n\n\t/**\n\t * Field validation rules\n\t * https://semantic-ui.com/behaviors/form.html\n\t */\n\tvalidateRules: {},\n\t/**\n\t * On page load we init some Semantic UI library\n\t */\n\tinitialize() {\n\t\t$(\"#nowUser.dropdown.enable\").dropdown({\n\t\t\tonChange: function onChange(value, text, $choice) {\n\t\t\t\twindow[className].onChangeSetting('adminUserId', value);\n\t\t\t}\n\t\t});\n\t\t$(\"#minWaitVisible.dropdown.enable\").dropdown({\n\t\t\tonChange: function onChange(value, text, $choice) {\n\t\t\t\t$('#minWaitVisibleValue').val(value);\n\t\t\t\twindow[className].onChangeSetting('minWaitVisible', value);\n\t\t\t}\n\t\t});\n\t\tlet userNumber = $('#userNumber').val();\n\n\t\twindow[className].$widgetQueues = new Vue({\n\t\t\tel: '#app-queue',\n\t\t\tdelimiters: [\"<%\",\"%>\"],\n\t\t\tmethods: {\n\t\t\t\tupdatedCallsFromResponse(data) {\n\t\t\t\t\tlet queueNameEl = $(window[className].queueNameSelector);\n\t\t\t\t\tthis.minWaitVisible = 1*$('#minWaitVisibleValue').val();\n\n\t\t\t\t\tthis.queues = data.queues;\n\t\t\t\t\tlet queueId = $('#queueId').val();\n\t\t\t\t\tif (queueId in data.queues) {\n\t\t\t\t\t\tthis.id = data.queues[queueId].id;\n\t\t\t\t\t\tthis.name = data.queues[queueId].name;\n\t\t\t\t\t\tthis.number = data.queues[queueId].number;\n\t\t\t\t\t\tthis.agents = data.queues[queueId].agents;\n\t\t\t\t\t\tthis.agentsList = this.buildAgentsList(this.agents);\n\t\t\t\t\t\tthis.calls = Array.isArray(data.queues[queueId].calls) ? data.queues[queueId].calls : [];\n\t\t\t\t\t\tthis.allCalls = data.calls;\n\t\t\t\t\t}else{\n\t\t\t\t\t\tthis.calls = [];\n\t\t\t\t\t\tthis.agentsList = [];\n\t\t\t\t\t}\n\t\t\t\t\tif(queueNameEl.dropdown('is hidden')){\n\t\t\t\t\t\tqueueNameEl.dropdown({\n\t\t\t\t\t\t\tonChange: function onChange(value, text, $choice) {\n\t\t\t\t\t\t\t\twindow[className].onChangeSetting('queueId', value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif(queueNameEl.dropdown('get value') === ''){\n\t\t\t\t\t\t\twindow[className].isInit = true;\n\t\t\t\t\t\t\tqueueNameEl.dropdown('set value', $('#queueId').val())\n\t\t\t\t\t\t\twindow[className].isInit = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Normalize Semantic UI Card typography after render\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tthis.normalizeAgentCards();\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tbuildAgentsList(agentsObj) {\n\t\t\t\t\tconst entries = Object.entries(agentsObj || {});\n\t\t\t\t\tconst available = [];\n\t\t\t\t\tconst unavailable = [];\n\t\t\t\t\tfor (const [number, agent] of entries) {\n\t\t\t\t\t\tconst state = agent?.state || '';\n\t\t\t\t\t\tconst item = { number, ...agent };\n\t\t\t\t\t\tif (state === 'Unavailable') {\n\t\t\t\t\t\t\tunavailable.push(item);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tavailable.push(item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn available.concat(unavailable);\n\t\t\t\t},\n\t\t\t\tformatElapsedTime(enterTime) {\n\t\t\t\t\treturn window[className].formatElapsedTime(enterTime);\n\t\t\t\t},\n\t\t\t\tnormalizeAgentCards() {\n\t\t\t\t\tif (!this.$el) return;\n\n\t\t\t\t\t// Cleanup artifacts from previous experiments (placeholders/spacers).\n\t\t\t\t\tconst artifacts = this.$el.querySelectorAll('.agent-peer-placeholder, .agent-peer-spacer');\n\t\t\t\t\tartifacts.forEach((el) => el.remove());\n\n\t\t\t\t\t// Dense layout (masonry) that still fills left-to-right:\n\t\t\t\t\t// flex-wrap can't place items into vertical gaps under tall cards.\n\t\t\t\t\tthis.ensureAgentCardsGridMasonry();\n\n\t\t\t\t\t// Prevent \"equal height\" cards in one row (Semantic UI cards are flex).\n\t\t\t\t\tconst cardsContainer = this.$el.querySelector('.ui.cards.agent-cards');\n\t\t\t\t\tif (cardsContainer) {\n\t\t\t\t\t\tcardsContainer.style.alignItems = 'flex-start';\n\t\t\t\t\t\tcardsContainer.style.alignContent = 'flex-start';\n\t\t\t\t\t}\n\n\t\t\t\t\tconst cards = this.$el.querySelectorAll('.ui.cards.agent-cards > .ui.card.agent-card');\n\t\t\t\t\tcards.forEach((card) => {\n\t\t\t\t\t\tcard.style.alignSelf = 'flex-start';\n\t\t\t\t\t});\n\n\t\t\t\t\t// Semantic UI makes .header bigger than normal text; we need same font size.\n\t\t\t\t\tconst headers = this.$el.querySelectorAll('.ui.card.agent-card .header.agent-card-header');\n\t\t\t\t\theaders.forEach((el) => {\n\t\t\t\t\t\tel.style.fontSize = '1em';\n\t\t\t\t\t\tel.style.lineHeight = '1.2';\n\t\t\t\t\t\tel.style.display = 'flex';\n\t\t\t\t\t\tel.style.alignItems = 'center';\n\t\t\t\t\t\tel.style.gap = '0.5em';\n\t\t\t\t\t\tel.style.whiteSpace = 'nowrap';\n\t\t\t\t\t});\n\n\t\t\t\t\tconst metas = this.$el.querySelectorAll('.ui.card.agent-card .meta.agent-peer');\n\t\t\t\t\tmetas.forEach((el) => {\n\t\t\t\t\t\tel.style.fontSize = '1em';\n\t\t\t\t\t\tel.style.lineHeight = '1.2';\n\t\t\t\t\t});\n\n\t\t\t\t\t// Normalize label/name typography so they have same text height.\n\t\t\t\t\tconst numLabels = this.$el.querySelectorAll('.ui.card.agent-card .agent-num-label');\n\t\t\t\t\tnumLabels.forEach((el) => {\n\t\t\t\t\t\tel.style.fontSize = '1em';\n\t\t\t\t\t\tel.style.lineHeight = '1.2';\n\t\t\t\t\t\tel.style.display = 'inline-flex';\n\t\t\t\t\t\tel.style.alignItems = 'center';\n\t\t\t\t\t\tel.style.paddingTop = '0';\n\t\t\t\t\t\tel.style.paddingBottom = '0';\n\t\t\t\t\t\t// Allow label to shrink (otherwise long numbers force card wider than 180px)\n\t\t\t\t\t\tel.style.flex = '0 1 auto';\n\t\t\t\t\t\tel.style.minWidth = '0';\n\t\t\t\t\t\tel.style.maxWidth = '14ch';\n\t\t\t\t\t\tel.style.overflow = 'hidden';\n\t\t\t\t\t\tel.style.textOverflow = 'ellipsis';\n\t\t\t\t\t\tel.style.whiteSpace = 'nowrap';\n\t\t\t\t\t});\n\t\t\t\t\tconst names = this.$el.querySelectorAll('.ui.card.agent-card .agent-name');\n\t\t\t\t\tnames.forEach((el) => {\n\t\t\t\t\t\tel.style.lineHeight = '1.2';\n\t\t\t\t\t\t// Ellipsis for long names (e.g. \"Салтыков-Щедрин\")\n\t\t\t\t\t\tel.style.minWidth = '0';\n\t\t\t\t\t\tel.style.flex = '1 1 auto';\n\t\t\t\t\t\tel.style.overflow = 'hidden';\n\t\t\t\t\t\tel.style.textOverflow = 'ellipsis';\n\t\t\t\t\t\tel.style.whiteSpace = 'nowrap';\n\t\t\t\t\t});\n\n\t\t\t\t\t// Grid masonry needs row-span calculation after layout.\n\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\t\tthis.layoutAgentCardsGridMasonry();\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tadjustAgentCardsGap() {\n\t\t\t\t\tif (!this.$el) return;\n\t\t\t\t\tconst container = this.$el.querySelector('.ui.cards.agent-cards');\n\t\t\t\t\tif (!container) return;\n\n\t\t\t\t\tconst cards = Array.from(container.querySelectorAll('.ui.card.agent-card'));\n\t\t\t\t\tif (!cards.length) return;\n\n\t\t\t\t\tconst tallCard = cards.find((c) => c.querySelector('.meta.agent-peer'));\n\t\t\t\t\tconst shortCard = cards.find((c) => !c.querySelector('.meta.agent-peer'));\n\t\t\t\t\tif (!tallCard || !shortCard) return;\n\n\t\t\t\t\tconst ht = tallCard.getBoundingClientRect().height;\n\t\t\t\t\tconst hs = shortCard.getBoundingClientRect().height;\n\t\t\t\t\tif (!ht || !hs) return;\n\n\t\t\t\t\t// From 2*(hs+g) = ht+g => g = ht - 2*hs\n\t\t\t\t\tlet gap = ht - 2 * hs;\n\t\t\t\t\tif (!Number.isFinite(gap)) return;\n\n\t\t\t\t\t// Clamp to sane range; negative means \"no extra gap needed\".\n\t\t\t\t\tgap = Math.max(0, Math.min(20, Math.round(gap)));\n\n\t\t\t\t\tcontainer.style.setProperty('--agent-card-gap', `${gap}px`);\n\t\t\t\t},\n\t\t\t\tadjustAgentCardsColumnCount() {\n\t\t\t\t\tif (!this.$el) return;\n\t\t\t\t\tconst container = this.$el.querySelector('.ui.cards.agent-cards.agent-cards-masonry');\n\t\t\t\t\tif (!container) return;\n\n\t\t\t\t\tconst w = container.clientWidth;\n\t\t\t\t\tif (!w) return;\n\n\t\t\t\t\t// Minimum acceptable card width in px (tune if needed)\n\t\t\t\t\tconst minCardWidth = 150;\n\n\t\t\t\t\tconst cs = window.getComputedStyle(container);\n\t\t\t\t\tconst gapRaw = cs.columnGap || cs.getPropertyValue('column-gap') || '16px';\n\t\t\t\t\tconst gapPx = parseFloat(gapRaw) || 16;\n\n\t\t\t\t\tconst count = Math.max(1, Math.min(12, Math.floor((w + gapPx) / (minCardWidth + gapPx))));\n\t\t\t\t\tcontainer.style.setProperty('--agent-card-col-count', String(count));\n\t\t\t\t},\n\t\t\t\tensureAgentCardsGridMasonry() {\n\t\t\t\t\tconst styleId = 'agent-cards-layout-style';\n\t\t\t\t\tlet styleEl = document.getElementById(styleId);\n\t\t\t\t\tif (!styleEl) {\n\t\t\t\t\t\tstyleEl = document.createElement('style');\n\t\t\t\t\t\tstyleEl.id = styleId;\n\t\t\t\t\t\tdocument.head.appendChild(styleEl);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Grid masonry: fills left-to-right and can pack items into gaps.\n\t\t\t\t\tstyleEl.textContent = `\n.ui.cards.agent-cards.agent-cards-grid {\n display: grid !important;\n grid-template-columns: repeat(auto-fill, 240px);\n justify-content: start;\n gap: var(--agent-card-gap, 8px);\n grid-auto-rows: 1px;\n /* Prevent overlap with the legend block below */\n margin-bottom: 1em !important;\n}\n.ui.cards.agent-cards.agent-cards-grid > .ui.card.agent-card {\n width: 240px !important;\n margin: 0 !important;\n overflow: hidden;\n /* reset from previous layouts */\n align-self: start;\n}\n\t\t\t\t\t`.trim();\n\n\t\t\t\t\tconst cardsContainer = this.$el && this.$el.querySelector\n\t\t\t\t\t\t? this.$el.querySelector('.ui.cards.agent-cards')\n\t\t\t\t\t\t: null;\n\t\t\t\t\tif (cardsContainer) {\n\t\t\t\t\t\tcardsContainer.classList.remove('agent-cards-masonry');\n\t\t\t\t\t\tcardsContainer.classList.remove('agent-cards-flex');\n\t\t\t\t\t\tcardsContainer.classList.add('agent-cards-grid');\n\n\t\t\t\t\t\t// Bind once: relayout on resize.\n\t\t\t\t\t\tif (!this._agentCardsResizeBound) {\n\t\t\t\t\t\t\tthis._agentCardsResizeBound = true;\n\t\t\t\t\t\t\twindow.addEventListener('resize', () => {\n\t\t\t\t\t\t\t\tthis.layoutAgentCardsGridMasonry();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tlayoutAgentCardsGridMasonry() {\n\t\t\t\t\tif (!this.$el) return;\n\t\t\t\t\tconst grid = this.$el.querySelector('.ui.cards.agent-cards.agent-cards-grid');\n\t\t\t\t\tif (!grid) return;\n\n\t\t\t\t\tconst cs = window.getComputedStyle(grid);\n\t\t\t\t\tconst rowHeight = parseFloat(cs.getPropertyValue('grid-auto-rows')) || 1;\n\t\t\t\t\tconst rowGap = parseFloat(cs.getPropertyValue('row-gap')) || parseFloat(cs.getPropertyValue('gap')) || 8;\n\n\t\t\t\t\tconst items = Array.from(grid.querySelectorAll('.ui.card.agent-card'));\n\t\t\t\t\tif (!items.length) return;\n\n\t\t\t\t\t// Reset row spans and min-heights to measure natural heights.\n\t\t\t\t\titems.forEach((item) => {\n\t\t\t\t\t\titem.style.gridRowEnd = '';\n\t\t\t\t\t\titem.style.minHeight = '';\n\t\t\t\t\t});\n\n\t\t\t\t\tconst tall = items.filter((c) => c.querySelector('.meta.agent-peer'));\n\t\t\t\t\tconst short = items.filter((c) => !c.querySelector('.meta.agent-peer'));\n\n\t\t\t\t\t// If we don't have both types, just do normal masonry spans.\n\t\t\t\t\tif (!tall.length || !short.length) {\n\t\t\t\t\t\titems.forEach((item) => {\n\t\t\t\t\t\t\tconst h = item.getBoundingClientRect().height;\n\t\t\t\t\t\t\tconst span = Math.max(1, Math.ceil((h + rowGap) / (rowHeight + rowGap)));\n\t\t\t\t\t\t\titem.style.gridRowEnd = `span ${span}`;\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst hs = Math.max(...short.map((c) => c.getBoundingClientRect().height));\n\t\t\t\t\tconst ht = Math.max(...tall.map((c) => c.getBoundingClientRect().height));\n\n\t\t\t\t\t// Want: 2*(hs + g) = (ht + g) => g = ht - 2*hs\n\t\t\t\t\tlet g = ht - 2 * hs;\n\t\t\t\t\tif (!Number.isFinite(g)) g = rowGap;\n\t\t\t\t\tg = Math.max(0, Math.min(24, Math.round(g)));\n\n\t\t\t\t\t// Apply gap and enforce min-heights so the relation holds visually.\n\t\t\t\t\tgrid.style.setProperty('--agent-card-gap', `${g}px`);\n\n\t\t\t\t\tconst shortH = Math.round(hs);\n\t\t\t\t\tconst tallH = Math.round(Math.max(ht, 2 * hs + g));\n\t\t\t\t\tshort.forEach((c) => { c.style.minHeight = `${shortH}px`; });\n\t\t\t\t\ttall.forEach((c) => { c.style.minHeight = `${tallH}px`; });\n\n\t\t\t\t\t// Now compute row spans from final rendered heights.\n\t\t\t\t\tconst effectiveGap = g;\n\t\t\t\t\titems.forEach((item) => {\n\t\t\t\t\t\tconst h = item.getBoundingClientRect().height;\n\t\t\t\t\t\tconst span = Math.max(1, Math.ceil((h + effectiveGap) / (rowHeight + effectiveGap)));\n\t\t\t\t\t\titem.style.gridRowEnd = `span ${span}`;\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tgetSrcNumForAgent(agentNumber) {\n\t\t\t\t\tlet result = '-';\n\t\t\t\t\tlet answeredFound = false;\n\t\t\t\t\tfor (const call of this.calls) {\n\t\t\t\t\t\tif(call.dst_num === agentNumber){\n\t\t\t\t\t\t\tansweredFound = true;\n\t\t\t\t\t\t\tresult = call.src_num;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (call.calledChannels && Array.isArray(call.calledChannels)) {\n\t\t\t\t\t\t\tconst match = call.calledChannels.find(ch => ch.number === agentNumber);\n\t\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\t\tresult = call.src_num;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (call.bridgeChannels && Array.isArray(call.bridgeChannels)) {\n\t\t\t\t\t\t\tconst match = call.bridgeChannels.find(ch => (ch.src_num === agentNumber || ch.dst_num === agentNumber));\n\t\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\t\tif(match.src_num === agentNumber){\n\t\t\t\t\t\t\t\t\tresult = match.dst_num;\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\tresult = match.src_num;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tansweredFound = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(answeredFound === false){\n\t\t\t\t\t\tfor (let i = 0; i < this.allCalls.length; i++) {\n\t\t\t\t\t\t\tconst tmpCall = this.allCalls[i];\n\t\t\t\t\t\t\tif(tmpCall.src_num === agentNumber){\n\t\t\t\t\t\t\t\t// Исходящий\n\t\t\t\t\t\t\t\tif(tmpCall.dst_num === ''){\n\t\t\t\t\t\t\t\t\t// не ответа, дозвон.\n\t\t\t\t\t\t\t\t\tif (tmpCall.calledChannels && Array.isArray(tmpCall.calledChannels) && tmpCall.calledChannels.length) {\n\t\t\t\t\t\t\t\t\t\tconst match = tmpCall.calledChannels.find(ch => ch.number !== agentNumber);\n\t\t\t\t\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\t\t\t\t\tresult = match.number;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}else if(tmpCall.spyer){\n\t\t\t\t\t\t\t\t\t\t// шпионит за номером.\n\t\t\t\t\t\t\t\t\t\tresult = tmpCall.spy_num;\n\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t// нет вызываемых каналов, возможно это вызов на приложение / ivr.\n\t\t\t\t\t\t\t\t\t\tresult = tmpCall.exten;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\tresult = tmpCall.dst_num;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}else if(tmpCall.dst_num === agentNumber){\n\t\t\t\t\t\t\t\t// Входящий на агента, отвечен.\n\t\t\t\t\t\t\t\tresult = tmpCall.src_num;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\tif (tmpCall.calledChannels && Array.isArray(tmpCall.calledChannels)) {\n\t\t\t\t\t\t\t\t\tconst match = tmpCall.calledChannels.find(ch => ch.number === agentNumber);\n\t\t\t\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\t\t\t\tresult = tmpCall.src_num;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t},\n\t\t\t\thasPeerPhone(agentNumber) {\n\t\t\t\t\tconst phone = String(this.getSrcNumForAgent(agentNumber) || '').trim();\n\t\t\t\t\treturn phone !== '' && phone !== '-' && phone !== '—';\n\t\t\t\t},\n\t\t\t\tgetPeerPhoneLabel(agentNumber) {\n\t\t\t\t\tconst phone = String(this.getSrcNumForAgent(agentNumber) || '').trim();\n\t\t\t\t\treturn this.hasPeerPhone(agentNumber) ? phone : '—';\n\t\t\t\t},\n\t\t\t\tgetPeerNameLabel(agentNumber) {\n\t\t\t\t\t// Placeholder for future \"peer name\" feature\n\t\t\t\t\tvoid agentNumber;\n\t\t\t\t\treturn '—';\n\t\t\t\t}\n\t\t\t},\n\t\t\tdata: {\n\t\t\t\t\"minWaitVisible\": 30,\n\t\t\t\t\"name\": \"\",\n\t\t\t\t\"number\": \"\",\n\t\t\t\t\"queues\": [],\n\t\t\t\t\"agents\": {\n\t\t\t\t},\n\t\t\t\t\"agentsList\": [],\n\t\t\t\t\"calls\": [\n\t\t\t\t]\n\t\t\t},\n\t\t});\n\n\t\twindow[className].$callsWidget = new Vue({\n\t\t\tel: '#calls',\n\t\t\tdelimiters: [\"<%\",\"%>\"],\n\t\t\tdata: {\n\t\t\t\t\"minWaitVisible\": 30,\n\t\t\t\tuserNumber: userNumber,\n\t\t\t\tfullAccess: ($('#fullAccess').val() === \"1\" || userNumber === ''),\n\t\t\t\tcalls: [\n\t\t\t\t]\n\t\t\t},\n\t\t\tmethods: {\n\t\t\t\tcallIsVisible(call){\n\t\t\t\t\tif(call.dst_chan==='' && call.queueData.EnterTime !== undefined ){\n\t\t\t\t\t\treturn this.minWaitVisible <= this.getWaitTime(call);\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t\tformatTimestampToTime(timestamp) {\n\t\t\t\t\t// Если timestamp строка — приводим к числу\n\t\t\t\t\tconst ts = typeof timestamp === 'string' ? parseFloat(timestamp) : timestamp;\n\n\t\t\t\t\t// Если timestamp в секундах (меньше 1e10), умножаем на 1000\n\t\t\t\t\tconst ms = ts < 1e10 ? ts * 1000 : ts;\n\n\t\t\t\t\tconst date = new Date(ms);\n\n\t\t\t\t\tconst hours = String(date.getHours()).padStart(2, '0');\n\t\t\t\t\tconst minutes = String(date.getMinutes()).padStart(2, '0');\n\t\t\t\t\tconst seconds = String(date.getSeconds()).padStart(2, '0');\n\n\t\t\t\t\treturn `${hours}:${minutes}:${seconds}`;\n\t\t\t\t},\n\t\t\t\tgetWaitTime(call){\n\t\t\t\t\tlet answer = Math.floor(Date.now() / 1000);\n\t\t\t\t\tif(call.answer !== ''){\n\t\t\t\t\t\tanswer = call.answer\n\t\t\t\t\t}\n\t\t\t\t\treturn window[className].secondToTime(answer - call.start);\n\t\t\t\t},\n\t\t\t\tgetCallTime(call){\n\t\t\t\t\tif(call.answer === ''){\n\t\t\t\t\t\treturn '-';\n\t\t\t\t\t}\n\t\t\t\t\treturn window[className].formatElapsedTime(call.answer);\n\t\t\t\t},\n\t\t\t\tupdatedCallsFromResponse(data) {\n\t\t\t\t\tthis.minWaitVisible = 1*$('#minWaitVisibleValue').val();\n\t\t\t\t\t// Проходим по всем очередям\n\t\t\t\t\tfor (const queueId in data.queues) {\n\t\t\t\t\t\tconst queue = data.queues[queueId];\n\t\t\t\t\t\t// Проверяем, есть ли у очереди поле calls и является ли оно массивом\n\t\t\t\t\t\tif (Array.isArray(queue.calls)) {\n\t\t\t\t\t\t\t// Добавляем все вызовы из этой очереди в общий массив\n\t\t\t\t\t\t\tdata.calls.push(...queue.calls);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.calls = data.calls;\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tExtensions.updatePhonesRepresent('need-update');\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tformatElapsedTime(enterTime) {\n\t\t\t\t\treturn window[className].formatElapsedTime(enterTime);\n\t\t\t\t},\n\t\t\t\thangupAction(event) {\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'hangup', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2')});\n\t\t\t\t},\n\t\t\t\tjoinAction(event) {\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'join', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2'), number: this.userNumber});\n\t\t\t\t},\n\t\t\t\twhisperAction(event){\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlet spChannel = target.attr('data-ch1');\n\t\t\t\t\tif('incoming' === target.attr('data-call-type')){\n\t\t\t\t\t\tspChannel = target.attr('data-ch2');\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'whisper', ch1: spChannel, ch2: '', number: this.userNumber});\n\t\t\t\t},\n\t\t\t\tlistenAction(event){\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'listen', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2'), number: this.userNumber});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\twindow[className].$widget = new Vue({\n\t\t\tel: '#app',\n\t\t\tdelimiters: [\"<%\",\"%>\"],\n\t\t\tdata: {\n\t\t\t\tuserNumber: userNumber,\n\t\t\t\tfullAccess: ($('#fullAccess').val() === \"1\" || userNumber === ''),\n\t\t\t\tcalls: [\n\t\t\t\t]\n\t\t\t},\n\t\t\tmethods: {\n\t\t\t\tupdatedCallsFromResponse(lines) {\n\t\t\t\t\tthis.calls = lines;\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tExtensions.updatePhonesRepresent('need-update');\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\thangupAction(event) {\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'hangup', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2')});\n\t\t\t\t},\n\t\t\t\tjoinAction(event) {\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'join', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2'), number: this.userNumber});\n\t\t\t\t},\n\t\t\t\twhisperAction(event){\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlet spChannel = target.attr('data-ch1');\n\t\t\t\t\tif('incoming' === target.attr('data-call-type')){\n\t\t\t\t\t\tspChannel = target.attr('data-ch2');\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'whisper', ch1: spChannel, ch2: '', number: this.userNumber});\n\t\t\t\t},\n\t\t\t\tlistenAction(event){\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'listen', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2'), number: this.userNumber});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\twindow[className].$checkBoxes.checkbox();\n\t\twindow[className].$dropDowns.dropdown();\n\t\twindow[className].initializeForm();\n\t\t$('.menu .item').tab();\n\t\t//////\n\t\t// Удаляем отступы контейнера.\n\t\t$('#main-content-container').removeClass('container');\n\t\t$('#module-status-toggle-segment').hide();\n\t\t$('.ui.clearing.hidden.divider').remove();\n\t\t// Окончание форматирования базовой страницы\n\t\t//////\n\t\twindow[className].updateLines();\n\t\tsetInterval(window[className].updateLines, 2000);\n\t},\n\tformatElapsedTime(enterTime) {\n\t\tif (!enterTime) return '—';\n\n\t\tconst now = Math.floor(Date.now() / 1000);\n\t\tconst diffSeconds = now - enterTime;\n\n\t\treturn window[className].secondToTime(diffSeconds);\n\t},\n\tsecondToTime(diffSeconds){\n\t\tif (diffSeconds < 0) return '0';\n\t\t// Форматируем: чч:мм:сс или мм:сс, или просто секунды\n\t\tconst hours = Math.floor(diffSeconds / 3600);\n\t\tconst minutes = Math.floor((diffSeconds % 3600) / 60);\n\t\tconst seconds = Math.round(diffSeconds % 60);\n\t\tif (hours > 0) {\n\t\t\treturn `${hours}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n\t\t} else if (minutes > 0) {\n\t\t\treturn `${minutes}:${seconds.toString().padStart(2, '0')}`;\n\t\t} else {\n\t\t\treturn `${seconds}`;\n\t\t}\n\t},\n\tonChangeSetting(settingName, value) {\n\t\tif(window[className].isInit){\n\t\t\treturn;\n\t\t}\n\t\tlet data = {\n\t\t\t[settingName]: value\n\t\t};\n\t\t$.api({\n\t\t\turl: window[className].saveUserActionUrl,\n\t\t\ton: 'now',\n\t\t\tmethod: 'POST',\n\t\t\tdata: data,\n\t\t\tsuccessTest(response) {\n\t\t\t\treturn response !== undefined && Object.keys(response).length > 0 && response.success === true;\n\t\t\t},\n\t\t\tonSuccess(response) {\n\t\t\t\tif(settingName === 'queueId'){\n\t\t\t\t\t$('#queueId').val($(window[className].queueNameSelector).dropdown('get value'));\n\t\t\t\t}else if( settingName === 'adminUserId'){\n\t\t\t\t\twindow.location.href = window.location.href;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonFailure(response) {\n\t\t\t\tconsole.log(response);\n\t\t\t},\n\t\t\tonError(errorMessage, element, xhr) {\n\t\t\t\tconsole.log(errorMessage,xhr);\n\t\t\t}\n\t\t});\n\t},\n\texecuteCallAction(data) {\n\t\t$.api({\n\t\t\turl: window[className].executeCallUrl,\n\t\t\ton: 'now',\n\t\t\tmethod: 'POST',\n\t\t\tdata: data,\n\t\t\tsuccessTest(response) {\n\t\t\t\treturn response !== undefined && Object.keys(response).length > 0 && response.success === true;\n\t\t\t},\n\t\t\tonSuccess(response) {\n\t\t\t\tconsole.log(response);\n\t\t\t},\n\t\t\tonFailure(response) {\n\t\t\t\tconsole.log(response);\n\t\t\t},\n\t\t\tonError(errorMessage, element, xhr) {\n\t\t\t\tconsole.log(errorMessage,xhr);\n\t\t\t}\n\t\t});\n\t},\n\tupdateLines() {\n\t\t$.api({\n\t\t\turl: window[className].activeChannelsUrlV2,\n\t\t\ton: 'now',\n\t\t\tmethod: 'POST',\n\t\t\tsuccessTest(response) {\n\t\t\t\treturn response !== undefined && Object.keys(response).length > 0 && response.success === true;\n\t\t\t},\n\t\t\tonSuccess(response) {\n\t\t\t\twindow[className].$widgetQueues.updatedCallsFromResponse(response);\n\t\t\t\twindow[className].$callsWidget.updatedCallsFromResponse(response);\n\t\t\t},\n\t\t\tonFailure(response) {\n\t\t\t\tconsole.log(response);\n\t\t\t},\n\t\t\tonError(errorMessage, element, xhr) {\n\t\t\t\tconsole.log(errorMessage,xhr);\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * We can modify some data before form send\n\t * @param settings\n\t * @returns {*}\n\t */\n\tcbBeforeSendForm(settings) {\n\t\tconst result = settings;\n\t\tresult.data = window[className].$formObj.form('get values');\n\t\treturn result;\n\t},\n\t/**\n\t * Some actions after forms send\n\t */\n\tcbAfterSendForm() {\n\n\t},\n\t/**\n\t * Initialize form parameters\n\t */\n\tinitializeForm() {\n\t\tForm.$formObj = window[className].$formObj;\n\t\tForm.url = `${globalRootUrl}${idUrl}/save`;\n\t\tForm.validateRules = window[className].validateRules;\n\t\tForm.cbBeforeSendForm = window[className].cbBeforeSendForm;\n\t\tForm.cbAfterSendForm = window[className].cbAfterSendForm;\n\t\tForm.initialize();\n\t},\n};\n\n$(document).ready(() => {\n\twindow[className].initialize();\n});\n\n"],"mappings":"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","ignoreList":[]}
\ No newline at end of file
diff --git a/public/assets/js/src/module-monitor-active-calls-index.js b/public/assets/js/src/module-monitor-active-calls-index.js
index f294c52..47d2e97 100644
--- a/public/assets/js/src/module-monitor-active-calls-index.js
+++ b/public/assets/js/src/module-monitor-active-calls-index.js
@@ -60,10 +60,12 @@ const ModuleMonitorActiveCalls = {
this.name = data.queues[queueId].name;
this.number = data.queues[queueId].number;
this.agents = data.queues[queueId].agents;
+ this.agentsList = this.buildAgentsList(this.agents);
this.calls = Array.isArray(data.queues[queueId].calls) ? data.queues[queueId].calls : [];
this.allCalls = data.calls;
}else{
this.calls = [];
+ this.agentsList = [];
}
if(queueNameEl.dropdown('is hidden')){
queueNameEl.dropdown({
@@ -83,6 +85,21 @@ const ModuleMonitorActiveCalls = {
this.normalizeAgentCards();
});
},
+ buildAgentsList(agentsObj) {
+ const entries = Object.entries(agentsObj || {});
+ const available = [];
+ const unavailable = [];
+ for (const [number, agent] of entries) {
+ const state = agent?.state || '';
+ const item = { number, ...agent };
+ if (state === 'Unavailable') {
+ unavailable.push(item);
+ } else {
+ available.push(item);
+ }
+ }
+ return available.concat(unavailable);
+ },
formatElapsedTime(enterTime) {
return window[className].formatElapsedTime(enterTime);
},
@@ -93,9 +110,9 @@ const ModuleMonitorActiveCalls = {
const artifacts = this.$el.querySelectorAll('.agent-peer-placeholder, .agent-peer-spacer');
artifacts.forEach((el) => el.remove());
- // Masonry-like layout via CSS columns to avoid empty gaps with different card heights.
- // We inject styles here because this project restricts edits to /public/assets/js/src/.
- this.ensureAgentCardsMasonry();
+ // Dense layout (masonry) that still fills left-to-right:
+ // flex-wrap can't place items into vertical gaps under tall cards.
+ this.ensureAgentCardsGridMasonry();
// Prevent "equal height" cards in one row (Semantic UI cards are flex).
const cardsContainer = this.$el.querySelector('.ui.cards.agent-cards');
@@ -114,6 +131,10 @@ const ModuleMonitorActiveCalls = {
headers.forEach((el) => {
el.style.fontSize = '1em';
el.style.lineHeight = '1.2';
+ el.style.display = 'flex';
+ el.style.alignItems = 'center';
+ el.style.gap = '0.5em';
+ el.style.whiteSpace = 'nowrap';
});
const metas = this.$el.querySelectorAll('.ui.card.agent-card .meta.agent-peer');
@@ -131,18 +152,31 @@ const ModuleMonitorActiveCalls = {
el.style.alignItems = 'center';
el.style.paddingTop = '0';
el.style.paddingBottom = '0';
+ // Allow label to shrink (otherwise long numbers force card wider than 180px)
+ el.style.flex = '0 1 auto';
+ el.style.minWidth = '0';
+ el.style.maxWidth = '14ch';
+ el.style.overflow = 'hidden';
+ el.style.textOverflow = 'ellipsis';
+ el.style.whiteSpace = 'nowrap';
});
const names = this.$el.querySelectorAll('.ui.card.agent-card .agent-name');
names.forEach((el) => {
el.style.lineHeight = '1.2';
- el.style.display = 'inline-flex';
- el.style.alignItems = 'center';
+ // Ellipsis for long names (e.g. "Салтыков-Щедрин")
+ el.style.minWidth = '0';
+ el.style.flex = '1 1 auto';
+ el.style.overflow = 'hidden';
+ el.style.textOverflow = 'ellipsis';
+ el.style.whiteSpace = 'nowrap';
});
- // Tune vertical gap between cards so that:
- // 2 * (shortCardHeight + gap) ~= (tallCardHeight + gap)
- // This makes the masonry columns visually "grid-like".
- this.adjustAgentCardsGap();
+ // Grid masonry needs row-span calculation after layout.
+ requestAnimationFrame(() => {
+ requestAnimationFrame(() => {
+ this.layoutAgentCardsGridMasonry();
+ });
+ });
},
adjustAgentCardsGap() {
if (!this.$el) return;
@@ -169,40 +203,125 @@ const ModuleMonitorActiveCalls = {
container.style.setProperty('--agent-card-gap', `${gap}px`);
},
- ensureAgentCardsMasonry() {
- const styleId = 'agent-cards-masonry-style';
- if (!document.getElementById(styleId)) {
- const styleEl = document.createElement('style');
+ adjustAgentCardsColumnCount() {
+ if (!this.$el) return;
+ const container = this.$el.querySelector('.ui.cards.agent-cards.agent-cards-masonry');
+ if (!container) return;
+
+ const w = container.clientWidth;
+ if (!w) return;
+
+ // Minimum acceptable card width in px (tune if needed)
+ const minCardWidth = 150;
+
+ const cs = window.getComputedStyle(container);
+ const gapRaw = cs.columnGap || cs.getPropertyValue('column-gap') || '16px';
+ const gapPx = parseFloat(gapRaw) || 16;
+
+ const count = Math.max(1, Math.min(12, Math.floor((w + gapPx) / (minCardWidth + gapPx))));
+ container.style.setProperty('--agent-card-col-count', String(count));
+ },
+ ensureAgentCardsGridMasonry() {
+ const styleId = 'agent-cards-layout-style';
+ let styleEl = document.getElementById(styleId);
+ if (!styleEl) {
+ styleEl = document.createElement('style');
styleEl.id = styleId;
- styleEl.textContent = `
-/* Masonry layout for agents cards (scoped) */
-.ui.cards.agent-cards.agent-cards-masonry {
- display: block !important;
- column-width: 240px;
- column-gap: 1em;
+ document.head.appendChild(styleEl);
+ }
+
+ // Grid masonry: fills left-to-right and can pack items into gaps.
+ styleEl.textContent = `
+.ui.cards.agent-cards.agent-cards-grid {
+ display: grid !important;
+ grid-template-columns: repeat(auto-fill, 240px);
+ justify-content: start;
+ gap: var(--agent-card-gap, 8px);
+ grid-auto-rows: 1px;
/* Prevent overlap with the legend block below */
margin-bottom: 1em !important;
- padding-bottom: 0.5em !important;
}
-.ui.cards.agent-cards.agent-cards-masonry > .ui.card.agent-card {
- display: inline-block !important;
- width: 100% !important;
- margin: 0 0 var(--agent-card-gap, 12px) 0 !important;
- break-inside: avoid;
- -webkit-column-break-inside: avoid;
- page-break-inside: avoid;
+.ui.cards.agent-cards.agent-cards-grid > .ui.card.agent-card {
+ width: 240px !important;
+ margin: 0 !important;
+ overflow: hidden;
+ /* reset from previous layouts */
+ align-self: start;
}
- `.trim();
- document.head.appendChild(styleEl);
- }
+ `.trim();
const cardsContainer = this.$el && this.$el.querySelector
? this.$el.querySelector('.ui.cards.agent-cards')
: null;
if (cardsContainer) {
- cardsContainer.classList.add('agent-cards-masonry');
+ cardsContainer.classList.remove('agent-cards-masonry');
+ cardsContainer.classList.remove('agent-cards-flex');
+ cardsContainer.classList.add('agent-cards-grid');
+
+ // Bind once: relayout on resize.
+ if (!this._agentCardsResizeBound) {
+ this._agentCardsResizeBound = true;
+ window.addEventListener('resize', () => {
+ this.layoutAgentCardsGridMasonry();
+ });
+ }
}
},
+ layoutAgentCardsGridMasonry() {
+ if (!this.$el) return;
+ const grid = this.$el.querySelector('.ui.cards.agent-cards.agent-cards-grid');
+ if (!grid) return;
+
+ const cs = window.getComputedStyle(grid);
+ const rowHeight = parseFloat(cs.getPropertyValue('grid-auto-rows')) || 1;
+ const rowGap = parseFloat(cs.getPropertyValue('row-gap')) || parseFloat(cs.getPropertyValue('gap')) || 8;
+
+ const items = Array.from(grid.querySelectorAll('.ui.card.agent-card'));
+ if (!items.length) return;
+
+ // Reset row spans and min-heights to measure natural heights.
+ items.forEach((item) => {
+ item.style.gridRowEnd = '';
+ item.style.minHeight = '';
+ });
+
+ const tall = items.filter((c) => c.querySelector('.meta.agent-peer'));
+ const short = items.filter((c) => !c.querySelector('.meta.agent-peer'));
+
+ // If we don't have both types, just do normal masonry spans.
+ if (!tall.length || !short.length) {
+ items.forEach((item) => {
+ const h = item.getBoundingClientRect().height;
+ const span = Math.max(1, Math.ceil((h + rowGap) / (rowHeight + rowGap)));
+ item.style.gridRowEnd = `span ${span}`;
+ });
+ return;
+ }
+
+ const hs = Math.max(...short.map((c) => c.getBoundingClientRect().height));
+ const ht = Math.max(...tall.map((c) => c.getBoundingClientRect().height));
+
+ // Want: 2*(hs + g) = (ht + g) => g = ht - 2*hs
+ let g = ht - 2 * hs;
+ if (!Number.isFinite(g)) g = rowGap;
+ g = Math.max(0, Math.min(24, Math.round(g)));
+
+ // Apply gap and enforce min-heights so the relation holds visually.
+ grid.style.setProperty('--agent-card-gap', `${g}px`);
+
+ const shortH = Math.round(hs);
+ const tallH = Math.round(Math.max(ht, 2 * hs + g));
+ short.forEach((c) => { c.style.minHeight = `${shortH}px`; });
+ tall.forEach((c) => { c.style.minHeight = `${tallH}px`; });
+
+ // Now compute row spans from final rendered heights.
+ const effectiveGap = g;
+ items.forEach((item) => {
+ const h = item.getBoundingClientRect().height;
+ const span = Math.max(1, Math.ceil((h + effectiveGap) / (rowHeight + effectiveGap)));
+ item.style.gridRowEnd = `span ${span}`;
+ });
+ },
getSrcNumForAgent(agentNumber) {
let result = '-';
let answeredFound = false;
@@ -290,6 +409,7 @@ const ModuleMonitorActiveCalls = {
"queues": [],
"agents": {
},
+ "agentsList": [],
"calls": [
]
},
From 7d34af70d2b5d9d2756b72e68e48cc142bcbc3d9 Mon Sep 17 00:00:00 2001
From: boffart <5922739+boffart@users.noreply.github.com>
Date: Thu, 15 Jan 2026 14:05:50 +0300
Subject: [PATCH 10/23] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?=
=?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8?=
=?UTF-8?q?=D0=B5=D0=B2.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
bin/WorkerActiveCalls.php | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/bin/WorkerActiveCalls.php b/bin/WorkerActiveCalls.php
index b2896bf..3911b28 100644
--- a/bin/WorkerActiveCalls.php
+++ b/bin/WorkerActiveCalls.php
@@ -293,13 +293,13 @@ private function printActiveCalls():void
$tmpBridgeStart = time();
$tmpChFound = $this->findBridgeChannel($linkedid,$tmpDstChannel, $tmpBridgeStart);
if(!$tmpChFound){
- // Идет дозвони.
+ // Идет дозвон.
$call['calledChannels'][] = [
'channel' => $channel,
'number' => $channelData['CallerIDNum'],
];
}elseif(!isset($bridgeChannels[$channel])){
- // Вероятная переадресация с кнсультацией. Начальный канал в ожидании.
+ // Вероятная переадресация с консультацией. Начальный канал в ожидании.
$bridgeChannels[$channel] = true;
$bridgeChannels[$tmpDstChannel] = true;
From f4a903aa74f058e45f4f4e1cd940c1ebd8b690a8 Mon Sep 17 00:00:00 2001
From: boffart <5922739+boffart@users.noreply.github.com>
Date: Thu, 15 Jan 2026 16:35:48 +0300
Subject: [PATCH 11/23] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?=
=?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BB=20=D0=B2=D0=B7=D0=B0=D0=B8=D0=BC=D0=BE?=
=?UTF-8?q?=D0=B4=D0=B5=D0=B9=D1=81=D1=82=D0=B2=D0=B8=D0=B5=20=D1=81=20?=
=?UTF-8?q?=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B5=D0=BC=20ModuleSoftphoneBac?=
=?UTF-8?q?kend,=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD?=
=?UTF-8?q?=D0=B8=D0=B5=20=D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86?=
=?UTF-8?q?=D0=B8=D0=B8=20=D0=BF=D0=BE=20=D0=BD=D0=B0=D0=B8=D0=BC=D0=B5?=
=?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8E=20=D0=BA=D0=BB=D0=B8?=
=?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B0.=20=D0=9C=D0=BE=D0=B4=D1=83=D0=BB?=
=?UTF-8?q?=D1=8C=20ModuleSoftphoneBackend=20=D0=BD=D0=B0=D0=BF=D0=BE?=
=?UTF-8?q?=D0=BB=D0=BD=D1=8F=D0=B5=D1=82=20=D0=B1=D0=B0=D0=B7=D1=83=20?=
=?UTF-8?q?=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BA=D0=BB=D0=B8=D0=B5?=
=?UTF-8?q?=D0=BD=D1=82=D0=BE=D0=B2=20=D0=BD=D0=B0=20=D0=BE=D1=81=D0=BD?=
=?UTF-8?q?=D0=BE=D0=B2=D0=B5=20"=D0=9F=D0=B0=D0=BD=D0=B5=D0=BB=D1=8C=20?=
=?UTF-8?q?=D1=82=D0=B5=D0=BB=D0=B5=D1=84=D0=BE=D0=BD=D0=B8=D0=B8=204.0".?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../ModuleMonitorActiveCallsController.php | 19 +-
App/Views/index.volt | 19 +-
.../js/module-monitor-active-calls-index.js | 383 +++++++++++++++++-
.../module-monitor-active-calls-index.js.map | 2 +-
.../src/module-monitor-active-calls-index.js | 274 ++++++++++++-
5 files changed, 680 insertions(+), 17 deletions(-)
diff --git a/App/Controllers/ModuleMonitorActiveCallsController.php b/App/Controllers/ModuleMonitorActiveCallsController.php
index b67ef59..1980a29 100644
--- a/App/Controllers/ModuleMonitorActiveCallsController.php
+++ b/App/Controllers/ModuleMonitorActiveCallsController.php
@@ -9,7 +9,7 @@
use MikoPBX\AdminCabinet\Controllers\BaseController;
use MikoPBX\AdminCabinet\Controllers\SessionController;
use MikoPBX\Common\Models\Extensions;
-use MikoPBX\Common\Models\Users;
+use MikoPBX\Common\Models\PbxExtensionModules;
use MikoPBX\Common\Providers\PBXConfModulesProvider;
use MikoPBX\Common\Providers\SessionProvider;
use MikoPBX\Modules\Config\CDRConfigInterface;
@@ -22,7 +22,7 @@
use Modules\ModuleUsersUI\Lib\Constants;
use Modules\ModuleUsersUI\Models\AccessGroups;
use Modules\ModuleUsersUI\Models\UsersCredentials;
-use DateTime;
+use Modules\ModuleSoftphoneBackend\Lib\RestAPI\Controllers\ApiController as ModuleSoftphoneBackendApi;
class ModuleMonitorActiveCallsController extends BaseController
{
@@ -147,6 +147,21 @@ public function saveAction() :void
$this->view->data = $data;
}
+ public function backandEnableAction() :void
+ {
+ $result = PbxExtensionModules::findFirstByUniqid("ModuleSoftphoneBackend");
+ if ($result !== null && intval($result->disabled ) === 0) {
+ // Модуль включен.
+ $api = new ModuleSoftphoneBackendApi();
+ $api->initialize();
+ $this->view->data = $api->createLoginResponse('1', 'admin');
+ $this->view->success = true;
+ }else{
+ $this->view->success = false;
+ $this->view->data = [];
+ }
+ }
+
public function saveUserAction():void
{
$data = $this->request->getPost();
diff --git a/App/Views/index.volt b/App/Views/index.volt
index 8ccdd6a..1f9935f 100644
--- a/App/Views/index.volt
+++ b/App/Views/index.volt
@@ -89,7 +89,10 @@
-
+
{{ t._('module_monitorCalls_waitingTitleClient') }}: <% formatElapsedTime(call.queueData.EnterTime) %>
@@ -133,7 +136,7 @@
<% getPeerPhoneLabel(agent.number) %>
-
+
<% getPeerNameLabel(agent.number) %>
@@ -174,21 +177,21 @@
'row-dialing': (call.dst_num === '' && call.calledChannels && call.calledChannels.length),
}">
<% formatTimestampToTime(call.start) %> |
-
<% call.src_num %> |
+
<% getClientHeader(call.src_num) %> |
-
<%call.dst_num%> |
+
<% getClientHeader(call.dst_num) %> |
- <% bridge.src_num %>
+ <% getClientHeader(bridge.src_num) %>
- <% bridge.dst_num %>
+ <% getClientHeader(bridge.dst_num) %>
|
- <% chanData.number %>
+ <% getClientHeader(chanData.number) %>
|
@@ -197,7 +200,7 @@
<% call.spy_num %>
|
-
<%call.exten%> |
+
<% getClientHeader(call.exten) %> |
diff --git a/public/assets/js/module-monitor-active-calls-index.js b/public/assets/js/module-monitor-active-calls-index.js
index 423314a..b1c7120 100644
--- a/public/assets/js/module-monitor-active-calls-index.js
+++ b/public/assets/js/module-monitor-active-calls-index.js
@@ -1,6 +1,10 @@
"use strict";
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
+function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
+function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
+function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
+function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
@@ -32,12 +36,14 @@ var inputClassName = 'mikopbx-module-input';
/* global $, globalRootUrl, globalTranslate, Form, Config, Vue, Extensions */
var ModuleMonitorActiveCalls = {
isInit: true,
+ contactsCacheTtlMs: 120 * 60 * 1000,
queueNameSelector: '#app-queue div.scrolling.dropdown',
$formObj: $('#' + idForm),
$checkBoxes: $('#' + idForm + ' .ui.checkbox'),
$dropDowns: $('#' + idForm + ' .ui.dropdown'),
activeChannelsUrl: globalRootUrl + idUrl + "/getActiveChannels",
activeChannelsUrlV2: globalRootUrl + idUrl + "/getActiveChannelsV2",
+ backendEnableUrl: globalRootUrl + idUrl + "/backandEnable",
executeCallUrl: globalRootUrl + idUrl + "/executeCall",
saveUserActionUrl: globalRootUrl + idUrl + "/saveUser",
$widget: undefined,
@@ -50,6 +56,8 @@ var ModuleMonitorActiveCalls = {
* On page load we init some Semantic UI library
*/
initialize: function initialize() {
+ this.initContactsCache();
+ this.requestBackendEnable();
$("#nowUser.dropdown.enable").dropdown({
onChange: function onChange(value, text, $choice) {
window[className].onChangeSetting('adminUserId', value);
@@ -122,6 +130,35 @@ var ModuleMonitorActiveCalls = {
}
return available.concat(unavailable);
},
+ normalizePhone10: function normalizePhone10(phone) {
+ var digits = String(phone || '').replace(/\D+/g, '');
+ if (digits.length <= 10) return digits;
+ return digits.slice(-10);
+ },
+ updateContactFromWs: function updateContactFromWs(contact) {
+ var phone10 = this.normalizePhone10(contact === null || contact === void 0 ? void 0 : contact.number);
+ if (!phone10) return;
+ var client = String((contact === null || contact === void 0 ? void 0 : contact.client) || '').trim();
+ if (!client) return;
+ // Vue2: ensure reactivity for new keys
+ if (this.$set) {
+ this.$set(this.contactsByPhone10, phone10, client);
+ } else {
+ this.contactsByPhone10[phone10] = client;
+ }
+ },
+ getClientNameByPhone: function getClientNameByPhone(phone) {
+ var phone10 = this.normalizePhone10(phone);
+ return this.contactsByPhone10[phone10] || '';
+ },
+ getClientHeader: function getClientHeader(phone) {
+ var client = this.getClientNameByPhone(phone);
+ if (!client) return phone;
+ return "".concat(client, " <").concat(phone, ">");
+ },
+ hasClientByPhone: function hasClientByPhone(phone) {
+ return !!this.getClientNameByPhone(phone);
+ },
formatElapsedTime: function formatElapsedTime(enterTime) {
return window[className].formatElapsedTime(enterTime);
},
@@ -422,9 +459,10 @@ var ModuleMonitorActiveCalls = {
return this.hasPeerPhone(agentNumber) ? phone : '—';
},
getPeerNameLabel: function getPeerNameLabel(agentNumber) {
- // Placeholder for future "peer name" feature
- void agentNumber;
- return '—';
+ // Use cached contacts (WS + IndexedDB) to show client name for peer phone.
+ var phone = this.getPeerPhoneLabel(agentNumber);
+ var client = this.getClientNameByPhone(phone);
+ return client || '—';
}
},
data: {
@@ -434,9 +472,11 @@ var ModuleMonitorActiveCalls = {
"queues": [],
"agents": {},
"agentsList": [],
+ "contactsByPhone10": {},
"calls": []
}
});
+ window[className].applyContactsCacheToQueueWidget();
window[className].$callsWidget = new Vue({
el: '#calls',
delimiters: ["<%", "%>"],
@@ -498,6 +538,13 @@ var ModuleMonitorActiveCalls = {
formatElapsedTime: function formatElapsedTime(enterTime) {
return window[className].formatElapsedTime(enterTime);
},
+ getClientHeader: function getClientHeader(phone) {
+ var q = window[className].$widgetQueues;
+ if (q && typeof q.getClientHeader === 'function') {
+ return q.getClientHeader(phone);
+ }
+ return phone;
+ },
hangupAction: function hangupAction(event) {
var target = $(event.target);
if (target.attr('data-ch1') === undefined) {
@@ -651,6 +698,336 @@ var ModuleMonitorActiveCalls = {
window[className].updateLines();
setInterval(window[className].updateLines, 2000);
},
+ initContactsCache: function initContactsCache() {
+ var _this4 = this;
+ return _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
+ var _t;
+ return _regenerator().w(function (_context) {
+ while (1) switch (_context.p = _context.n) {
+ case 0:
+ _context.p = 0;
+ _context.n = 1;
+ return _this4.idbLoadAllContacts();
+ case 1:
+ _this4._contactsCacheByPhone10 = _context.v;
+ _this4.applyContactsCacheToQueueWidget();
+ _context.n = 3;
+ break;
+ case 2:
+ _context.p = 2;
+ _t = _context.v;
+ console.log('contacts cache init error', _t);
+ _this4._contactsCacheByPhone10 = {};
+ case 3:
+ return _context.a(2);
+ }
+ }, _callee, null, [[0, 2]]);
+ }))();
+ },
+ applyContactsCacheToQueueWidget: function applyContactsCacheToQueueWidget() {
+ if (!this._contactsCacheByPhone10) return;
+ if (!window[className].$widgetQueues) return;
+ for (var _i2 = 0, _Object$entries = Object.entries(this._contactsCacheByPhone10); _i2 < _Object$entries.length; _i2++) {
+ var _Object$entries$_i = _slicedToArray(_Object$entries[_i2], 2),
+ phone10 = _Object$entries$_i[0],
+ client = _Object$entries$_i[1];
+ if (window[className].$widgetQueues.$set) {
+ window[className].$widgetQueues.$set(window[className].$widgetQueues.contactsByPhone10, phone10, client);
+ } else {
+ window[className].$widgetQueues.contactsByPhone10[phone10] = client;
+ }
+ }
+ },
+ idbOpenContactsDb: function idbOpenContactsDb() {
+ return new Promise(function (resolve, reject) {
+ try {
+ var req = indexedDB.open('ModuleMonitorActiveCalls', 1);
+ req.onupgradeneeded = function () {
+ var db = req.result;
+ if (!db.objectStoreNames.contains('contactsByPhone10')) {
+ db.createObjectStore('contactsByPhone10', {
+ keyPath: 'phone10'
+ });
+ }
+ };
+ req.onsuccess = function () {
+ return resolve(req.result);
+ };
+ req.onerror = function () {
+ return reject(req.error);
+ };
+ } catch (e) {
+ reject(e);
+ }
+ });
+ },
+ idbPutContact: function idbPutContact(phone10, client) {
+ var _this5 = this;
+ return _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {
+ var db;
+ return _regenerator().w(function (_context2) {
+ while (1) switch (_context2.n) {
+ case 0:
+ _context2.n = 1;
+ return _this5.idbOpenContactsDb();
+ case 1:
+ db = _context2.v;
+ return _context2.a(2, new Promise(function (resolve, reject) {
+ var tx = db.transaction('contactsByPhone10', 'readwrite');
+ var store = tx.objectStore('contactsByPhone10');
+ store.put({
+ phone10: phone10,
+ client: client,
+ updatedAt: Date.now()
+ });
+ tx.oncomplete = function () {
+ db.close();
+ resolve();
+ };
+ tx.onerror = function () {
+ var err = tx.error;
+ db.close();
+ reject(err);
+ };
+ }));
+ }
+ }, _callee2);
+ }))();
+ },
+ idbLoadAllContacts: function idbLoadAllContacts() {
+ var _this6 = this;
+ return _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
+ var db;
+ return _regenerator().w(function (_context3) {
+ while (1) switch (_context3.n) {
+ case 0:
+ _context3.n = 1;
+ return _this6.idbOpenContactsDb();
+ case 1:
+ db = _context3.v;
+ return _context3.a(2, new Promise(function (resolve, reject) {
+ var tx = db.transaction('contactsByPhone10', 'readwrite');
+ var store = tx.objectStore('contactsByPhone10');
+ var req = store.getAll();
+ req.onsuccess = function () {
+ var map = {};
+ var now = Date.now();
+ var ttlMs = Number(_this6.contactsCacheTtlMs) || 120 * 60 * 1000;
+ var _iterator2 = _createForOfIteratorHelper(req.result || []),
+ _step2;
+ try {
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
+ var row = _step2.value;
+ var phone10 = row === null || row === void 0 ? void 0 : row.phone10;
+ var client = row === null || row === void 0 ? void 0 : row.client;
+ var updatedAt = Number(row === null || row === void 0 ? void 0 : row.updatedAt) || 0;
+ var isFresh = phone10 && client && updatedAt > 0 && now - updatedAt <= ttlMs;
+ if (isFresh) {
+ map[phone10] = client;
+ } else if (phone10) {
+ // Cleanup expired/broken records
+ try {
+ store["delete"](phone10);
+ } catch (e) {/* ignore */}
+ }
+ }
+ } catch (err) {
+ _iterator2.e(err);
+ } finally {
+ _iterator2.f();
+ }
+ tx.oncomplete = function () {
+ db.close();
+ resolve(map);
+ };
+ tx.onerror = function () {
+ var err = tx.error;
+ db.close();
+ reject(err);
+ };
+ };
+ req.onerror = function () {
+ var err = req.error;
+ db.close();
+ reject(err);
+ };
+ }));
+ }
+ }, _callee3);
+ }))();
+ },
+ requestBackendEnable: function requestBackendEnable() {
+ $.api({
+ url: window[className].backendEnableUrl,
+ on: 'now',
+ method: 'POST',
+ onSuccess: function onSuccess(response) {
+ var _response$data, _response$data2;
+ console.log('backandEnable response', response);
+ var accessToken = response === null || response === void 0 || (_response$data = response.data) === null || _response$data === void 0 ? void 0 : _response$data.access_token;
+ var refreshToken = response === null || response === void 0 || (_response$data2 = response.data) === null || _response$data2 === void 0 ? void 0 : _response$data2.refresh_token;
+ if (accessToken && refreshToken) {
+ window[className].setAuthTokens(accessToken, refreshToken);
+ window[className].connectContactsWs();
+ }
+ },
+ onFailure: function onFailure(response) {
+ console.log('backandEnable failure', response);
+ },
+ onError: function onError(errorMessage, element, xhr) {
+ console.log('backandEnable error', errorMessage, xhr);
+ }
+ });
+ },
+ setAuthTokens: function setAuthTokens(accessToken, refreshToken) {
+ this._authTokens = this._authTokens || {};
+ this._authTokens.access_token = accessToken;
+ this._authTokens.refresh_token = refreshToken;
+ this._authTokens.exp = this.getJwtExp(accessToken);
+ },
+ getJwtExp: function getJwtExp(token) {
+ try {
+ if (!token || typeof token !== 'string') return 0;
+ var parts = token.split('.');
+ if (parts.length < 2) return 0;
+ var payloadB64 = parts[1].replace(/-/g, '+').replace(/_/g, '/');
+ var padded = payloadB64 + '='.repeat((4 - payloadB64.length % 4) % 4);
+ var json = atob(padded);
+ var payload = JSON.parse(json);
+ return Number(payload === null || payload === void 0 ? void 0 : payload.exp) || 0;
+ } catch (e) {
+ return 0;
+ }
+ },
+ isAccessTokenExpired: function isAccessTokenExpired() {
+ var _this$_authTokens;
+ var skewSeconds = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
+ var exp = Number((_this$_authTokens = this._authTokens) === null || _this$_authTokens === void 0 ? void 0 : _this$_authTokens.exp) || 0;
+ if (!exp) return false; // unknown exp -> don't force refresh
+ var now = Math.floor(Date.now() / 1000);
+ return now + skewSeconds >= exp;
+ },
+ scheduleContactsWsTokenRefresh: function scheduleContactsWsTokenRefresh() {
+ var _this$_authTokens2,
+ _this7 = this;
+ // Proactively refresh token shortly before expiry by re-requesting backendEnable.
+ if (this._contactsWsTokenTimer) {
+ clearTimeout(this._contactsWsTokenTimer);
+ this._contactsWsTokenTimer = null;
+ }
+ var exp = Number((_this$_authTokens2 = this._authTokens) === null || _this$_authTokens2 === void 0 ? void 0 : _this$_authTokens2.exp) || 0;
+ if (!exp) return;
+ var now = Math.floor(Date.now() / 1000);
+ var refreshInSec = Math.max(1, exp - now - 15); // 15s before exp
+ this._contactsWsTokenTimer = setTimeout(function () {
+ // Re-get tokens and reconnect WS
+ _this7.requestBackendEnable();
+ }, refreshInSec * 1000);
+ },
+ scheduleContactsWsReconnect: function scheduleContactsWsReconnect(reason) {
+ var _this8 = this;
+ var forceReAuth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ if (this._contactsWsReconnectTimer) {
+ clearTimeout(this._contactsWsReconnectTimer);
+ this._contactsWsReconnectTimer = null;
+ }
+ this._contactsWsReconnectAttempt = (this._contactsWsReconnectAttempt || 0) + 1;
+ var delay = Math.min(30000, 1000 * Math.pow(2, Math.min(5, this._contactsWsReconnectAttempt - 1)));
+ this._contactsWsReconnectTimer = setTimeout(function () {
+ if (forceReAuth || _this8.isAccessTokenExpired(5)) {
+ _this8.requestBackendEnable();
+ } else {
+ _this8.connectContactsWs();
+ }
+ }, delay);
+ console.log('contacts ws reconnect scheduled', {
+ reason: reason,
+ delayMs: delay
+ });
+ },
+ connectContactsWs: function connectContactsWs() {
+ var _this9 = this;
+ try {
+ var _this$_authTokens3;
+ var accessToken = (_this$_authTokens3 = this._authTokens) === null || _this$_authTokens3 === void 0 ? void 0 : _this$_authTokens3.access_token;
+ if (!accessToken) return;
+
+ // Avoid reconnecting if already connected/connecting
+ if (this._contactsWs && (this._contactsWs.readyState === WebSocket.OPEN || this._contactsWs.readyState === WebSocket.CONNECTING)) {
+ return;
+ }
+ // Reset backoff on explicit connect attempt
+ this._contactsWsReconnectAttempt = 0;
+ var wsProto = window.location.protocol === 'https:' ? 'wss' : 'ws';
+ var wsHost = window.location.host; // host:port of current page
+ var tokenParam = encodeURIComponent(accessToken);
+ var wsUrl = "".concat(wsProto, "://").concat(wsHost, "/pbxcore/api/module-softphone-backend/v1/sub/contacts?authorization=").concat(tokenParam);
+ this._contactsWs = new WebSocket(wsUrl);
+ this._contactsWs.onopen = function () {
+ console.log('contacts ws connected');
+ _this9.scheduleContactsWsTokenRefresh();
+ };
+ this._contactsWs.onmessage = function (event) {
+ _this9.handleContactsWsMessage(event === null || event === void 0 ? void 0 : event.data);
+ };
+ this._contactsWs.onerror = function (event) {
+ console.log('contacts ws error', event);
+ };
+ this._contactsWs.onclose = function (event) {
+ var code = event === null || event === void 0 ? void 0 : event.code;
+ var reason = event === null || event === void 0 ? void 0 : event.reason;
+ console.log('contacts ws closed', {
+ code: code,
+ reason: reason
+ });
+ if (_this9._contactsWsTokenTimer) {
+ clearTimeout(_this9._contactsWsTokenTimer);
+ _this9._contactsWsTokenTimer = null;
+ }
+
+ // 1000 = normal close -> reconnect; auth closes vary by server implementation.
+ var authCloseCodes = new Set([1008, 4001, 4401, 4403]);
+ var forceReAuth = authCloseCodes.has(code) || _this9.isAccessTokenExpired(0);
+ _this9.scheduleContactsWsReconnect('close', forceReAuth);
+ };
+ } catch (e) {
+ console.log('contacts ws init error', e);
+ this.scheduleContactsWsReconnect('init_error', this.isAccessTokenExpired(0));
+ }
+ },
+ handleContactsWsMessage: function handleContactsWsMessage(data) {
+ try {
+ if (!data) return;
+ var parsed = typeof data === 'string' ? JSON.parse(data) : data;
+ var items = Array.isArray(parsed) ? parsed : [parsed];
+ var _iterator3 = _createForOfIteratorHelper(items),
+ _step3;
+ try {
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
+ var item = _step3.value;
+ var digits = String((item === null || item === void 0 ? void 0 : item.number) || '').replace(/\D+/g, '');
+ var phone10 = digits.length <= 10 ? digits : digits.slice(-10);
+ var client = String((item === null || item === void 0 ? void 0 : item.client) || '').trim();
+ if (phone10 && client) {
+ this._contactsCacheByPhone10 = this._contactsCacheByPhone10 || {};
+ this._contactsCacheByPhone10[phone10] = client;
+ this.idbPutContact(phone10, client)["catch"](function (e) {
+ return console.log('contacts cache save error', e);
+ });
+ }
+ if (window[className].$widgetQueues) {
+ window[className].$widgetQueues.updateContactFromWs(item);
+ }
+ }
+ } catch (err) {
+ _iterator3.e(err);
+ } finally {
+ _iterator3.f();
+ }
+ } catch (e) {
+ console.log('contacts ws parse error', e);
+ }
+ },
formatElapsedTime: function formatElapsedTime(enterTime) {
if (!enterTime) return '—';
var now = Math.floor(Date.now() / 1000);
diff --git a/public/assets/js/module-monitor-active-calls-index.js.map b/public/assets/js/module-monitor-active-calls-index.js.map
index c6839fe..c2258be 100644
--- a/public/assets/js/module-monitor-active-calls-index.js.map
+++ b/public/assets/js/module-monitor-active-calls-index.js.map
@@ -1 +1 @@
-{"version":3,"file":"module-monitor-active-calls-index.js","names":["idUrl","idForm","className","inputClassName","ModuleMonitorActiveCalls","isInit","queueNameSelector","$formObj","$","$checkBoxes","$dropDowns","activeChannelsUrl","globalRootUrl","activeChannelsUrlV2","executeCallUrl","saveUserActionUrl","$widget","undefined","validateRules","initialize","dropdown","onChange","value","text","$choice","window","onChangeSetting","val","userNumber","$widgetQueues","Vue","el","delimiters","methods","updatedCallsFromResponse","data","_this","queueNameEl","minWaitVisible","queues","queueId","id","name","number","agents","agentsList","buildAgentsList","calls","Array","isArray","allCalls","$nextTick","normalizeAgentCards","agentsObj","entries","Object","available","unavailable","_i","_entries","length","_entries$_i","_slicedToArray","agent","state","item","_objectSpread","push","concat","formatElapsedTime","enterTime","_this2","$el","artifacts","querySelectorAll","forEach","remove","ensureAgentCardsGridMasonry","cardsContainer","querySelector","style","alignItems","alignContent","cards","card","alignSelf","headers","fontSize","lineHeight","display","gap","whiteSpace","metas","numLabels","paddingTop","paddingBottom","flex","minWidth","maxWidth","overflow","textOverflow","names","requestAnimationFrame","layoutAgentCardsGridMasonry","adjustAgentCardsGap","container","from","tallCard","find","c","shortCard","ht","getBoundingClientRect","height","hs","Number","isFinite","Math","max","min","round","setProperty","adjustAgentCardsColumnCount","w","clientWidth","minCardWidth","cs","getComputedStyle","gapRaw","columnGap","getPropertyValue","gapPx","parseFloat","count","floor","String","_this3","styleId","styleEl","document","getElementById","createElement","head","appendChild","textContent","trim","classList","add","_agentCardsResizeBound","addEventListener","grid","rowHeight","rowGap","items","gridRowEnd","minHeight","tall","filter","short","h","span","ceil","apply","_toConsumableArray","map","g","shortH","tallH","effectiveGap","getSrcNumForAgent","agentNumber","result","answeredFound","_iterator","_createForOfIteratorHelper","_step","s","n","done","call","dst_num","src_num","calledChannels","match","ch","bridgeChannels","err","e","f","i","tmpCall","spyer","spy_num","exten","hasPeerPhone","phone","getPeerPhoneLabel","getPeerNameLabel","$callsWidget","fullAccess","callIsVisible","dst_chan","queueData","EnterTime","getWaitTime","formatTimestampToTime","timestamp","ts","ms","date","Date","hours","getHours","padStart","minutes","getMinutes","seconds","getSeconds","answer","now","secondToTime","start","getCallTime","queue","_data$calls","Extensions","updatePhonesRepresent","hangupAction","event","target","attr","parent","executeCallAction","action","ch1","ch2","joinAction","whisperAction","spChannel","listenAction","lines","checkbox","initializeForm","tab","removeClass","hide","updateLines","setInterval","diffSeconds","toString","settingName","_defineProperty","api","url","on","method","successTest","response","keys","success","onSuccess","location","href","onFailure","console","log","onError","errorMessage","element","xhr","cbBeforeSendForm","settings","form","cbAfterSendForm","Form","ready"],"sources":["src/module-monitor-active-calls-index.js"],"sourcesContent":["/*\n * Copyright (C) MIKO LLC - All Rights Reserved\n * Unauthorized copying of this file, via any medium is strictly prohibited\n * Proprietary and confidential\n * Written by Nikolay Beketov, 11 2018\n *\n */\nconst idUrl = 'module-monitor-active-calls';\nconst idForm = 'module-monitor-active-calls-form';\nconst className = 'ModuleMonitorActiveCalls';\nconst inputClassName = 'mikopbx-module-input';\n\n/* global $, globalRootUrl, globalTranslate, Form, Config, Vue, Extensions */\nconst ModuleMonitorActiveCalls = {\n\tisInit: true,\n\tqueueNameSelector: '#app-queue div.scrolling.dropdown',\n\t$formObj: $('#'+idForm),\n\t$checkBoxes: $('#'+idForm+' .ui.checkbox'),\n\t$dropDowns: $('#'+idForm+' .ui.dropdown'),\n\tactiveChannelsUrl: globalRootUrl + idUrl + \"/getActiveChannels\",\n\tactiveChannelsUrlV2: globalRootUrl + idUrl + \"/getActiveChannelsV2\",\n\texecuteCallUrl: globalRootUrl + idUrl + \"/executeCall\",\n\tsaveUserActionUrl: globalRootUrl + idUrl + \"/saveUser\",\n\t$widget: undefined,\n\n\t/**\n\t * Field validation rules\n\t * https://semantic-ui.com/behaviors/form.html\n\t */\n\tvalidateRules: {},\n\t/**\n\t * On page load we init some Semantic UI library\n\t */\n\tinitialize() {\n\t\t$(\"#nowUser.dropdown.enable\").dropdown({\n\t\t\tonChange: function onChange(value, text, $choice) {\n\t\t\t\twindow[className].onChangeSetting('adminUserId', value);\n\t\t\t}\n\t\t});\n\t\t$(\"#minWaitVisible.dropdown.enable\").dropdown({\n\t\t\tonChange: function onChange(value, text, $choice) {\n\t\t\t\t$('#minWaitVisibleValue').val(value);\n\t\t\t\twindow[className].onChangeSetting('minWaitVisible', value);\n\t\t\t}\n\t\t});\n\t\tlet userNumber = $('#userNumber').val();\n\n\t\twindow[className].$widgetQueues = new Vue({\n\t\t\tel: '#app-queue',\n\t\t\tdelimiters: [\"<%\",\"%>\"],\n\t\t\tmethods: {\n\t\t\t\tupdatedCallsFromResponse(data) {\n\t\t\t\t\tlet queueNameEl = $(window[className].queueNameSelector);\n\t\t\t\t\tthis.minWaitVisible = 1*$('#minWaitVisibleValue').val();\n\n\t\t\t\t\tthis.queues = data.queues;\n\t\t\t\t\tlet queueId = $('#queueId').val();\n\t\t\t\t\tif (queueId in data.queues) {\n\t\t\t\t\t\tthis.id = data.queues[queueId].id;\n\t\t\t\t\t\tthis.name = data.queues[queueId].name;\n\t\t\t\t\t\tthis.number = data.queues[queueId].number;\n\t\t\t\t\t\tthis.agents = data.queues[queueId].agents;\n\t\t\t\t\t\tthis.agentsList = this.buildAgentsList(this.agents);\n\t\t\t\t\t\tthis.calls = Array.isArray(data.queues[queueId].calls) ? data.queues[queueId].calls : [];\n\t\t\t\t\t\tthis.allCalls = data.calls;\n\t\t\t\t\t}else{\n\t\t\t\t\t\tthis.calls = [];\n\t\t\t\t\t\tthis.agentsList = [];\n\t\t\t\t\t}\n\t\t\t\t\tif(queueNameEl.dropdown('is hidden')){\n\t\t\t\t\t\tqueueNameEl.dropdown({\n\t\t\t\t\t\t\tonChange: function onChange(value, text, $choice) {\n\t\t\t\t\t\t\t\twindow[className].onChangeSetting('queueId', value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif(queueNameEl.dropdown('get value') === ''){\n\t\t\t\t\t\t\twindow[className].isInit = true;\n\t\t\t\t\t\t\tqueueNameEl.dropdown('set value', $('#queueId').val())\n\t\t\t\t\t\t\twindow[className].isInit = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Normalize Semantic UI Card typography after render\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tthis.normalizeAgentCards();\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tbuildAgentsList(agentsObj) {\n\t\t\t\t\tconst entries = Object.entries(agentsObj || {});\n\t\t\t\t\tconst available = [];\n\t\t\t\t\tconst unavailable = [];\n\t\t\t\t\tfor (const [number, agent] of entries) {\n\t\t\t\t\t\tconst state = agent?.state || '';\n\t\t\t\t\t\tconst item = { number, ...agent };\n\t\t\t\t\t\tif (state === 'Unavailable') {\n\t\t\t\t\t\t\tunavailable.push(item);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tavailable.push(item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn available.concat(unavailable);\n\t\t\t\t},\n\t\t\t\tformatElapsedTime(enterTime) {\n\t\t\t\t\treturn window[className].formatElapsedTime(enterTime);\n\t\t\t\t},\n\t\t\t\tnormalizeAgentCards() {\n\t\t\t\t\tif (!this.$el) return;\n\n\t\t\t\t\t// Cleanup artifacts from previous experiments (placeholders/spacers).\n\t\t\t\t\tconst artifacts = this.$el.querySelectorAll('.agent-peer-placeholder, .agent-peer-spacer');\n\t\t\t\t\tartifacts.forEach((el) => el.remove());\n\n\t\t\t\t\t// Dense layout (masonry) that still fills left-to-right:\n\t\t\t\t\t// flex-wrap can't place items into vertical gaps under tall cards.\n\t\t\t\t\tthis.ensureAgentCardsGridMasonry();\n\n\t\t\t\t\t// Prevent \"equal height\" cards in one row (Semantic UI cards are flex).\n\t\t\t\t\tconst cardsContainer = this.$el.querySelector('.ui.cards.agent-cards');\n\t\t\t\t\tif (cardsContainer) {\n\t\t\t\t\t\tcardsContainer.style.alignItems = 'flex-start';\n\t\t\t\t\t\tcardsContainer.style.alignContent = 'flex-start';\n\t\t\t\t\t}\n\n\t\t\t\t\tconst cards = this.$el.querySelectorAll('.ui.cards.agent-cards > .ui.card.agent-card');\n\t\t\t\t\tcards.forEach((card) => {\n\t\t\t\t\t\tcard.style.alignSelf = 'flex-start';\n\t\t\t\t\t});\n\n\t\t\t\t\t// Semantic UI makes .header bigger than normal text; we need same font size.\n\t\t\t\t\tconst headers = this.$el.querySelectorAll('.ui.card.agent-card .header.agent-card-header');\n\t\t\t\t\theaders.forEach((el) => {\n\t\t\t\t\t\tel.style.fontSize = '1em';\n\t\t\t\t\t\tel.style.lineHeight = '1.2';\n\t\t\t\t\t\tel.style.display = 'flex';\n\t\t\t\t\t\tel.style.alignItems = 'center';\n\t\t\t\t\t\tel.style.gap = '0.5em';\n\t\t\t\t\t\tel.style.whiteSpace = 'nowrap';\n\t\t\t\t\t});\n\n\t\t\t\t\tconst metas = this.$el.querySelectorAll('.ui.card.agent-card .meta.agent-peer');\n\t\t\t\t\tmetas.forEach((el) => {\n\t\t\t\t\t\tel.style.fontSize = '1em';\n\t\t\t\t\t\tel.style.lineHeight = '1.2';\n\t\t\t\t\t});\n\n\t\t\t\t\t// Normalize label/name typography so they have same text height.\n\t\t\t\t\tconst numLabels = this.$el.querySelectorAll('.ui.card.agent-card .agent-num-label');\n\t\t\t\t\tnumLabels.forEach((el) => {\n\t\t\t\t\t\tel.style.fontSize = '1em';\n\t\t\t\t\t\tel.style.lineHeight = '1.2';\n\t\t\t\t\t\tel.style.display = 'inline-flex';\n\t\t\t\t\t\tel.style.alignItems = 'center';\n\t\t\t\t\t\tel.style.paddingTop = '0';\n\t\t\t\t\t\tel.style.paddingBottom = '0';\n\t\t\t\t\t\t// Allow label to shrink (otherwise long numbers force card wider than 180px)\n\t\t\t\t\t\tel.style.flex = '0 1 auto';\n\t\t\t\t\t\tel.style.minWidth = '0';\n\t\t\t\t\t\tel.style.maxWidth = '14ch';\n\t\t\t\t\t\tel.style.overflow = 'hidden';\n\t\t\t\t\t\tel.style.textOverflow = 'ellipsis';\n\t\t\t\t\t\tel.style.whiteSpace = 'nowrap';\n\t\t\t\t\t});\n\t\t\t\t\tconst names = this.$el.querySelectorAll('.ui.card.agent-card .agent-name');\n\t\t\t\t\tnames.forEach((el) => {\n\t\t\t\t\t\tel.style.lineHeight = '1.2';\n\t\t\t\t\t\t// Ellipsis for long names (e.g. \"Салтыков-Щедрин\")\n\t\t\t\t\t\tel.style.minWidth = '0';\n\t\t\t\t\t\tel.style.flex = '1 1 auto';\n\t\t\t\t\t\tel.style.overflow = 'hidden';\n\t\t\t\t\t\tel.style.textOverflow = 'ellipsis';\n\t\t\t\t\t\tel.style.whiteSpace = 'nowrap';\n\t\t\t\t\t});\n\n\t\t\t\t\t// Grid masonry needs row-span calculation after layout.\n\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\t\tthis.layoutAgentCardsGridMasonry();\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tadjustAgentCardsGap() {\n\t\t\t\t\tif (!this.$el) return;\n\t\t\t\t\tconst container = this.$el.querySelector('.ui.cards.agent-cards');\n\t\t\t\t\tif (!container) return;\n\n\t\t\t\t\tconst cards = Array.from(container.querySelectorAll('.ui.card.agent-card'));\n\t\t\t\t\tif (!cards.length) return;\n\n\t\t\t\t\tconst tallCard = cards.find((c) => c.querySelector('.meta.agent-peer'));\n\t\t\t\t\tconst shortCard = cards.find((c) => !c.querySelector('.meta.agent-peer'));\n\t\t\t\t\tif (!tallCard || !shortCard) return;\n\n\t\t\t\t\tconst ht = tallCard.getBoundingClientRect().height;\n\t\t\t\t\tconst hs = shortCard.getBoundingClientRect().height;\n\t\t\t\t\tif (!ht || !hs) return;\n\n\t\t\t\t\t// From 2*(hs+g) = ht+g => g = ht - 2*hs\n\t\t\t\t\tlet gap = ht - 2 * hs;\n\t\t\t\t\tif (!Number.isFinite(gap)) return;\n\n\t\t\t\t\t// Clamp to sane range; negative means \"no extra gap needed\".\n\t\t\t\t\tgap = Math.max(0, Math.min(20, Math.round(gap)));\n\n\t\t\t\t\tcontainer.style.setProperty('--agent-card-gap', `${gap}px`);\n\t\t\t\t},\n\t\t\t\tadjustAgentCardsColumnCount() {\n\t\t\t\t\tif (!this.$el) return;\n\t\t\t\t\tconst container = this.$el.querySelector('.ui.cards.agent-cards.agent-cards-masonry');\n\t\t\t\t\tif (!container) return;\n\n\t\t\t\t\tconst w = container.clientWidth;\n\t\t\t\t\tif (!w) return;\n\n\t\t\t\t\t// Minimum acceptable card width in px (tune if needed)\n\t\t\t\t\tconst minCardWidth = 150;\n\n\t\t\t\t\tconst cs = window.getComputedStyle(container);\n\t\t\t\t\tconst gapRaw = cs.columnGap || cs.getPropertyValue('column-gap') || '16px';\n\t\t\t\t\tconst gapPx = parseFloat(gapRaw) || 16;\n\n\t\t\t\t\tconst count = Math.max(1, Math.min(12, Math.floor((w + gapPx) / (minCardWidth + gapPx))));\n\t\t\t\t\tcontainer.style.setProperty('--agent-card-col-count', String(count));\n\t\t\t\t},\n\t\t\t\tensureAgentCardsGridMasonry() {\n\t\t\t\t\tconst styleId = 'agent-cards-layout-style';\n\t\t\t\t\tlet styleEl = document.getElementById(styleId);\n\t\t\t\t\tif (!styleEl) {\n\t\t\t\t\t\tstyleEl = document.createElement('style');\n\t\t\t\t\t\tstyleEl.id = styleId;\n\t\t\t\t\t\tdocument.head.appendChild(styleEl);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Grid masonry: fills left-to-right and can pack items into gaps.\n\t\t\t\t\tstyleEl.textContent = `\n.ui.cards.agent-cards.agent-cards-grid {\n display: grid !important;\n grid-template-columns: repeat(auto-fill, 240px);\n justify-content: start;\n gap: var(--agent-card-gap, 8px);\n grid-auto-rows: 1px;\n /* Prevent overlap with the legend block below */\n margin-bottom: 1em !important;\n}\n.ui.cards.agent-cards.agent-cards-grid > .ui.card.agent-card {\n width: 240px !important;\n margin: 0 !important;\n overflow: hidden;\n /* reset from previous layouts */\n align-self: start;\n}\n\t\t\t\t\t`.trim();\n\n\t\t\t\t\tconst cardsContainer = this.$el && this.$el.querySelector\n\t\t\t\t\t\t? this.$el.querySelector('.ui.cards.agent-cards')\n\t\t\t\t\t\t: null;\n\t\t\t\t\tif (cardsContainer) {\n\t\t\t\t\t\tcardsContainer.classList.remove('agent-cards-masonry');\n\t\t\t\t\t\tcardsContainer.classList.remove('agent-cards-flex');\n\t\t\t\t\t\tcardsContainer.classList.add('agent-cards-grid');\n\n\t\t\t\t\t\t// Bind once: relayout on resize.\n\t\t\t\t\t\tif (!this._agentCardsResizeBound) {\n\t\t\t\t\t\t\tthis._agentCardsResizeBound = true;\n\t\t\t\t\t\t\twindow.addEventListener('resize', () => {\n\t\t\t\t\t\t\t\tthis.layoutAgentCardsGridMasonry();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tlayoutAgentCardsGridMasonry() {\n\t\t\t\t\tif (!this.$el) return;\n\t\t\t\t\tconst grid = this.$el.querySelector('.ui.cards.agent-cards.agent-cards-grid');\n\t\t\t\t\tif (!grid) return;\n\n\t\t\t\t\tconst cs = window.getComputedStyle(grid);\n\t\t\t\t\tconst rowHeight = parseFloat(cs.getPropertyValue('grid-auto-rows')) || 1;\n\t\t\t\t\tconst rowGap = parseFloat(cs.getPropertyValue('row-gap')) || parseFloat(cs.getPropertyValue('gap')) || 8;\n\n\t\t\t\t\tconst items = Array.from(grid.querySelectorAll('.ui.card.agent-card'));\n\t\t\t\t\tif (!items.length) return;\n\n\t\t\t\t\t// Reset row spans and min-heights to measure natural heights.\n\t\t\t\t\titems.forEach((item) => {\n\t\t\t\t\t\titem.style.gridRowEnd = '';\n\t\t\t\t\t\titem.style.minHeight = '';\n\t\t\t\t\t});\n\n\t\t\t\t\tconst tall = items.filter((c) => c.querySelector('.meta.agent-peer'));\n\t\t\t\t\tconst short = items.filter((c) => !c.querySelector('.meta.agent-peer'));\n\n\t\t\t\t\t// If we don't have both types, just do normal masonry spans.\n\t\t\t\t\tif (!tall.length || !short.length) {\n\t\t\t\t\t\titems.forEach((item) => {\n\t\t\t\t\t\t\tconst h = item.getBoundingClientRect().height;\n\t\t\t\t\t\t\tconst span = Math.max(1, Math.ceil((h + rowGap) / (rowHeight + rowGap)));\n\t\t\t\t\t\t\titem.style.gridRowEnd = `span ${span}`;\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst hs = Math.max(...short.map((c) => c.getBoundingClientRect().height));\n\t\t\t\t\tconst ht = Math.max(...tall.map((c) => c.getBoundingClientRect().height));\n\n\t\t\t\t\t// Want: 2*(hs + g) = (ht + g) => g = ht - 2*hs\n\t\t\t\t\tlet g = ht - 2 * hs;\n\t\t\t\t\tif (!Number.isFinite(g)) g = rowGap;\n\t\t\t\t\tg = Math.max(0, Math.min(24, Math.round(g)));\n\n\t\t\t\t\t// Apply gap and enforce min-heights so the relation holds visually.\n\t\t\t\t\tgrid.style.setProperty('--agent-card-gap', `${g}px`);\n\n\t\t\t\t\tconst shortH = Math.round(hs);\n\t\t\t\t\tconst tallH = Math.round(Math.max(ht, 2 * hs + g));\n\t\t\t\t\tshort.forEach((c) => { c.style.minHeight = `${shortH}px`; });\n\t\t\t\t\ttall.forEach((c) => { c.style.minHeight = `${tallH}px`; });\n\n\t\t\t\t\t// Now compute row spans from final rendered heights.\n\t\t\t\t\tconst effectiveGap = g;\n\t\t\t\t\titems.forEach((item) => {\n\t\t\t\t\t\tconst h = item.getBoundingClientRect().height;\n\t\t\t\t\t\tconst span = Math.max(1, Math.ceil((h + effectiveGap) / (rowHeight + effectiveGap)));\n\t\t\t\t\t\titem.style.gridRowEnd = `span ${span}`;\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tgetSrcNumForAgent(agentNumber) {\n\t\t\t\t\tlet result = '-';\n\t\t\t\t\tlet answeredFound = false;\n\t\t\t\t\tfor (const call of this.calls) {\n\t\t\t\t\t\tif(call.dst_num === agentNumber){\n\t\t\t\t\t\t\tansweredFound = true;\n\t\t\t\t\t\t\tresult = call.src_num;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (call.calledChannels && Array.isArray(call.calledChannels)) {\n\t\t\t\t\t\t\tconst match = call.calledChannels.find(ch => ch.number === agentNumber);\n\t\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\t\tresult = call.src_num;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (call.bridgeChannels && Array.isArray(call.bridgeChannels)) {\n\t\t\t\t\t\t\tconst match = call.bridgeChannels.find(ch => (ch.src_num === agentNumber || ch.dst_num === agentNumber));\n\t\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\t\tif(match.src_num === agentNumber){\n\t\t\t\t\t\t\t\t\tresult = match.dst_num;\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\tresult = match.src_num;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tansweredFound = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(answeredFound === false){\n\t\t\t\t\t\tfor (let i = 0; i < this.allCalls.length; i++) {\n\t\t\t\t\t\t\tconst tmpCall = this.allCalls[i];\n\t\t\t\t\t\t\tif(tmpCall.src_num === agentNumber){\n\t\t\t\t\t\t\t\t// Исходящий\n\t\t\t\t\t\t\t\tif(tmpCall.dst_num === ''){\n\t\t\t\t\t\t\t\t\t// не ответа, дозвон.\n\t\t\t\t\t\t\t\t\tif (tmpCall.calledChannels && Array.isArray(tmpCall.calledChannels) && tmpCall.calledChannels.length) {\n\t\t\t\t\t\t\t\t\t\tconst match = tmpCall.calledChannels.find(ch => ch.number !== agentNumber);\n\t\t\t\t\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\t\t\t\t\tresult = match.number;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}else if(tmpCall.spyer){\n\t\t\t\t\t\t\t\t\t\t// шпионит за номером.\n\t\t\t\t\t\t\t\t\t\tresult = tmpCall.spy_num;\n\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t// нет вызываемых каналов, возможно это вызов на приложение / ivr.\n\t\t\t\t\t\t\t\t\t\tresult = tmpCall.exten;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\tresult = tmpCall.dst_num;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}else if(tmpCall.dst_num === agentNumber){\n\t\t\t\t\t\t\t\t// Входящий на агента, отвечен.\n\t\t\t\t\t\t\t\tresult = tmpCall.src_num;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\tif (tmpCall.calledChannels && Array.isArray(tmpCall.calledChannels)) {\n\t\t\t\t\t\t\t\t\tconst match = tmpCall.calledChannels.find(ch => ch.number === agentNumber);\n\t\t\t\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\t\t\t\tresult = tmpCall.src_num;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t},\n\t\t\t\thasPeerPhone(agentNumber) {\n\t\t\t\t\tconst phone = String(this.getSrcNumForAgent(agentNumber) || '').trim();\n\t\t\t\t\treturn phone !== '' && phone !== '-' && phone !== '—';\n\t\t\t\t},\n\t\t\t\tgetPeerPhoneLabel(agentNumber) {\n\t\t\t\t\tconst phone = String(this.getSrcNumForAgent(agentNumber) || '').trim();\n\t\t\t\t\treturn this.hasPeerPhone(agentNumber) ? phone : '—';\n\t\t\t\t},\n\t\t\t\tgetPeerNameLabel(agentNumber) {\n\t\t\t\t\t// Placeholder for future \"peer name\" feature\n\t\t\t\t\tvoid agentNumber;\n\t\t\t\t\treturn '—';\n\t\t\t\t}\n\t\t\t},\n\t\t\tdata: {\n\t\t\t\t\"minWaitVisible\": 30,\n\t\t\t\t\"name\": \"\",\n\t\t\t\t\"number\": \"\",\n\t\t\t\t\"queues\": [],\n\t\t\t\t\"agents\": {\n\t\t\t\t},\n\t\t\t\t\"agentsList\": [],\n\t\t\t\t\"calls\": [\n\t\t\t\t]\n\t\t\t},\n\t\t});\n\n\t\twindow[className].$callsWidget = new Vue({\n\t\t\tel: '#calls',\n\t\t\tdelimiters: [\"<%\",\"%>\"],\n\t\t\tdata: {\n\t\t\t\t\"minWaitVisible\": 30,\n\t\t\t\tuserNumber: userNumber,\n\t\t\t\tfullAccess: ($('#fullAccess').val() === \"1\" || userNumber === ''),\n\t\t\t\tcalls: [\n\t\t\t\t]\n\t\t\t},\n\t\t\tmethods: {\n\t\t\t\tcallIsVisible(call){\n\t\t\t\t\tif(call.dst_chan==='' && call.queueData.EnterTime !== undefined ){\n\t\t\t\t\t\treturn this.minWaitVisible <= this.getWaitTime(call);\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t\tformatTimestampToTime(timestamp) {\n\t\t\t\t\t// Если timestamp строка — приводим к числу\n\t\t\t\t\tconst ts = typeof timestamp === 'string' ? parseFloat(timestamp) : timestamp;\n\n\t\t\t\t\t// Если timestamp в секундах (меньше 1e10), умножаем на 1000\n\t\t\t\t\tconst ms = ts < 1e10 ? ts * 1000 : ts;\n\n\t\t\t\t\tconst date = new Date(ms);\n\n\t\t\t\t\tconst hours = String(date.getHours()).padStart(2, '0');\n\t\t\t\t\tconst minutes = String(date.getMinutes()).padStart(2, '0');\n\t\t\t\t\tconst seconds = String(date.getSeconds()).padStart(2, '0');\n\n\t\t\t\t\treturn `${hours}:${minutes}:${seconds}`;\n\t\t\t\t},\n\t\t\t\tgetWaitTime(call){\n\t\t\t\t\tlet answer = Math.floor(Date.now() / 1000);\n\t\t\t\t\tif(call.answer !== ''){\n\t\t\t\t\t\tanswer = call.answer\n\t\t\t\t\t}\n\t\t\t\t\treturn window[className].secondToTime(answer - call.start);\n\t\t\t\t},\n\t\t\t\tgetCallTime(call){\n\t\t\t\t\tif(call.answer === ''){\n\t\t\t\t\t\treturn '-';\n\t\t\t\t\t}\n\t\t\t\t\treturn window[className].formatElapsedTime(call.answer);\n\t\t\t\t},\n\t\t\t\tupdatedCallsFromResponse(data) {\n\t\t\t\t\tthis.minWaitVisible = 1*$('#minWaitVisibleValue').val();\n\t\t\t\t\t// Проходим по всем очередям\n\t\t\t\t\tfor (const queueId in data.queues) {\n\t\t\t\t\t\tconst queue = data.queues[queueId];\n\t\t\t\t\t\t// Проверяем, есть ли у очереди поле calls и является ли оно массивом\n\t\t\t\t\t\tif (Array.isArray(queue.calls)) {\n\t\t\t\t\t\t\t// Добавляем все вызовы из этой очереди в общий массив\n\t\t\t\t\t\t\tdata.calls.push(...queue.calls);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.calls = data.calls;\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tExtensions.updatePhonesRepresent('need-update');\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tformatElapsedTime(enterTime) {\n\t\t\t\t\treturn window[className].formatElapsedTime(enterTime);\n\t\t\t\t},\n\t\t\t\thangupAction(event) {\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'hangup', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2')});\n\t\t\t\t},\n\t\t\t\tjoinAction(event) {\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'join', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2'), number: this.userNumber});\n\t\t\t\t},\n\t\t\t\twhisperAction(event){\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlet spChannel = target.attr('data-ch1');\n\t\t\t\t\tif('incoming' === target.attr('data-call-type')){\n\t\t\t\t\t\tspChannel = target.attr('data-ch2');\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'whisper', ch1: spChannel, ch2: '', number: this.userNumber});\n\t\t\t\t},\n\t\t\t\tlistenAction(event){\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'listen', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2'), number: this.userNumber});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\twindow[className].$widget = new Vue({\n\t\t\tel: '#app',\n\t\t\tdelimiters: [\"<%\",\"%>\"],\n\t\t\tdata: {\n\t\t\t\tuserNumber: userNumber,\n\t\t\t\tfullAccess: ($('#fullAccess').val() === \"1\" || userNumber === ''),\n\t\t\t\tcalls: [\n\t\t\t\t]\n\t\t\t},\n\t\t\tmethods: {\n\t\t\t\tupdatedCallsFromResponse(lines) {\n\t\t\t\t\tthis.calls = lines;\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tExtensions.updatePhonesRepresent('need-update');\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\thangupAction(event) {\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'hangup', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2')});\n\t\t\t\t},\n\t\t\t\tjoinAction(event) {\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'join', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2'), number: this.userNumber});\n\t\t\t\t},\n\t\t\t\twhisperAction(event){\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlet spChannel = target.attr('data-ch1');\n\t\t\t\t\tif('incoming' === target.attr('data-call-type')){\n\t\t\t\t\t\tspChannel = target.attr('data-ch2');\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'whisper', ch1: spChannel, ch2: '', number: this.userNumber});\n\t\t\t\t},\n\t\t\t\tlistenAction(event){\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'listen', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2'), number: this.userNumber});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\twindow[className].$checkBoxes.checkbox();\n\t\twindow[className].$dropDowns.dropdown();\n\t\twindow[className].initializeForm();\n\t\t$('.menu .item').tab();\n\t\t//////\n\t\t// Удаляем отступы контейнера.\n\t\t$('#main-content-container').removeClass('container');\n\t\t$('#module-status-toggle-segment').hide();\n\t\t$('.ui.clearing.hidden.divider').remove();\n\t\t// Окончание форматирования базовой страницы\n\t\t//////\n\t\twindow[className].updateLines();\n\t\tsetInterval(window[className].updateLines, 2000);\n\t},\n\tformatElapsedTime(enterTime) {\n\t\tif (!enterTime) return '—';\n\n\t\tconst now = Math.floor(Date.now() / 1000);\n\t\tconst diffSeconds = now - enterTime;\n\n\t\treturn window[className].secondToTime(diffSeconds);\n\t},\n\tsecondToTime(diffSeconds){\n\t\tif (diffSeconds < 0) return '0';\n\t\t// Форматируем: чч:мм:сс или мм:сс, или просто секунды\n\t\tconst hours = Math.floor(diffSeconds / 3600);\n\t\tconst minutes = Math.floor((diffSeconds % 3600) / 60);\n\t\tconst seconds = Math.round(diffSeconds % 60);\n\t\tif (hours > 0) {\n\t\t\treturn `${hours}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n\t\t} else if (minutes > 0) {\n\t\t\treturn `${minutes}:${seconds.toString().padStart(2, '0')}`;\n\t\t} else {\n\t\t\treturn `${seconds}`;\n\t\t}\n\t},\n\tonChangeSetting(settingName, value) {\n\t\tif(window[className].isInit){\n\t\t\treturn;\n\t\t}\n\t\tlet data = {\n\t\t\t[settingName]: value\n\t\t};\n\t\t$.api({\n\t\t\turl: window[className].saveUserActionUrl,\n\t\t\ton: 'now',\n\t\t\tmethod: 'POST',\n\t\t\tdata: data,\n\t\t\tsuccessTest(response) {\n\t\t\t\treturn response !== undefined && Object.keys(response).length > 0 && response.success === true;\n\t\t\t},\n\t\t\tonSuccess(response) {\n\t\t\t\tif(settingName === 'queueId'){\n\t\t\t\t\t$('#queueId').val($(window[className].queueNameSelector).dropdown('get value'));\n\t\t\t\t}else if( settingName === 'adminUserId'){\n\t\t\t\t\twindow.location.href = window.location.href;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonFailure(response) {\n\t\t\t\tconsole.log(response);\n\t\t\t},\n\t\t\tonError(errorMessage, element, xhr) {\n\t\t\t\tconsole.log(errorMessage,xhr);\n\t\t\t}\n\t\t});\n\t},\n\texecuteCallAction(data) {\n\t\t$.api({\n\t\t\turl: window[className].executeCallUrl,\n\t\t\ton: 'now',\n\t\t\tmethod: 'POST',\n\t\t\tdata: data,\n\t\t\tsuccessTest(response) {\n\t\t\t\treturn response !== undefined && Object.keys(response).length > 0 && response.success === true;\n\t\t\t},\n\t\t\tonSuccess(response) {\n\t\t\t\tconsole.log(response);\n\t\t\t},\n\t\t\tonFailure(response) {\n\t\t\t\tconsole.log(response);\n\t\t\t},\n\t\t\tonError(errorMessage, element, xhr) {\n\t\t\t\tconsole.log(errorMessage,xhr);\n\t\t\t}\n\t\t});\n\t},\n\tupdateLines() {\n\t\t$.api({\n\t\t\turl: window[className].activeChannelsUrlV2,\n\t\t\ton: 'now',\n\t\t\tmethod: 'POST',\n\t\t\tsuccessTest(response) {\n\t\t\t\treturn response !== undefined && Object.keys(response).length > 0 && response.success === true;\n\t\t\t},\n\t\t\tonSuccess(response) {\n\t\t\t\twindow[className].$widgetQueues.updatedCallsFromResponse(response);\n\t\t\t\twindow[className].$callsWidget.updatedCallsFromResponse(response);\n\t\t\t},\n\t\t\tonFailure(response) {\n\t\t\t\tconsole.log(response);\n\t\t\t},\n\t\t\tonError(errorMessage, element, xhr) {\n\t\t\t\tconsole.log(errorMessage,xhr);\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * We can modify some data before form send\n\t * @param settings\n\t * @returns {*}\n\t */\n\tcbBeforeSendForm(settings) {\n\t\tconst result = settings;\n\t\tresult.data = window[className].$formObj.form('get values');\n\t\treturn result;\n\t},\n\t/**\n\t * Some actions after forms send\n\t */\n\tcbAfterSendForm() {\n\n\t},\n\t/**\n\t * Initialize form parameters\n\t */\n\tinitializeForm() {\n\t\tForm.$formObj = window[className].$formObj;\n\t\tForm.url = `${globalRootUrl}${idUrl}/save`;\n\t\tForm.validateRules = window[className].validateRules;\n\t\tForm.cbBeforeSendForm = window[className].cbBeforeSendForm;\n\t\tForm.cbAfterSendForm = window[className].cbAfterSendForm;\n\t\tForm.initialize();\n\t},\n};\n\n$(document).ready(() => {\n\twindow[className].initialize();\n});\n\n"],"mappings":"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","ignoreList":[]}
\ No newline at end of file
+{"version":3,"file":"module-monitor-active-calls-index.js","names":["e","t","r","Symbol","n","iterator","o","toStringTag","i","c","prototype","Generator","u","Object","create","_regeneratorDefine2","f","p","y","G","v","a","d","bind","length","l","TypeError","call","done","value","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","defineProperty","_regeneratorDefine","_invoke","enumerable","configurable","writable","asyncGeneratorStep","Promise","resolve","then","_asyncToGenerator","arguments","apply","_next","_throw","_createForOfIteratorHelper","Array","isArray","_unsupportedIterableToArray","_n","F","s","next","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","from","_arrayLikeToArray","ownKeys","keys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","push","_objectSpread","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","_toPropertyKey","_toPrimitive","_typeof","toPrimitive","String","Number","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_nonIterableRest","toString","slice","constructor","name","test","idUrl","idForm","className","inputClassName","ModuleMonitorActiveCalls","isInit","contactsCacheTtlMs","queueNameSelector","$formObj","$","$checkBoxes","$dropDowns","activeChannelsUrl","globalRootUrl","activeChannelsUrlV2","backendEnableUrl","executeCallUrl","saveUserActionUrl","$widget","undefined","validateRules","initialize","initContactsCache","requestBackendEnable","dropdown","onChange","text","$choice","window","onChangeSetting","val","userNumber","$widgetQueues","Vue","el","delimiters","methods","updatedCallsFromResponse","data","_this","queueNameEl","minWaitVisible","queues","queueId","id","number","agents","agentsList","buildAgentsList","calls","allCalls","$nextTick","normalizeAgentCards","agentsObj","entries","available","unavailable","_i","_entries","_entries$_i","agent","state","item","concat","normalizePhone10","phone","digits","replace","updateContactFromWs","contact","phone10","client","trim","$set","contactsByPhone10","getClientNameByPhone","getClientHeader","hasClientByPhone","formatElapsedTime","enterTime","_this2","$el","artifacts","querySelectorAll","remove","ensureAgentCardsGridMasonry","cardsContainer","querySelector","style","alignItems","alignContent","cards","card","alignSelf","headers","fontSize","lineHeight","display","gap","whiteSpace","metas","numLabels","paddingTop","paddingBottom","flex","minWidth","maxWidth","overflow","textOverflow","names","requestAnimationFrame","layoutAgentCardsGridMasonry","adjustAgentCardsGap","container","tallCard","find","shortCard","ht","getBoundingClientRect","height","hs","isFinite","Math","max","min","round","setProperty","adjustAgentCardsColumnCount","clientWidth","minCardWidth","cs","getComputedStyle","gapRaw","columnGap","getPropertyValue","gapPx","parseFloat","count","floor","_this3","styleId","styleEl","document","getElementById","createElement","head","appendChild","textContent","classList","add","_agentCardsResizeBound","addEventListener","grid","rowHeight","rowGap","items","gridRowEnd","minHeight","tall","short","h","span","ceil","map","g","shortH","tallH","effectiveGap","getSrcNumForAgent","agentNumber","result","answeredFound","_iterator","_step","dst_num","src_num","calledChannels","match","ch","bridgeChannels","err","tmpCall","spyer","spy_num","exten","hasPeerPhone","getPeerPhoneLabel","getPeerNameLabel","applyContactsCacheToQueueWidget","$callsWidget","fullAccess","callIsVisible","dst_chan","queueData","EnterTime","getWaitTime","formatTimestampToTime","timestamp","ts","ms","date","Date","hours","getHours","padStart","minutes","getMinutes","seconds","getSeconds","answer","now","secondToTime","start","getCallTime","queue","_data$calls","Extensions","updatePhonesRepresent","q","hangupAction","event","target","attr","parent","executeCallAction","action","ch1","ch2","joinAction","whisperAction","spChannel","listenAction","lines","checkbox","initializeForm","tab","removeClass","hide","updateLines","setInterval","_this4","_callee","_t","_context","idbLoadAllContacts","_contactsCacheByPhone10","console","log","_i2","_Object$entries","_Object$entries$_i","idbOpenContactsDb","reject","req","indexedDB","open","onupgradeneeded","db","objectStoreNames","contains","createObjectStore","keyPath","onsuccess","onerror","error","idbPutContact","_this5","_callee2","_context2","tx","transaction","store","objectStore","put","updatedAt","oncomplete","close","_this6","_callee3","_context3","getAll","ttlMs","_iterator2","_step2","row","isFresh","api","url","on","method","onSuccess","response","_response$data","_response$data2","accessToken","access_token","refreshToken","refresh_token","setAuthTokens","connectContactsWs","onFailure","onError","errorMessage","element","xhr","_authTokens","exp","getJwtExp","token","parts","split","payloadB64","padded","repeat","json","atob","payload","JSON","parse","isAccessTokenExpired","_this$_authTokens","skewSeconds","scheduleContactsWsTokenRefresh","_this$_authTokens2","_this7","_contactsWsTokenTimer","clearTimeout","refreshInSec","setTimeout","scheduleContactsWsReconnect","reason","_this8","forceReAuth","_contactsWsReconnectTimer","_contactsWsReconnectAttempt","delay","pow","delayMs","_this9","_this$_authTokens3","_contactsWs","readyState","WebSocket","OPEN","CONNECTING","wsProto","location","protocol","wsHost","host","tokenParam","encodeURIComponent","wsUrl","onopen","onmessage","handleContactsWsMessage","onclose","code","authCloseCodes","Set","has","parsed","_iterator3","_step3","diffSeconds","settingName","successTest","success","href","cbBeforeSendForm","settings","form","cbAfterSendForm","Form","ready"],"sources":["src/module-monitor-active-calls-index.js"],"sourcesContent":["/*\n * Copyright (C) MIKO LLC - All Rights Reserved\n * Unauthorized copying of this file, via any medium is strictly prohibited\n * Proprietary and confidential\n * Written by Nikolay Beketov, 11 2018\n *\n */\nconst idUrl = 'module-monitor-active-calls';\nconst idForm = 'module-monitor-active-calls-form';\nconst className = 'ModuleMonitorActiveCalls';\nconst inputClassName = 'mikopbx-module-input';\n\n/* global $, globalRootUrl, globalTranslate, Form, Config, Vue, Extensions */\nconst ModuleMonitorActiveCalls = {\n\tisInit: true,\n\tcontactsCacheTtlMs: 120 * 60 * 1000,\n\tqueueNameSelector: '#app-queue div.scrolling.dropdown',\n\t$formObj: $('#'+idForm),\n\t$checkBoxes: $('#'+idForm+' .ui.checkbox'),\n\t$dropDowns: $('#'+idForm+' .ui.dropdown'),\n\tactiveChannelsUrl: globalRootUrl + idUrl + \"/getActiveChannels\",\n\tactiveChannelsUrlV2: globalRootUrl + idUrl + \"/getActiveChannelsV2\",\n\tbackendEnableUrl: globalRootUrl + idUrl + \"/backandEnable\",\n\texecuteCallUrl: globalRootUrl + idUrl + \"/executeCall\",\n\tsaveUserActionUrl: globalRootUrl + idUrl + \"/saveUser\",\n\t$widget: undefined,\n\n\t/**\n\t * Field validation rules\n\t * https://semantic-ui.com/behaviors/form.html\n\t */\n\tvalidateRules: {},\n\t/**\n\t * On page load we init some Semantic UI library\n\t */\n\tinitialize() {\n\t\tthis.initContactsCache();\n\t\tthis.requestBackendEnable();\n\n\t\t$(\"#nowUser.dropdown.enable\").dropdown({\n\t\t\tonChange: function onChange(value, text, $choice) {\n\t\t\t\twindow[className].onChangeSetting('adminUserId', value);\n\t\t\t}\n\t\t});\n\t\t$(\"#minWaitVisible.dropdown.enable\").dropdown({\n\t\t\tonChange: function onChange(value, text, $choice) {\n\t\t\t\t$('#minWaitVisibleValue').val(value);\n\t\t\t\twindow[className].onChangeSetting('minWaitVisible', value);\n\t\t\t}\n\t\t});\n\t\tlet userNumber = $('#userNumber').val();\n\n\t\twindow[className].$widgetQueues = new Vue({\n\t\t\tel: '#app-queue',\n\t\t\tdelimiters: [\"<%\",\"%>\"],\n\t\t\tmethods: {\n\t\t\t\tupdatedCallsFromResponse(data) {\n\t\t\t\t\tlet queueNameEl = $(window[className].queueNameSelector);\n\t\t\t\t\tthis.minWaitVisible = 1*$('#minWaitVisibleValue').val();\n\n\t\t\t\t\tthis.queues = data.queues;\n\t\t\t\t\tlet queueId = $('#queueId').val();\n\t\t\t\t\tif (queueId in data.queues) {\n\t\t\t\t\t\tthis.id = data.queues[queueId].id;\n\t\t\t\t\t\tthis.name = data.queues[queueId].name;\n\t\t\t\t\t\tthis.number = data.queues[queueId].number;\n\t\t\t\t\t\tthis.agents = data.queues[queueId].agents;\n\t\t\t\t\t\tthis.agentsList = this.buildAgentsList(this.agents);\n\t\t\t\t\t\tthis.calls = Array.isArray(data.queues[queueId].calls) ? data.queues[queueId].calls : [];\n\t\t\t\t\t\tthis.allCalls = data.calls;\n\t\t\t\t\t}else{\n\t\t\t\t\t\tthis.calls = [];\n\t\t\t\t\t\tthis.agentsList = [];\n\t\t\t\t\t}\n\t\t\t\t\tif(queueNameEl.dropdown('is hidden')){\n\t\t\t\t\t\tqueueNameEl.dropdown({\n\t\t\t\t\t\t\tonChange: function onChange(value, text, $choice) {\n\t\t\t\t\t\t\t\twindow[className].onChangeSetting('queueId', value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif(queueNameEl.dropdown('get value') === ''){\n\t\t\t\t\t\t\twindow[className].isInit = true;\n\t\t\t\t\t\t\tqueueNameEl.dropdown('set value', $('#queueId').val())\n\t\t\t\t\t\t\twindow[className].isInit = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Normalize Semantic UI Card typography after render\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tthis.normalizeAgentCards();\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tbuildAgentsList(agentsObj) {\n\t\t\t\t\tconst entries = Object.entries(agentsObj || {});\n\t\t\t\t\tconst available = [];\n\t\t\t\t\tconst unavailable = [];\n\t\t\t\t\tfor (const [number, agent] of entries) {\n\t\t\t\t\t\tconst state = agent?.state || '';\n\t\t\t\t\t\tconst item = { number, ...agent };\n\t\t\t\t\t\tif (state === 'Unavailable') {\n\t\t\t\t\t\t\tunavailable.push(item);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tavailable.push(item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn available.concat(unavailable);\n\t\t\t\t},\n\t\t\t\tnormalizePhone10(phone) {\n\t\t\t\t\tconst digits = String(phone || '').replace(/\\D+/g, '');\n\t\t\t\t\tif (digits.length <= 10) return digits;\n\t\t\t\t\treturn digits.slice(-10);\n\t\t\t\t},\n\t\t\t\tupdateContactFromWs(contact) {\n\t\t\t\t\tconst phone10 = this.normalizePhone10(contact?.number);\n\t\t\t\t\tif (!phone10) return;\n\t\t\t\t\tconst client = String(contact?.client || '').trim();\n\t\t\t\t\tif (!client) return;\n\t\t\t\t\t// Vue2: ensure reactivity for new keys\n\t\t\t\t\tif (this.$set) {\n\t\t\t\t\t\tthis.$set(this.contactsByPhone10, phone10, client);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.contactsByPhone10[phone10] = client;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tgetClientNameByPhone(phone) {\n\t\t\t\t\tconst phone10 = this.normalizePhone10(phone);\n\t\t\t\t\treturn this.contactsByPhone10[phone10] || '';\n\t\t\t\t},\n\t\t\t\tgetClientHeader(phone) {\n\t\t\t\t\tconst client = this.getClientNameByPhone(phone);\n\t\t\t\t\tif (!client) return phone;\n\t\t\t\t\treturn `${client} <${phone}>`;\n\t\t\t\t},\n\t\t\t\thasClientByPhone(phone) {\n\t\t\t\t\treturn !!this.getClientNameByPhone(phone);\n\t\t\t\t},\n\t\t\t\tformatElapsedTime(enterTime) {\n\t\t\t\t\treturn window[className].formatElapsedTime(enterTime);\n\t\t\t\t},\n\t\t\t\tnormalizeAgentCards() {\n\t\t\t\t\tif (!this.$el) return;\n\n\t\t\t\t\t// Cleanup artifacts from previous experiments (placeholders/spacers).\n\t\t\t\t\tconst artifacts = this.$el.querySelectorAll('.agent-peer-placeholder, .agent-peer-spacer');\n\t\t\t\t\tartifacts.forEach((el) => el.remove());\n\n\t\t\t\t\t// Dense layout (masonry) that still fills left-to-right:\n\t\t\t\t\t// flex-wrap can't place items into vertical gaps under tall cards.\n\t\t\t\t\tthis.ensureAgentCardsGridMasonry();\n\n\t\t\t\t\t// Prevent \"equal height\" cards in one row (Semantic UI cards are flex).\n\t\t\t\t\tconst cardsContainer = this.$el.querySelector('.ui.cards.agent-cards');\n\t\t\t\t\tif (cardsContainer) {\n\t\t\t\t\t\tcardsContainer.style.alignItems = 'flex-start';\n\t\t\t\t\t\tcardsContainer.style.alignContent = 'flex-start';\n\t\t\t\t\t}\n\n\t\t\t\t\tconst cards = this.$el.querySelectorAll('.ui.cards.agent-cards > .ui.card.agent-card');\n\t\t\t\t\tcards.forEach((card) => {\n\t\t\t\t\t\tcard.style.alignSelf = 'flex-start';\n\t\t\t\t\t});\n\n\t\t\t\t\t// Semantic UI makes .header bigger than normal text; we need same font size.\n\t\t\t\t\tconst headers = this.$el.querySelectorAll('.ui.card.agent-card .header.agent-card-header');\n\t\t\t\t\theaders.forEach((el) => {\n\t\t\t\t\t\tel.style.fontSize = '1em';\n\t\t\t\t\t\tel.style.lineHeight = '1.2';\n\t\t\t\t\t\tel.style.display = 'flex';\n\t\t\t\t\t\tel.style.alignItems = 'center';\n\t\t\t\t\t\tel.style.gap = '0.5em';\n\t\t\t\t\t\tel.style.whiteSpace = 'nowrap';\n\t\t\t\t\t});\n\n\t\t\t\t\tconst metas = this.$el.querySelectorAll('.ui.card.agent-card .meta.agent-peer');\n\t\t\t\t\tmetas.forEach((el) => {\n\t\t\t\t\t\tel.style.fontSize = '1em';\n\t\t\t\t\t\tel.style.lineHeight = '1.2';\n\t\t\t\t\t});\n\n\t\t\t\t\t// Normalize label/name typography so they have same text height.\n\t\t\t\t\tconst numLabels = this.$el.querySelectorAll('.ui.card.agent-card .agent-num-label');\n\t\t\t\t\tnumLabels.forEach((el) => {\n\t\t\t\t\t\tel.style.fontSize = '1em';\n\t\t\t\t\t\tel.style.lineHeight = '1.2';\n\t\t\t\t\t\tel.style.display = 'inline-flex';\n\t\t\t\t\t\tel.style.alignItems = 'center';\n\t\t\t\t\t\tel.style.paddingTop = '0';\n\t\t\t\t\t\tel.style.paddingBottom = '0';\n\t\t\t\t\t\t// Allow label to shrink (otherwise long numbers force card wider than 180px)\n\t\t\t\t\t\tel.style.flex = '0 1 auto';\n\t\t\t\t\t\tel.style.minWidth = '0';\n\t\t\t\t\t\tel.style.maxWidth = '14ch';\n\t\t\t\t\t\tel.style.overflow = 'hidden';\n\t\t\t\t\t\tel.style.textOverflow = 'ellipsis';\n\t\t\t\t\t\tel.style.whiteSpace = 'nowrap';\n\t\t\t\t\t});\n\t\t\t\t\tconst names = this.$el.querySelectorAll('.ui.card.agent-card .agent-name');\n\t\t\t\t\tnames.forEach((el) => {\n\t\t\t\t\t\tel.style.lineHeight = '1.2';\n\t\t\t\t\t\t// Ellipsis for long names (e.g. \"Салтыков-Щедрин\")\n\t\t\t\t\t\tel.style.minWidth = '0';\n\t\t\t\t\t\tel.style.flex = '1 1 auto';\n\t\t\t\t\t\tel.style.overflow = 'hidden';\n\t\t\t\t\t\tel.style.textOverflow = 'ellipsis';\n\t\t\t\t\t\tel.style.whiteSpace = 'nowrap';\n\t\t\t\t\t});\n\n\t\t\t\t\t// Grid masonry needs row-span calculation after layout.\n\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\t\tthis.layoutAgentCardsGridMasonry();\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tadjustAgentCardsGap() {\n\t\t\t\t\tif (!this.$el) return;\n\t\t\t\t\tconst container = this.$el.querySelector('.ui.cards.agent-cards');\n\t\t\t\t\tif (!container) return;\n\n\t\t\t\t\tconst cards = Array.from(container.querySelectorAll('.ui.card.agent-card'));\n\t\t\t\t\tif (!cards.length) return;\n\n\t\t\t\t\tconst tallCard = cards.find((c) => c.querySelector('.meta.agent-peer'));\n\t\t\t\t\tconst shortCard = cards.find((c) => !c.querySelector('.meta.agent-peer'));\n\t\t\t\t\tif (!tallCard || !shortCard) return;\n\n\t\t\t\t\tconst ht = tallCard.getBoundingClientRect().height;\n\t\t\t\t\tconst hs = shortCard.getBoundingClientRect().height;\n\t\t\t\t\tif (!ht || !hs) return;\n\n\t\t\t\t\t// From 2*(hs+g) = ht+g => g = ht - 2*hs\n\t\t\t\t\tlet gap = ht - 2 * hs;\n\t\t\t\t\tif (!Number.isFinite(gap)) return;\n\n\t\t\t\t\t// Clamp to sane range; negative means \"no extra gap needed\".\n\t\t\t\t\tgap = Math.max(0, Math.min(20, Math.round(gap)));\n\n\t\t\t\t\tcontainer.style.setProperty('--agent-card-gap', `${gap}px`);\n\t\t\t\t},\n\t\t\t\tadjustAgentCardsColumnCount() {\n\t\t\t\t\tif (!this.$el) return;\n\t\t\t\t\tconst container = this.$el.querySelector('.ui.cards.agent-cards.agent-cards-masonry');\n\t\t\t\t\tif (!container) return;\n\n\t\t\t\t\tconst w = container.clientWidth;\n\t\t\t\t\tif (!w) return;\n\n\t\t\t\t\t// Minimum acceptable card width in px (tune if needed)\n\t\t\t\t\tconst minCardWidth = 150;\n\n\t\t\t\t\tconst cs = window.getComputedStyle(container);\n\t\t\t\t\tconst gapRaw = cs.columnGap || cs.getPropertyValue('column-gap') || '16px';\n\t\t\t\t\tconst gapPx = parseFloat(gapRaw) || 16;\n\n\t\t\t\t\tconst count = Math.max(1, Math.min(12, Math.floor((w + gapPx) / (minCardWidth + gapPx))));\n\t\t\t\t\tcontainer.style.setProperty('--agent-card-col-count', String(count));\n\t\t\t\t},\n\t\t\t\tensureAgentCardsGridMasonry() {\n\t\t\t\t\tconst styleId = 'agent-cards-layout-style';\n\t\t\t\t\tlet styleEl = document.getElementById(styleId);\n\t\t\t\t\tif (!styleEl) {\n\t\t\t\t\t\tstyleEl = document.createElement('style');\n\t\t\t\t\t\tstyleEl.id = styleId;\n\t\t\t\t\t\tdocument.head.appendChild(styleEl);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Grid masonry: fills left-to-right and can pack items into gaps.\n\t\t\t\t\tstyleEl.textContent = `\n.ui.cards.agent-cards.agent-cards-grid {\n display: grid !important;\n grid-template-columns: repeat(auto-fill, 240px);\n justify-content: start;\n gap: var(--agent-card-gap, 8px);\n grid-auto-rows: 1px;\n /* Prevent overlap with the legend block below */\n margin-bottom: 1em !important;\n}\n.ui.cards.agent-cards.agent-cards-grid > .ui.card.agent-card {\n width: 240px !important;\n margin: 0 !important;\n overflow: hidden;\n /* reset from previous layouts */\n align-self: start;\n}\n\t\t\t\t\t`.trim();\n\n\t\t\t\t\tconst cardsContainer = this.$el && this.$el.querySelector\n\t\t\t\t\t\t? this.$el.querySelector('.ui.cards.agent-cards')\n\t\t\t\t\t\t: null;\n\t\t\t\t\tif (cardsContainer) {\n\t\t\t\t\t\tcardsContainer.classList.remove('agent-cards-masonry');\n\t\t\t\t\t\tcardsContainer.classList.remove('agent-cards-flex');\n\t\t\t\t\t\tcardsContainer.classList.add('agent-cards-grid');\n\n\t\t\t\t\t\t// Bind once: relayout on resize.\n\t\t\t\t\t\tif (!this._agentCardsResizeBound) {\n\t\t\t\t\t\t\tthis._agentCardsResizeBound = true;\n\t\t\t\t\t\t\twindow.addEventListener('resize', () => {\n\t\t\t\t\t\t\t\tthis.layoutAgentCardsGridMasonry();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tlayoutAgentCardsGridMasonry() {\n\t\t\t\t\tif (!this.$el) return;\n\t\t\t\t\tconst grid = this.$el.querySelector('.ui.cards.agent-cards.agent-cards-grid');\n\t\t\t\t\tif (!grid) return;\n\n\t\t\t\t\tconst cs = window.getComputedStyle(grid);\n\t\t\t\t\tconst rowHeight = parseFloat(cs.getPropertyValue('grid-auto-rows')) || 1;\n\t\t\t\t\tconst rowGap = parseFloat(cs.getPropertyValue('row-gap')) || parseFloat(cs.getPropertyValue('gap')) || 8;\n\n\t\t\t\t\tconst items = Array.from(grid.querySelectorAll('.ui.card.agent-card'));\n\t\t\t\t\tif (!items.length) return;\n\n\t\t\t\t\t// Reset row spans and min-heights to measure natural heights.\n\t\t\t\t\titems.forEach((item) => {\n\t\t\t\t\t\titem.style.gridRowEnd = '';\n\t\t\t\t\t\titem.style.minHeight = '';\n\t\t\t\t\t});\n\n\t\t\t\t\tconst tall = items.filter((c) => c.querySelector('.meta.agent-peer'));\n\t\t\t\t\tconst short = items.filter((c) => !c.querySelector('.meta.agent-peer'));\n\n\t\t\t\t\t// If we don't have both types, just do normal masonry spans.\n\t\t\t\t\tif (!tall.length || !short.length) {\n\t\t\t\t\t\titems.forEach((item) => {\n\t\t\t\t\t\t\tconst h = item.getBoundingClientRect().height;\n\t\t\t\t\t\t\tconst span = Math.max(1, Math.ceil((h + rowGap) / (rowHeight + rowGap)));\n\t\t\t\t\t\t\titem.style.gridRowEnd = `span ${span}`;\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst hs = Math.max(...short.map((c) => c.getBoundingClientRect().height));\n\t\t\t\t\tconst ht = Math.max(...tall.map((c) => c.getBoundingClientRect().height));\n\n\t\t\t\t\t// Want: 2*(hs + g) = (ht + g) => g = ht - 2*hs\n\t\t\t\t\tlet g = ht - 2 * hs;\n\t\t\t\t\tif (!Number.isFinite(g)) g = rowGap;\n\t\t\t\t\tg = Math.max(0, Math.min(24, Math.round(g)));\n\n\t\t\t\t\t// Apply gap and enforce min-heights so the relation holds visually.\n\t\t\t\t\tgrid.style.setProperty('--agent-card-gap', `${g}px`);\n\n\t\t\t\t\tconst shortH = Math.round(hs);\n\t\t\t\t\tconst tallH = Math.round(Math.max(ht, 2 * hs + g));\n\t\t\t\t\tshort.forEach((c) => { c.style.minHeight = `${shortH}px`; });\n\t\t\t\t\ttall.forEach((c) => { c.style.minHeight = `${tallH}px`; });\n\n\t\t\t\t\t// Now compute row spans from final rendered heights.\n\t\t\t\t\tconst effectiveGap = g;\n\t\t\t\t\titems.forEach((item) => {\n\t\t\t\t\t\tconst h = item.getBoundingClientRect().height;\n\t\t\t\t\t\tconst span = Math.max(1, Math.ceil((h + effectiveGap) / (rowHeight + effectiveGap)));\n\t\t\t\t\t\titem.style.gridRowEnd = `span ${span}`;\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tgetSrcNumForAgent(agentNumber) {\n\t\t\t\t\tlet result = '-';\n\t\t\t\t\tlet answeredFound = false;\n\t\t\t\t\tfor (const call of this.calls) {\n\t\t\t\t\t\tif(call.dst_num === agentNumber){\n\t\t\t\t\t\t\tansweredFound = true;\n\t\t\t\t\t\t\tresult = call.src_num;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (call.calledChannels && Array.isArray(call.calledChannels)) {\n\t\t\t\t\t\t\tconst match = call.calledChannels.find(ch => ch.number === agentNumber);\n\t\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\t\tresult = call.src_num;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (call.bridgeChannels && Array.isArray(call.bridgeChannels)) {\n\t\t\t\t\t\t\tconst match = call.bridgeChannels.find(ch => (ch.src_num === agentNumber || ch.dst_num === agentNumber));\n\t\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\t\tif(match.src_num === agentNumber){\n\t\t\t\t\t\t\t\t\tresult = match.dst_num;\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\tresult = match.src_num;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tansweredFound = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(answeredFound === false){\n\t\t\t\t\t\tfor (let i = 0; i < this.allCalls.length; i++) {\n\t\t\t\t\t\t\tconst tmpCall = this.allCalls[i];\n\t\t\t\t\t\t\tif(tmpCall.src_num === agentNumber){\n\t\t\t\t\t\t\t\t// Исходящий\n\t\t\t\t\t\t\t\tif(tmpCall.dst_num === ''){\n\t\t\t\t\t\t\t\t\t// не ответа, дозвон.\n\t\t\t\t\t\t\t\t\tif (tmpCall.calledChannels && Array.isArray(tmpCall.calledChannels) && tmpCall.calledChannels.length) {\n\t\t\t\t\t\t\t\t\t\tconst match = tmpCall.calledChannels.find(ch => ch.number !== agentNumber);\n\t\t\t\t\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\t\t\t\t\tresult = match.number;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}else if(tmpCall.spyer){\n\t\t\t\t\t\t\t\t\t\t// шпионит за номером.\n\t\t\t\t\t\t\t\t\t\tresult = tmpCall.spy_num;\n\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t// нет вызываемых каналов, возможно это вызов на приложение / ivr.\n\t\t\t\t\t\t\t\t\t\tresult = tmpCall.exten;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\tresult = tmpCall.dst_num;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}else if(tmpCall.dst_num === agentNumber){\n\t\t\t\t\t\t\t\t// Входящий на агента, отвечен.\n\t\t\t\t\t\t\t\tresult = tmpCall.src_num;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\tif (tmpCall.calledChannels && Array.isArray(tmpCall.calledChannels)) {\n\t\t\t\t\t\t\t\t\tconst match = tmpCall.calledChannels.find(ch => ch.number === agentNumber);\n\t\t\t\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\t\t\t\tresult = tmpCall.src_num;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t},\n\t\t\t\thasPeerPhone(agentNumber) {\n\t\t\t\t\tconst phone = String(this.getSrcNumForAgent(agentNumber) || '').trim();\n\t\t\t\t\treturn phone !== '' && phone !== '-' && phone !== '—';\n\t\t\t\t},\n\t\t\t\tgetPeerPhoneLabel(agentNumber) {\n\t\t\t\t\tconst phone = String(this.getSrcNumForAgent(agentNumber) || '').trim();\n\t\t\t\t\treturn this.hasPeerPhone(agentNumber) ? phone : '—';\n\t\t\t\t},\n\t\t\t\tgetPeerNameLabel(agentNumber) {\n\t\t\t\t\t// Use cached contacts (WS + IndexedDB) to show client name for peer phone.\n\t\t\t\t\tconst phone = this.getPeerPhoneLabel(agentNumber);\n\t\t\t\t\tconst client = this.getClientNameByPhone(phone);\n\t\t\t\t\treturn client || '—';\n\t\t\t\t}\n\t\t\t},\n\t\t\tdata: {\n\t\t\t\t\"minWaitVisible\": 30,\n\t\t\t\t\"name\": \"\",\n\t\t\t\t\"number\": \"\",\n\t\t\t\t\"queues\": [],\n\t\t\t\t\"agents\": {\n\t\t\t\t},\n\t\t\t\t\"agentsList\": [],\n\t\t\t\t\"contactsByPhone10\": {},\n\t\t\t\t\"calls\": [\n\t\t\t\t]\n\t\t\t},\n\t\t});\n\t\twindow[className].applyContactsCacheToQueueWidget();\n\n\t\twindow[className].$callsWidget = new Vue({\n\t\t\tel: '#calls',\n\t\t\tdelimiters: [\"<%\",\"%>\"],\n\t\t\tdata: {\n\t\t\t\t\"minWaitVisible\": 30,\n\t\t\t\tuserNumber: userNumber,\n\t\t\t\tfullAccess: ($('#fullAccess').val() === \"1\" || userNumber === ''),\n\t\t\t\tcalls: [\n\t\t\t\t]\n\t\t\t},\n\t\t\tmethods: {\n\t\t\t\tcallIsVisible(call){\n\t\t\t\t\tif(call.dst_chan==='' && call.queueData.EnterTime !== undefined ){\n\t\t\t\t\t\treturn this.minWaitVisible <= this.getWaitTime(call);\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t\tformatTimestampToTime(timestamp) {\n\t\t\t\t\t// Если timestamp строка — приводим к числу\n\t\t\t\t\tconst ts = typeof timestamp === 'string' ? parseFloat(timestamp) : timestamp;\n\n\t\t\t\t\t// Если timestamp в секундах (меньше 1e10), умножаем на 1000\n\t\t\t\t\tconst ms = ts < 1e10 ? ts * 1000 : ts;\n\n\t\t\t\t\tconst date = new Date(ms);\n\n\t\t\t\t\tconst hours = String(date.getHours()).padStart(2, '0');\n\t\t\t\t\tconst minutes = String(date.getMinutes()).padStart(2, '0');\n\t\t\t\t\tconst seconds = String(date.getSeconds()).padStart(2, '0');\n\n\t\t\t\t\treturn `${hours}:${minutes}:${seconds}`;\n\t\t\t\t},\n\t\t\t\tgetWaitTime(call){\n\t\t\t\t\tlet answer = Math.floor(Date.now() / 1000);\n\t\t\t\t\tif(call.answer !== ''){\n\t\t\t\t\t\tanswer = call.answer\n\t\t\t\t\t}\n\t\t\t\t\treturn window[className].secondToTime(answer - call.start);\n\t\t\t\t},\n\t\t\t\tgetCallTime(call){\n\t\t\t\t\tif(call.answer === ''){\n\t\t\t\t\t\treturn '-';\n\t\t\t\t\t}\n\t\t\t\t\treturn window[className].formatElapsedTime(call.answer);\n\t\t\t\t},\n\t\t\t\tupdatedCallsFromResponse(data) {\n\t\t\t\t\tthis.minWaitVisible = 1*$('#minWaitVisibleValue').val();\n\t\t\t\t\t// Проходим по всем очередям\n\t\t\t\t\tfor (const queueId in data.queues) {\n\t\t\t\t\t\tconst queue = data.queues[queueId];\n\t\t\t\t\t\t// Проверяем, есть ли у очереди поле calls и является ли оно массивом\n\t\t\t\t\t\tif (Array.isArray(queue.calls)) {\n\t\t\t\t\t\t\t// Добавляем все вызовы из этой очереди в общий массив\n\t\t\t\t\t\t\tdata.calls.push(...queue.calls);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.calls = data.calls;\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tExtensions.updatePhonesRepresent('need-update');\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tformatElapsedTime(enterTime) {\n\t\t\t\t\treturn window[className].formatElapsedTime(enterTime);\n\t\t\t\t},\n\t\t\t\tgetClientHeader(phone) {\n\t\t\t\t\tconst q = window[className].$widgetQueues;\n\t\t\t\t\tif (q && typeof q.getClientHeader === 'function') {\n\t\t\t\t\t\treturn q.getClientHeader(phone);\n\t\t\t\t\t}\n\t\t\t\t\treturn phone;\n\t\t\t\t},\n\t\t\t\thangupAction(event) {\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'hangup', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2')});\n\t\t\t\t},\n\t\t\t\tjoinAction(event) {\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'join', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2'), number: this.userNumber});\n\t\t\t\t},\n\t\t\t\twhisperAction(event){\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlet spChannel = target.attr('data-ch1');\n\t\t\t\t\tif('incoming' === target.attr('data-call-type')){\n\t\t\t\t\t\tspChannel = target.attr('data-ch2');\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'whisper', ch1: spChannel, ch2: '', number: this.userNumber});\n\t\t\t\t},\n\t\t\t\tlistenAction(event){\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'listen', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2'), number: this.userNumber});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\twindow[className].$widget = new Vue({\n\t\t\tel: '#app',\n\t\t\tdelimiters: [\"<%\",\"%>\"],\n\t\t\tdata: {\n\t\t\t\tuserNumber: userNumber,\n\t\t\t\tfullAccess: ($('#fullAccess').val() === \"1\" || userNumber === ''),\n\t\t\t\tcalls: [\n\t\t\t\t]\n\t\t\t},\n\t\t\tmethods: {\n\t\t\t\tupdatedCallsFromResponse(lines) {\n\t\t\t\t\tthis.calls = lines;\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tExtensions.updatePhonesRepresent('need-update');\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\thangupAction(event) {\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'hangup', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2')});\n\t\t\t\t},\n\t\t\t\tjoinAction(event) {\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'join', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2'), number: this.userNumber});\n\t\t\t\t},\n\t\t\t\twhisperAction(event){\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlet spChannel = target.attr('data-ch1');\n\t\t\t\t\tif('incoming' === target.attr('data-call-type')){\n\t\t\t\t\t\tspChannel = target.attr('data-ch2');\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'whisper', ch1: spChannel, ch2: '', number: this.userNumber});\n\t\t\t\t},\n\t\t\t\tlistenAction(event){\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'listen', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2'), number: this.userNumber});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\twindow[className].$checkBoxes.checkbox();\n\t\twindow[className].$dropDowns.dropdown();\n\t\twindow[className].initializeForm();\n\t\t$('.menu .item').tab();\n\t\t//////\n\t\t// Удаляем отступы контейнера.\n\t\t$('#main-content-container').removeClass('container');\n\t\t$('#module-status-toggle-segment').hide();\n\t\t$('.ui.clearing.hidden.divider').remove();\n\t\t// Окончание форматирования базовой страницы\n\t\t//////\n\t\twindow[className].updateLines();\n\t\tsetInterval(window[className].updateLines, 2000);\n\t},\n\tasync initContactsCache() {\n\t\ttry {\n\t\t\tthis._contactsCacheByPhone10 = await this.idbLoadAllContacts();\n\t\t\tthis.applyContactsCacheToQueueWidget();\n\t\t} catch (e) {\n\t\t\tconsole.log('contacts cache init error', e);\n\t\t\tthis._contactsCacheByPhone10 = {};\n\t\t}\n\t},\n\tapplyContactsCacheToQueueWidget() {\n\t\tif (!this._contactsCacheByPhone10) return;\n\t\tif (!window[className].$widgetQueues) return;\n\t\tfor (const [phone10, client] of Object.entries(this._contactsCacheByPhone10)) {\n\t\t\tif (window[className].$widgetQueues.$set) {\n\t\t\t\twindow[className].$widgetQueues.$set(window[className].$widgetQueues.contactsByPhone10, phone10, client);\n\t\t\t} else {\n\t\t\t\twindow[className].$widgetQueues.contactsByPhone10[phone10] = client;\n\t\t\t}\n\t\t}\n\t},\n\tidbOpenContactsDb() {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\ttry {\n\t\t\t\tconst req = indexedDB.open('ModuleMonitorActiveCalls', 1);\n\t\t\t\treq.onupgradeneeded = () => {\n\t\t\t\t\tconst db = req.result;\n\t\t\t\t\tif (!db.objectStoreNames.contains('contactsByPhone10')) {\n\t\t\t\t\t\tdb.createObjectStore('contactsByPhone10', { keyPath: 'phone10' });\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\treq.onsuccess = () => resolve(req.result);\n\t\t\t\treq.onerror = () => reject(req.error);\n\t\t\t} catch (e) {\n\t\t\t\treject(e);\n\t\t\t}\n\t\t});\n\t},\n\tasync idbPutContact(phone10, client) {\n\t\tconst db = await this.idbOpenContactsDb();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst tx = db.transaction('contactsByPhone10', 'readwrite');\n\t\t\tconst store = tx.objectStore('contactsByPhone10');\n\t\t\tstore.put({ phone10, client, updatedAt: Date.now() });\n\t\t\ttx.oncomplete = () => { db.close(); resolve(); };\n\t\t\ttx.onerror = () => { const err = tx.error; db.close(); reject(err); };\n\t\t});\n\t},\n\tasync idbLoadAllContacts() {\n\t\tconst db = await this.idbOpenContactsDb();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst tx = db.transaction('contactsByPhone10', 'readwrite');\n\t\t\tconst store = tx.objectStore('contactsByPhone10');\n\t\t\tconst req = store.getAll();\n\t\t\treq.onsuccess = () => {\n\t\t\t\tconst map = {};\n\t\t\t\tconst now = Date.now();\n\t\t\t\tconst ttlMs = Number(this.contactsCacheTtlMs) || (120 * 60 * 1000);\n\t\t\t\tfor (const row of req.result || []) {\n\t\t\t\t\tconst phone10 = row?.phone10;\n\t\t\t\t\tconst client = row?.client;\n\t\t\t\t\tconst updatedAt = Number(row?.updatedAt) || 0;\n\t\t\t\t\tconst isFresh = phone10 && client && updatedAt > 0 && (now - updatedAt) <= ttlMs;\n\t\t\t\t\tif (isFresh) {\n\t\t\t\t\t\tmap[phone10] = client;\n\t\t\t\t\t} else if (phone10) {\n\t\t\t\t\t\t// Cleanup expired/broken records\n\t\t\t\t\t\ttry { store.delete(phone10); } catch (e) { /* ignore */ }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttx.oncomplete = () => { db.close(); resolve(map); };\n\t\t\t\ttx.onerror = () => { const err = tx.error; db.close(); reject(err); };\n\t\t\t};\n\t\t\treq.onerror = () => { const err = req.error; db.close(); reject(err); };\n\t\t});\n\t},\n\trequestBackendEnable() {\n\t\t$.api({\n\t\t\turl: window[className].backendEnableUrl,\n\t\t\ton: 'now',\n\t\t\tmethod: 'POST',\n\t\t\tonSuccess(response) {\n\t\t\t\tconsole.log('backandEnable response', response);\n\t\t\t\tconst accessToken = response?.data?.access_token;\n\t\t\t\tconst refreshToken = response?.data?.refresh_token;\n\t\t\t\tif (accessToken && refreshToken) {\n\t\t\t\t\twindow[className].setAuthTokens(accessToken, refreshToken);\n\t\t\t\t\twindow[className].connectContactsWs();\n\t\t\t\t}\n\t\t\t},\n\t\t\tonFailure(response) {\n\t\t\t\tconsole.log('backandEnable failure', response);\n\t\t\t},\n\t\t\tonError(errorMessage, element, xhr) {\n\t\t\t\tconsole.log('backandEnable error', errorMessage, xhr);\n\t\t\t}\n\t\t});\n\t},\n\tsetAuthTokens(accessToken, refreshToken) {\n\t\tthis._authTokens = this._authTokens || {};\n\t\tthis._authTokens.access_token = accessToken;\n\t\tthis._authTokens.refresh_token = refreshToken;\n\t\tthis._authTokens.exp = this.getJwtExp(accessToken);\n\t},\n\tgetJwtExp(token) {\n\t\ttry {\n\t\t\tif (!token || typeof token !== 'string') return 0;\n\t\t\tconst parts = token.split('.');\n\t\t\tif (parts.length < 2) return 0;\n\t\t\tconst payloadB64 = parts[1].replace(/-/g, '+').replace(/_/g, '/');\n\t\t\tconst padded = payloadB64 + '='.repeat((4 - (payloadB64.length % 4)) % 4);\n\t\t\tconst json = atob(padded);\n\t\t\tconst payload = JSON.parse(json);\n\t\t\treturn Number(payload?.exp) || 0;\n\t\t} catch (e) {\n\t\t\treturn 0;\n\t\t}\n\t},\n\tisAccessTokenExpired(skewSeconds = 0) {\n\t\tconst exp = Number(this._authTokens?.exp) || 0;\n\t\tif (!exp) return false; // unknown exp -> don't force refresh\n\t\tconst now = Math.floor(Date.now() / 1000);\n\t\treturn now + skewSeconds >= exp;\n\t},\n\tscheduleContactsWsTokenRefresh() {\n\t\t// Proactively refresh token shortly before expiry by re-requesting backendEnable.\n\t\tif (this._contactsWsTokenTimer) {\n\t\t\tclearTimeout(this._contactsWsTokenTimer);\n\t\t\tthis._contactsWsTokenTimer = null;\n\t\t}\n\t\tconst exp = Number(this._authTokens?.exp) || 0;\n\t\tif (!exp) return;\n\t\tconst now = Math.floor(Date.now() / 1000);\n\t\tconst refreshInSec = Math.max(1, exp - now - 15); // 15s before exp\n\t\tthis._contactsWsTokenTimer = setTimeout(() => {\n\t\t\t// Re-get tokens and reconnect WS\n\t\t\tthis.requestBackendEnable();\n\t\t}, refreshInSec * 1000);\n\t},\n\tscheduleContactsWsReconnect(reason, forceReAuth = false) {\n\t\tif (this._contactsWsReconnectTimer) {\n\t\t\tclearTimeout(this._contactsWsReconnectTimer);\n\t\t\tthis._contactsWsReconnectTimer = null;\n\t\t}\n\t\tthis._contactsWsReconnectAttempt = (this._contactsWsReconnectAttempt || 0) + 1;\n\t\tconst delay = Math.min(30000, 1000 * Math.pow(2, Math.min(5, this._contactsWsReconnectAttempt - 1)));\n\t\tthis._contactsWsReconnectTimer = setTimeout(() => {\n\t\t\tif (forceReAuth || this.isAccessTokenExpired(5)) {\n\t\t\t\tthis.requestBackendEnable();\n\t\t\t} else {\n\t\t\t\tthis.connectContactsWs();\n\t\t\t}\n\t\t}, delay);\n\t\tconsole.log('contacts ws reconnect scheduled', { reason, delayMs: delay });\n\t},\n\tconnectContactsWs() {\n\t\ttry {\n\t\t\tconst accessToken = this._authTokens?.access_token;\n\t\t\tif (!accessToken) return;\n\n\t\t\t// Avoid reconnecting if already connected/connecting\n\t\t\tif (this._contactsWs && (this._contactsWs.readyState === WebSocket.OPEN || this._contactsWs.readyState === WebSocket.CONNECTING)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Reset backoff on explicit connect attempt\n\t\t\tthis._contactsWsReconnectAttempt = 0;\n\n\t\t\tconst wsProto = window.location.protocol === 'https:' ? 'wss' : 'ws';\n\t\t\tconst wsHost = window.location.host; // host:port of current page\n\t\t\tconst tokenParam = encodeURIComponent(accessToken);\n\t\t\tconst wsUrl = `${wsProto}://${wsHost}/pbxcore/api/module-softphone-backend/v1/sub/contacts?authorization=${tokenParam}`;\n\n\t\t\tthis._contactsWs = new WebSocket(wsUrl);\n\t\t\tthis._contactsWs.onopen = () => {\n\t\t\t\tconsole.log('contacts ws connected');\n\t\t\t\tthis.scheduleContactsWsTokenRefresh();\n\t\t\t};\n\t\t\tthis._contactsWs.onmessage = (event) => {\n\t\t\t\tthis.handleContactsWsMessage(event?.data);\n\t\t\t};\n\t\t\tthis._contactsWs.onerror = (event) => {\n\t\t\t\tconsole.log('contacts ws error', event);\n\t\t\t};\n\t\t\tthis._contactsWs.onclose = (event) => {\n\t\t\t\tconst code = event?.code;\n\t\t\t\tconst reason = event?.reason;\n\t\t\t\tconsole.log('contacts ws closed', { code, reason });\n\n\t\t\t\tif (this._contactsWsTokenTimer) {\n\t\t\t\t\tclearTimeout(this._contactsWsTokenTimer);\n\t\t\t\t\tthis._contactsWsTokenTimer = null;\n\t\t\t\t}\n\n\t\t\t\t// 1000 = normal close -> reconnect; auth closes vary by server implementation.\n\t\t\t\tconst authCloseCodes = new Set([1008, 4001, 4401, 4403]);\n\t\t\t\tconst forceReAuth = authCloseCodes.has(code) || this.isAccessTokenExpired(0);\n\t\t\t\tthis.scheduleContactsWsReconnect('close', forceReAuth);\n\t\t\t};\n\t\t} catch (e) {\n\t\t\tconsole.log('contacts ws init error', e);\n\t\t\tthis.scheduleContactsWsReconnect('init_error', this.isAccessTokenExpired(0));\n\t\t}\n\t},\n\thandleContactsWsMessage(data) {\n\t\ttry {\n\t\t\tif (!data) return;\n\t\t\tconst parsed = typeof data === 'string' ? JSON.parse(data) : data;\n\t\t\tconst items = Array.isArray(parsed) ? parsed : [parsed];\n\t\t\tfor (const item of items) {\n\t\t\t\tconst digits = String(item?.number || '').replace(/\\D+/g, '');\n\t\t\t\tconst phone10 = digits.length <= 10 ? digits : digits.slice(-10);\n\t\t\t\tconst client = String(item?.client || '').trim();\n\t\t\t\tif (phone10 && client) {\n\t\t\t\t\tthis._contactsCacheByPhone10 = this._contactsCacheByPhone10 || {};\n\t\t\t\t\tthis._contactsCacheByPhone10[phone10] = client;\n\t\t\t\t\tthis.idbPutContact(phone10, client).catch((e) => console.log('contacts cache save error', e));\n\t\t\t\t}\n\t\t\t\tif (window[className].$widgetQueues) {\n\t\t\t\t\twindow[className].$widgetQueues.updateContactFromWs(item);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log('contacts ws parse error', e);\n\t\t}\n\t},\n\tformatElapsedTime(enterTime) {\n\t\tif (!enterTime) return '—';\n\n\t\tconst now = Math.floor(Date.now() / 1000);\n\t\tconst diffSeconds = now - enterTime;\n\n\t\treturn window[className].secondToTime(diffSeconds);\n\t},\n\tsecondToTime(diffSeconds){\n\t\tif (diffSeconds < 0) return '0';\n\t\t// Форматируем: чч:мм:сс или мм:сс, или просто секунды\n\t\tconst hours = Math.floor(diffSeconds / 3600);\n\t\tconst minutes = Math.floor((diffSeconds % 3600) / 60);\n\t\tconst seconds = Math.round(diffSeconds % 60);\n\t\tif (hours > 0) {\n\t\t\treturn `${hours}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n\t\t} else if (minutes > 0) {\n\t\t\treturn `${minutes}:${seconds.toString().padStart(2, '0')}`;\n\t\t} else {\n\t\t\treturn `${seconds}`;\n\t\t}\n\t},\n\tonChangeSetting(settingName, value) {\n\t\tif(window[className].isInit){\n\t\t\treturn;\n\t\t}\n\t\tlet data = {\n\t\t\t[settingName]: value\n\t\t};\n\t\t$.api({\n\t\t\turl: window[className].saveUserActionUrl,\n\t\t\ton: 'now',\n\t\t\tmethod: 'POST',\n\t\t\tdata: data,\n\t\t\tsuccessTest(response) {\n\t\t\t\treturn response !== undefined && Object.keys(response).length > 0 && response.success === true;\n\t\t\t},\n\t\t\tonSuccess(response) {\n\t\t\t\tif(settingName === 'queueId'){\n\t\t\t\t\t$('#queueId').val($(window[className].queueNameSelector).dropdown('get value'));\n\t\t\t\t}else if( settingName === 'adminUserId'){\n\t\t\t\t\twindow.location.href = window.location.href;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonFailure(response) {\n\t\t\t\tconsole.log(response);\n\t\t\t},\n\t\t\tonError(errorMessage, element, xhr) {\n\t\t\t\tconsole.log(errorMessage,xhr);\n\t\t\t}\n\t\t});\n\t},\n\texecuteCallAction(data) {\n\t\t$.api({\n\t\t\turl: window[className].executeCallUrl,\n\t\t\ton: 'now',\n\t\t\tmethod: 'POST',\n\t\t\tdata: data,\n\t\t\tsuccessTest(response) {\n\t\t\t\treturn response !== undefined && Object.keys(response).length > 0 && response.success === true;\n\t\t\t},\n\t\t\tonSuccess(response) {\n\t\t\t\tconsole.log(response);\n\t\t\t},\n\t\t\tonFailure(response) {\n\t\t\t\tconsole.log(response);\n\t\t\t},\n\t\t\tonError(errorMessage, element, xhr) {\n\t\t\t\tconsole.log(errorMessage,xhr);\n\t\t\t}\n\t\t});\n\t},\n\tupdateLines() {\n\t\t$.api({\n\t\t\turl: window[className].activeChannelsUrlV2,\n\t\t\ton: 'now',\n\t\t\tmethod: 'POST',\n\t\t\tsuccessTest(response) {\n\t\t\t\treturn response !== undefined && Object.keys(response).length > 0 && response.success === true;\n\t\t\t},\n\t\t\tonSuccess(response) {\n\t\t\t\twindow[className].$widgetQueues.updatedCallsFromResponse(response);\n\t\t\t\twindow[className].$callsWidget.updatedCallsFromResponse(response);\n\t\t\t},\n\t\t\tonFailure(response) {\n\t\t\t\tconsole.log(response);\n\t\t\t},\n\t\t\tonError(errorMessage, element, xhr) {\n\t\t\t\tconsole.log(errorMessage,xhr);\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * We can modify some data before form send\n\t * @param settings\n\t * @returns {*}\n\t */\n\tcbBeforeSendForm(settings) {\n\t\tconst result = settings;\n\t\tresult.data = window[className].$formObj.form('get values');\n\t\treturn result;\n\t},\n\t/**\n\t * Some actions after forms send\n\t */\n\tcbAfterSendForm() {\n\n\t},\n\t/**\n\t * Initialize form parameters\n\t */\n\tinitializeForm() {\n\t\tForm.$formObj = window[className].$formObj;\n\t\tForm.url = `${globalRootUrl}${idUrl}/save`;\n\t\tForm.validateRules = window[className].validateRules;\n\t\tForm.cbBeforeSendForm = window[className].cbBeforeSendForm;\n\t\tForm.cbAfterSendForm = window[className].cbAfterSendForm;\n\t\tForm.initialize();\n\t},\n};\n\n$(document).ready(() => {\n\twindow[className].initialize();\n});\n\n"],"mappings":";;;0BACA,uKAAAA,CAAA,EAAAC,CAAA,EAAAC,CAAA,wBAAAC,MAAA,GAAAA,MAAA,OAAAC,CAAA,GAAAF,CAAA,CAAAG,QAAA,kBAAAC,CAAA,GAAAJ,CAAA,CAAAK,WAAA,8BAAAC,EAAAN,CAAA,EAAAE,CAAA,EAAAE,CAAA,EAAAE,CAAA,QAAAC,CAAA,GAAAL,CAAA,IAAAA,CAAA,CAAAM,SAAA,YAAAC,SAAA,GAAAP,CAAA,GAAAO,SAAA,EAAAC,CAAA,GAAAC,MAAA,CAAAC,MAAA,CAAAL,CAAA,CAAAC,SAAA,UAAAK,mBAAA,CAAAH,CAAA,uBAAAV,CAAA,EAAAE,CAAA,EAAAE,CAAA,QAAAE,CAAA,EAAAC,CAAA,EAAAG,CAAA,EAAAI,CAAA,MAAAC,CAAA,GAAAX,CAAA,QAAAY,CAAA,OAAAC,CAAA,KAAAF,CAAA,KAAAb,CAAA,KAAAgB,CAAA,EAAApB,CAAA,EAAAqB,CAAA,EAAAC,CAAA,EAAAN,CAAA,EAAAM,CAAA,CAAAC,IAAA,CAAAvB,CAAA,MAAAsB,CAAA,WAAAA,EAAArB,CAAA,EAAAC,CAAA,WAAAM,CAAA,GAAAP,CAAA,EAAAQ,CAAA,MAAAG,CAAA,GAAAZ,CAAA,EAAAmB,CAAA,CAAAf,CAAA,GAAAF,CAAA,EAAAmB,CAAA,gBAAAC,EAAApB,CAAA,EAAAE,CAAA,SAAAK,CAAA,GAAAP,CAAA,EAAAU,CAAA,GAAAR,CAAA,EAAAH,CAAA,OAAAiB,CAAA,IAAAF,CAAA,KAAAV,CAAA,IAAAL,CAAA,GAAAgB,CAAA,CAAAO,MAAA,EAAAvB,CAAA,UAAAK,CAAA,EAAAE,CAAA,GAAAS,CAAA,CAAAhB,CAAA,GAAAqB,CAAA,GAAAH,CAAA,CAAAF,CAAA,EAAAQ,CAAA,GAAAjB,CAAA,KAAAN,CAAA,QAAAI,CAAA,GAAAmB,CAAA,KAAArB,CAAA,MAAAQ,CAAA,GAAAJ,CAAA,EAAAC,CAAA,GAAAD,CAAA,YAAAC,CAAA,WAAAD,CAAA,MAAAA,CAAA,MAAAR,CAAA,IAAAQ,CAAA,OAAAc,CAAA,MAAAhB,CAAA,GAAAJ,CAAA,QAAAoB,CAAA,GAAAd,CAAA,QAAAC,CAAA,MAAAU,CAAA,CAAAC,CAAA,GAAAhB,CAAA,EAAAe,CAAA,CAAAf,CAAA,GAAAI,CAAA,OAAAc,CAAA,GAAAG,CAAA,KAAAnB,CAAA,GAAAJ,CAAA,QAAAM,CAAA,MAAAJ,CAAA,IAAAA,CAAA,GAAAqB,CAAA,MAAAjB,CAAA,MAAAN,CAAA,EAAAM,CAAA,MAAAJ,CAAA,EAAAe,CAAA,CAAAf,CAAA,GAAAqB,CAAA,EAAAhB,CAAA,cAAAH,CAAA,IAAAJ,CAAA,aAAAmB,CAAA,QAAAH,CAAA,OAAAd,CAAA,qBAAAE,CAAA,EAAAW,CAAA,EAAAQ,CAAA,QAAAT,CAAA,YAAAU,SAAA,uCAAAR,CAAA,UAAAD,CAAA,IAAAK,CAAA,CAAAL,CAAA,EAAAQ,CAAA,GAAAhB,CAAA,GAAAQ,CAAA,EAAAL,CAAA,GAAAa,CAAA,GAAAxB,CAAA,GAAAQ,CAAA,OAAAT,CAAA,GAAAY,CAAA,MAAAM,CAAA,KAAAV,CAAA,KAAAC,CAAA,GAAAA,CAAA,QAAAA,CAAA,SAAAU,CAAA,CAAAf,CAAA,QAAAkB,CAAA,CAAAb,CAAA,EAAAG,CAAA,KAAAO,CAAA,CAAAf,CAAA,GAAAQ,CAAA,GAAAO,CAAA,CAAAC,CAAA,GAAAR,CAAA,aAAAI,CAAA,MAAAR,CAAA,QAAAC,CAAA,KAAAH,CAAA,YAAAL,CAAA,GAAAO,CAAA,CAAAF,CAAA,WAAAL,CAAA,GAAAA,CAAA,CAAA0B,IAAA,CAAAnB,CAAA,EAAAI,CAAA,UAAAc,SAAA,2CAAAzB,CAAA,CAAA2B,IAAA,SAAA3B,CAAA,EAAAW,CAAA,GAAAX,CAAA,CAAA4B,KAAA,EAAApB,CAAA,SAAAA,CAAA,oBAAAA,CAAA,KAAAR,CAAA,GAAAO,CAAA,eAAAP,CAAA,CAAA0B,IAAA,CAAAnB,CAAA,GAAAC,CAAA,SAAAG,CAAA,GAAAc,SAAA,uCAAApB,CAAA,gBAAAG,CAAA,OAAAD,CAAA,GAAAR,CAAA,cAAAC,CAAA,IAAAiB,CAAA,GAAAC,CAAA,CAAAf,CAAA,QAAAQ,CAAA,GAAAV,CAAA,CAAAyB,IAAA,CAAAvB,CAAA,EAAAe,CAAA,OAAAE,CAAA,kBAAApB,CAAA,IAAAO,CAAA,GAAAR,CAAA,EAAAS,CAAA,MAAAG,CAAA,GAAAX,CAAA,cAAAe,CAAA,mBAAAa,KAAA,EAAA5B,CAAA,EAAA2B,IAAA,EAAAV,CAAA,SAAAhB,CAAA,EAAAI,CAAA,EAAAE,CAAA,QAAAI,CAAA,QAAAS,CAAA,gBAAAV,UAAA,cAAAmB,kBAAA,cAAAC,2BAAA,KAAA9B,CAAA,GAAAY,MAAA,CAAAmB,cAAA,MAAAvB,CAAA,MAAAL,CAAA,IAAAH,CAAA,CAAAA,CAAA,IAAAG,CAAA,SAAAW,mBAAA,CAAAd,CAAA,OAAAG,CAAA,iCAAAH,CAAA,GAAAW,CAAA,GAAAmB,0BAAA,CAAArB,SAAA,GAAAC,SAAA,CAAAD,SAAA,GAAAG,MAAA,CAAAC,MAAA,CAAAL,CAAA,YAAAO,EAAAhB,CAAA,WAAAa,MAAA,CAAAoB,cAAA,GAAApB,MAAA,CAAAoB,cAAA,CAAAjC,CAAA,EAAA+B,0BAAA,KAAA/B,CAAA,CAAAkC,SAAA,GAAAH,0BAAA,EAAAhB,mBAAA,CAAAf,CAAA,EAAAM,CAAA,yBAAAN,CAAA,CAAAU,SAAA,GAAAG,MAAA,CAAAC,MAAA,CAAAF,CAAA,GAAAZ,CAAA,WAAA8B,iBAAA,CAAApB,SAAA,GAAAqB,0BAAA,EAAAhB,mBAAA,CAAAH,CAAA,iBAAAmB,0BAAA,GAAAhB,mBAAA,CAAAgB,0BAAA,iBAAAD,iBAAA,GAAAA,iBAAA,CAAAK,WAAA,wBAAApB,mBAAA,CAAAgB,0BAAA,EAAAzB,CAAA,wBAAAS,mBAAA,CAAAH,CAAA,GAAAG,mBAAA,CAAAH,CAAA,EAAAN,CAAA,gBAAAS,mBAAA,CAAAH,CAAA,EAAAR,CAAA,iCAAAW,mBAAA,CAAAH,CAAA,8DAAAwB,YAAA,YAAAA,aAAA,aAAAC,CAAA,EAAA7B,CAAA,EAAA8B,CAAA,EAAAtB,CAAA;AAAA,SAAAD,oBAAAf,CAAA,EAAAE,CAAA,EAAAE,CAAA,EAAAH,CAAA,QAAAO,CAAA,GAAAK,MAAA,CAAA0B,cAAA,QAAA/B,CAAA,uBAAAR,CAAA,IAAAQ,CAAA,QAAAO,mBAAA,YAAAyB,mBAAAxC,CAAA,EAAAE,CAAA,EAAAE,CAAA,EAAAH,CAAA,aAAAK,EAAAJ,CAAA,EAAAE,CAAA,IAAAW,mBAAA,CAAAf,CAAA,EAAAE,CAAA,YAAAF,CAAA,gBAAAyC,OAAA,CAAAvC,CAAA,EAAAE,CAAA,EAAAJ,CAAA,SAAAE,CAAA,GAAAM,CAAA,GAAAA,CAAA,CAAAR,CAAA,EAAAE,CAAA,IAAA2B,KAAA,EAAAzB,CAAA,EAAAsC,UAAA,GAAAzC,CAAA,EAAA0C,YAAA,GAAA1C,CAAA,EAAA2C,QAAA,GAAA3C,CAAA,MAAAD,CAAA,CAAAE,CAAA,IAAAE,CAAA,IAAAE,CAAA,aAAAA,CAAA,cAAAA,CAAA,mBAAAS,mBAAA,CAAAf,CAAA,EAAAE,CAAA,EAAAE,CAAA,EAAAH,CAAA;AAAA,SAAA4C,mBAAAzC,CAAA,EAAAH,CAAA,EAAAD,CAAA,EAAAE,CAAA,EAAAI,CAAA,EAAAe,CAAA,EAAAZ,CAAA,cAAAD,CAAA,GAAAJ,CAAA,CAAAiB,CAAA,EAAAZ,CAAA,GAAAG,CAAA,GAAAJ,CAAA,CAAAqB,KAAA,WAAAzB,CAAA,gBAAAJ,CAAA,CAAAI,CAAA,KAAAI,CAAA,CAAAoB,IAAA,GAAA3B,CAAA,CAAAW,CAAA,IAAAkC,OAAA,CAAAC,OAAA,CAAAnC,CAAA,EAAAoC,IAAA,CAAA9C,CAAA,EAAAI,CAAA;AAAA,SAAA2C,kBAAA7C,CAAA,6BAAAH,CAAA,SAAAD,CAAA,GAAAkD,SAAA,aAAAJ,OAAA,WAAA5C,CAAA,EAAAI,CAAA,QAAAe,CAAA,GAAAjB,CAAA,CAAA+C,KAAA,CAAAlD,CAAA,EAAAD,CAAA,YAAAoD,MAAAhD,CAAA,IAAAyC,kBAAA,CAAAxB,CAAA,EAAAnB,CAAA,EAAAI,CAAA,EAAA8C,KAAA,EAAAC,MAAA,UAAAjD,CAAA,cAAAiD,OAAAjD,CAAA,IAAAyC,kBAAA,CAAAxB,CAAA,EAAAnB,CAAA,EAAAI,CAAA,EAAA8C,KAAA,EAAAC,MAAA,WAAAjD,CAAA,KAAAgD,KAAA;AAAA,SAAAE,2BAAApD,CAAA,EAAAF,CAAA,QAAAC,CAAA,yBAAAE,MAAA,IAAAD,CAAA,CAAAC,MAAA,CAAAE,QAAA,KAAAH,CAAA,qBAAAD,CAAA,QAAAsD,KAAA,CAAAC,OAAA,CAAAtD,CAAA,MAAAD,CAAA,GAAAwD,2BAAA,CAAAvD,CAAA,MAAAF,CAAA,IAAAE,CAAA,uBAAAA,CAAA,CAAAsB,MAAA,IAAAvB,CAAA,KAAAC,CAAA,GAAAD,CAAA,OAAAyD,EAAA,MAAAC,CAAA,YAAAA,EAAA,eAAAC,CAAA,EAAAD,CAAA,EAAAvD,CAAA,WAAAA,EAAA,WAAAsD,EAAA,IAAAxD,CAAA,CAAAsB,MAAA,KAAAI,IAAA,WAAAA,IAAA,MAAAC,KAAA,EAAA3B,CAAA,CAAAwD,EAAA,UAAA1D,CAAA,WAAAA,EAAAE,CAAA,UAAAA,CAAA,KAAAc,CAAA,EAAA2C,CAAA,gBAAAjC,SAAA,iJAAApB,CAAA,EAAAe,CAAA,OAAAT,CAAA,gBAAAgD,CAAA,WAAAA,EAAA,IAAA3D,CAAA,GAAAA,CAAA,CAAA0B,IAAA,CAAAzB,CAAA,MAAAE,CAAA,WAAAA,EAAA,QAAAF,CAAA,GAAAD,CAAA,CAAA4D,IAAA,WAAAxC,CAAA,GAAAnB,CAAA,CAAA0B,IAAA,EAAA1B,CAAA,KAAAF,CAAA,WAAAA,EAAAE,CAAA,IAAAU,CAAA,OAAAN,CAAA,GAAAJ,CAAA,KAAAc,CAAA,WAAAA,EAAA,UAAAK,CAAA,YAAApB,CAAA,cAAAA,CAAA,8BAAAW,CAAA,QAAAN,CAAA;AAAA,SAAAwD,mBAAA5D,CAAA,WAAA6D,kBAAA,CAAA7D,CAAA,KAAA8D,gBAAA,CAAA9D,CAAA,KAAAuD,2BAAA,CAAAvD,CAAA,KAAA+D,kBAAA;AAAA,SAAAA,mBAAA,cAAAvC,SAAA;AAAA,SAAAsC,iBAAA9D,CAAA,8BAAAC,MAAA,YAAAD,CAAA,CAAAC,MAAA,CAAAE,QAAA,aAAAH,CAAA,uBAAAqD,KAAA,CAAAW,IAAA,CAAAhE,CAAA;AAAA,SAAA6D,mBAAA7D,CAAA,QAAAqD,KAAA,CAAAC,OAAA,CAAAtD,CAAA,UAAAiE,iBAAA,CAAAjE,CAAA;AAAA,SAAAkE,QAAApE,CAAA,EAAAE,CAAA,QAAAD,CAAA,GAAAY,MAAA,CAAAwD,IAAA,CAAArE,CAAA,OAAAa,MAAA,CAAAyD,qBAAA,QAAAhE,CAAA,GAAAO,MAAA,CAAAyD,qBAAA,CAAAtE,CAAA,GAAAE,CAAA,KAAAI,CAAA,GAAAA,CAAA,CAAAiE,MAAA,WAAArE,CAAA,WAAAW,MAAA,CAAA2D,wBAAA,CAAAxE,CAAA,EAAAE,CAAA,EAAAwC,UAAA,OAAAzC,CAAA,CAAAwE,IAAA,CAAAtB,KAAA,CAAAlD,CAAA,EAAAK,CAAA,YAAAL,CAAA;AAAA,SAAAyE,cAAA1E,CAAA,aAAAE,CAAA,MAAAA,CAAA,GAAAgD,SAAA,CAAA1B,MAAA,EAAAtB,CAAA,UAAAD,CAAA,WAAAiD,SAAA,CAAAhD,CAAA,IAAAgD,SAAA,CAAAhD,CAAA,QAAAA,CAAA,OAAAkE,OAAA,CAAAvD,MAAA,CAAAZ,CAAA,OAAA0E,OAAA,WAAAzE,CAAA,IAAA0E,eAAA,CAAA5E,CAAA,EAAAE,CAAA,EAAAD,CAAA,CAAAC,CAAA,SAAAW,MAAA,CAAAgE,yBAAA,GAAAhE,MAAA,CAAAiE,gBAAA,CAAA9E,CAAA,EAAAa,MAAA,CAAAgE,yBAAA,CAAA5E,CAAA,KAAAmE,OAAA,CAAAvD,MAAA,CAAAZ,CAAA,GAAA0E,OAAA,WAAAzE,CAAA,IAAAW,MAAA,CAAA0B,cAAA,CAAAvC,CAAA,EAAAE,CAAA,EAAAW,MAAA,CAAA2D,wBAAA,CAAAvE,CAAA,EAAAC,CAAA,iBAAAF,CAAA;AAAA,SAAA4E,gBAAA5E,CAAA,EAAAE,CAAA,EAAAD,CAAA,YAAAC,CAAA,GAAA6E,cAAA,CAAA7E,CAAA,MAAAF,CAAA,GAAAa,MAAA,CAAA0B,cAAA,CAAAvC,CAAA,EAAAE,CAAA,IAAA2B,KAAA,EAAA5B,CAAA,EAAAyC,UAAA,MAAAC,YAAA,MAAAC,QAAA,UAAA5C,CAAA,CAAAE,CAAA,IAAAD,CAAA,EAAAD,CAAA;AAAA,SAAA+E,eAAA9E,CAAA,QAAAO,CAAA,GAAAwE,YAAA,CAAA/E,CAAA,gCAAAgF,OAAA,CAAAzE,CAAA,IAAAA,CAAA,GAAAA,CAAA;AAAA,SAAAwE,aAAA/E,CAAA,EAAAC,CAAA,oBAAA+E,OAAA,CAAAhF,CAAA,MAAAA,CAAA,SAAAA,CAAA,MAAAD,CAAA,GAAAC,CAAA,CAAAE,MAAA,CAAA+E,WAAA,kBAAAlF,CAAA,QAAAQ,CAAA,GAAAR,CAAA,CAAA2B,IAAA,CAAA1B,CAAA,EAAAC,CAAA,gCAAA+E,OAAA,CAAAzE,CAAA,UAAAA,CAAA,YAAAkB,SAAA,yEAAAxB,CAAA,GAAAiF,MAAA,GAAAC,MAAA,EAAAnF,CAAA;AAAA,SAAAoF,eAAAnF,CAAA,EAAAF,CAAA,WAAAsF,eAAA,CAAApF,CAAA,KAAAqF,qBAAA,CAAArF,CAAA,EAAAF,CAAA,KAAAyD,2BAAA,CAAAvD,CAAA,EAAAF,CAAA,KAAAwF,gBAAA;AAAA,SAAAA,iBAAA,cAAA9D,SAAA;AAAA,SAAA+B,4BAAAvD,CAAA,EAAAmB,CAAA,QAAAnB,CAAA,2BAAAA,CAAA,SAAAiE,iBAAA,CAAAjE,CAAA,EAAAmB,CAAA,OAAApB,CAAA,MAAAwF,QAAA,CAAA9D,IAAA,CAAAzB,CAAA,EAAAwF,KAAA,6BAAAzF,CAAA,IAAAC,CAAA,CAAAyF,WAAA,KAAA1F,CAAA,GAAAC,CAAA,CAAAyF,WAAA,CAAAC,IAAA,aAAA3F,CAAA,cAAAA,CAAA,GAAAsD,KAAA,CAAAW,IAAA,CAAAhE,CAAA,oBAAAD,CAAA,+CAAA4F,IAAA,CAAA5F,CAAA,IAAAkE,iBAAA,CAAAjE,CAAA,EAAAmB,CAAA;AAAA,SAAA8C,kBAAAjE,CAAA,EAAAmB,CAAA,aAAAA,CAAA,IAAAA,CAAA,GAAAnB,CAAA,CAAAsB,MAAA,MAAAH,CAAA,GAAAnB,CAAA,CAAAsB,MAAA,YAAAxB,CAAA,MAAAI,CAAA,GAAAmD,KAAA,CAAAlC,CAAA,GAAArB,CAAA,GAAAqB,CAAA,EAAArB,CAAA,IAAAI,CAAA,CAAAJ,CAAA,IAAAE,CAAA,CAAAF,CAAA,UAAAI,CAAA;AAAA,SAAAmF,sBAAArF,CAAA,EAAAuB,CAAA,QAAAxB,CAAA,WAAAC,CAAA,gCAAAC,MAAA,IAAAD,CAAA,CAAAC,MAAA,CAAAE,QAAA,KAAAH,CAAA,4BAAAD,CAAA,QAAAD,CAAA,EAAAI,CAAA,EAAAI,CAAA,EAAAI,CAAA,EAAAS,CAAA,OAAAL,CAAA,OAAAV,CAAA,iBAAAE,CAAA,IAAAP,CAAA,GAAAA,CAAA,CAAA0B,IAAA,CAAAzB,CAAA,GAAA2D,IAAA,QAAApC,CAAA,QAAAZ,MAAA,CAAAZ,CAAA,MAAAA,CAAA,UAAAe,CAAA,uBAAAA,CAAA,IAAAhB,CAAA,GAAAQ,CAAA,CAAAmB,IAAA,CAAA1B,CAAA,GAAA2B,IAAA,MAAAP,CAAA,CAAAoD,IAAA,CAAAzE,CAAA,CAAA6B,KAAA,GAAAR,CAAA,CAAAG,MAAA,KAAAC,CAAA,GAAAT,CAAA,iBAAAd,CAAA,IAAAI,CAAA,OAAAF,CAAA,GAAAF,CAAA,yBAAAc,CAAA,YAAAf,CAAA,eAAAW,CAAA,GAAAX,CAAA,cAAAY,MAAA,CAAAD,CAAA,MAAAA,CAAA,2BAAAN,CAAA,QAAAF,CAAA,aAAAiB,CAAA;AAAA,SAAAiE,gBAAApF,CAAA,QAAAqD,KAAA,CAAAC,OAAA,CAAAtD,CAAA,UAAAA,CAAA;AADA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAM4F,KAAK,GAAO,6BAA6B;AAC/C,IAAMC,MAAM,GAAM,kCAAkC;AACpD,IAAMC,SAAS,GAAG,0BAA0B;AAC5C,IAAMC,cAAc,GAAG,sBAAsB;;AAE7C;AACA,IAAMC,wBAAwB,GAAG;EAChCC,MAAM,EAAE,IAAI;EACZC,kBAAkB,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI;EACnCC,iBAAiB,EAAE,mCAAmC;EACtDC,QAAQ,EAAEC,CAAC,CAAC,GAAG,GAACR,MAAM,CAAC;EACvBS,WAAW,EAAED,CAAC,CAAC,GAAG,GAACR,MAAM,GAAC,eAAe,CAAC;EAC1CU,UAAU,EAAEF,CAAC,CAAC,GAAG,GAACR,MAAM,GAAC,eAAe,CAAC;EACzCW,iBAAiB,EAAEC,aAAa,GAAGb,KAAK,GAAG,oBAAoB;EAC/Dc,mBAAmB,EAAED,aAAa,GAAGb,KAAK,GAAG,sBAAsB;EACnEe,gBAAgB,EAAEF,aAAa,GAAGb,KAAK,GAAG,gBAAgB;EAC1DgB,cAAc,EAAEH,aAAa,GAAGb,KAAK,GAAG,cAAc;EACtDiB,iBAAiB,EAAEJ,aAAa,GAAGb,KAAK,GAAG,WAAW;EACtDkB,OAAO,EAAEC,SAAS;EAElB;AACD;AACA;AACA;EACCC,aAAa,EAAE,CAAC,CAAC;EACjB;AACD;AACA;EACCC,UAAU,WAAVA,UAAUA,CAAA,EAAG;IACZ,IAAI,CAACC,iBAAiB,CAAC,CAAC;IACxB,IAAI,CAACC,oBAAoB,CAAC,CAAC;IAE3Bd,CAAC,CAAC,0BAA0B,CAAC,CAACe,QAAQ,CAAC;MACtCC,QAAQ,EAAE,SAASA,QAAQA,CAAC1F,KAAK,EAAE2F,IAAI,EAAEC,OAAO,EAAE;QACjDC,MAAM,CAAC1B,SAAS,CAAC,CAAC2B,eAAe,CAAC,aAAa,EAAE9F,KAAK,CAAC;MACxD;IACD,CAAC,CAAC;IACF0E,CAAC,CAAC,iCAAiC,CAAC,CAACe,QAAQ,CAAC;MAC7CC,QAAQ,EAAE,SAASA,QAAQA,CAAC1F,KAAK,EAAE2F,IAAI,EAAEC,OAAO,EAAE;QACjDlB,CAAC,CAAC,sBAAsB,CAAC,CAACqB,GAAG,CAAC/F,KAAK,CAAC;QACpC6F,MAAM,CAAC1B,SAAS,CAAC,CAAC2B,eAAe,CAAC,gBAAgB,EAAE9F,KAAK,CAAC;MAC3D;IACD,CAAC,CAAC;IACF,IAAIgG,UAAU,GAAGtB,CAAC,CAAC,aAAa,CAAC,CAACqB,GAAG,CAAC,CAAC;IAEvCF,MAAM,CAAC1B,SAAS,CAAC,CAAC8B,aAAa,GAAG,IAAIC,GAAG,CAAC;MACzCC,EAAE,EAAE,YAAY;MAChBC,UAAU,EAAE,CAAC,IAAI,EAAC,IAAI,CAAC;MACvBC,OAAO,EAAE;QACRC,wBAAwB,WAAxBA,wBAAwBA,CAACC,IAAI,EAAE;UAAA,IAAAC,KAAA;UAC9B,IAAIC,WAAW,GAAG/B,CAAC,CAACmB,MAAM,CAAC1B,SAAS,CAAC,CAACK,iBAAiB,CAAC;UACxD,IAAI,CAACkC,cAAc,GAAG,CAAC,GAAChC,CAAC,CAAC,sBAAsB,CAAC,CAACqB,GAAG,CAAC,CAAC;UAEvD,IAAI,CAACY,MAAM,GAAGJ,IAAI,CAACI,MAAM;UACzB,IAAIC,OAAO,GAAGlC,CAAC,CAAC,UAAU,CAAC,CAACqB,GAAG,CAAC,CAAC;UACjC,IAAIa,OAAO,IAAIL,IAAI,CAACI,MAAM,EAAE;YAC3B,IAAI,CAACE,EAAE,GAAON,IAAI,CAACI,MAAM,CAACC,OAAO,CAAC,CAACC,EAAE;YACrC,IAAI,CAAC9C,IAAI,GAAKwC,IAAI,CAACI,MAAM,CAACC,OAAO,CAAC,CAAC7C,IAAI;YACvC,IAAI,CAAC+C,MAAM,GAAGP,IAAI,CAACI,MAAM,CAACC,OAAO,CAAC,CAACE,MAAM;YACzC,IAAI,CAACC,MAAM,GAAGR,IAAI,CAACI,MAAM,CAACC,OAAO,CAAC,CAACG,MAAM;YACzC,IAAI,CAACC,UAAU,GAAG,IAAI,CAACC,eAAe,CAAC,IAAI,CAACF,MAAM,CAAC;YACnD,IAAI,CAACG,KAAK,GAAIxF,KAAK,CAACC,OAAO,CAAC4E,IAAI,CAACI,MAAM,CAACC,OAAO,CAAC,CAACM,KAAK,CAAC,GAAGX,IAAI,CAACI,MAAM,CAACC,OAAO,CAAC,CAACM,KAAK,GAAG,EAAE;YACzF,IAAI,CAACC,QAAQ,GAAGZ,IAAI,CAACW,KAAK;UAC3B,CAAC,MAAI;YACJ,IAAI,CAACA,KAAK,GAAI,EAAE;YAChB,IAAI,CAACF,UAAU,GAAG,EAAE;UACrB;UACA,IAAGP,WAAW,CAAChB,QAAQ,CAAC,WAAW,CAAC,EAAC;YACpCgB,WAAW,CAAChB,QAAQ,CAAC;cACpBC,QAAQ,EAAE,SAASA,QAAQA,CAAC1F,KAAK,EAAE2F,IAAI,EAAEC,OAAO,EAAE;gBACjDC,MAAM,CAAC1B,SAAS,CAAC,CAAC2B,eAAe,CAAC,SAAS,EAAE9F,KAAK,CAAC;cACpD;YACD,CAAC,CAAC;YACF,IAAGyG,WAAW,CAAChB,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,EAAC;cAC3CI,MAAM,CAAC1B,SAAS,CAAC,CAACG,MAAM,GAAG,IAAI;cAC/BmC,WAAW,CAAChB,QAAQ,CAAC,WAAW,EAAEf,CAAC,CAAC,UAAU,CAAC,CAACqB,GAAG,CAAC,CAAC,CAAC;cACtDF,MAAM,CAAC1B,SAAS,CAAC,CAACG,MAAM,GAAG,KAAK;YACjC;UACD;;UAEA;UACA,IAAI,CAAC8C,SAAS,CAAC,YAAM;YACpBZ,KAAI,CAACa,mBAAmB,CAAC,CAAC;UAC3B,CAAC,CAAC;QACH,CAAC;QACDJ,eAAe,WAAfA,eAAeA,CAACK,SAAS,EAAE;UAC1B,IAAMC,OAAO,GAAGvI,MAAM,CAACuI,OAAO,CAACD,SAAS,IAAI,CAAC,CAAC,CAAC;UAC/C,IAAME,SAAS,GAAG,EAAE;UACpB,IAAMC,WAAW,GAAG,EAAE;UACtB,SAAAC,EAAA,MAAAC,QAAA,GAA8BJ,OAAO,EAAAG,EAAA,GAAAC,QAAA,CAAAhI,MAAA,EAAA+H,EAAA,IAAE;YAAlC,IAAAE,WAAA,GAAApE,cAAA,CAAAmE,QAAA,CAAAD,EAAA;cAAOZ,MAAM,GAAAc,WAAA;cAAEC,KAAK,GAAAD,WAAA;YACxB,IAAME,KAAK,GAAG,CAAAD,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEC,KAAK,KAAI,EAAE;YAChC,IAAMC,IAAI,GAAAlF,aAAA;cAAKiE,MAAM,EAANA;YAAM,GAAKe,KAAK,CAAE;YACjC,IAAIC,KAAK,KAAK,aAAa,EAAE;cAC5BL,WAAW,CAAC7E,IAAI,CAACmF,IAAI,CAAC;YACvB,CAAC,MAAM;cACNP,SAAS,CAAC5E,IAAI,CAACmF,IAAI,CAAC;YACrB;UACD;UACA,OAAOP,SAAS,CAACQ,MAAM,CAACP,WAAW,CAAC;QACrC,CAAC;QACDQ,gBAAgB,WAAhBA,gBAAgBA,CAACC,KAAK,EAAE;UACvB,IAAMC,MAAM,GAAG7E,MAAM,CAAC4E,KAAK,IAAI,EAAE,CAAC,CAACE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;UACtD,IAAID,MAAM,CAACxI,MAAM,IAAI,EAAE,EAAE,OAAOwI,MAAM;UACtC,OAAOA,MAAM,CAACtE,KAAK,CAAC,CAAC,EAAE,CAAC;QACzB,CAAC;QACDwE,mBAAmB,WAAnBA,mBAAmBA,CAACC,OAAO,EAAE;UAC5B,IAAMC,OAAO,GAAG,IAAI,CAACN,gBAAgB,CAACK,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAExB,MAAM,CAAC;UACtD,IAAI,CAACyB,OAAO,EAAE;UACd,IAAMC,MAAM,GAAGlF,MAAM,CAAC,CAAAgF,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEE,MAAM,KAAI,EAAE,CAAC,CAACC,IAAI,CAAC,CAAC;UACnD,IAAI,CAACD,MAAM,EAAE;UACb;UACA,IAAI,IAAI,CAACE,IAAI,EAAE;YACd,IAAI,CAACA,IAAI,CAAC,IAAI,CAACC,iBAAiB,EAAEJ,OAAO,EAAEC,MAAM,CAAC;UACnD,CAAC,MAAM;YACN,IAAI,CAACG,iBAAiB,CAACJ,OAAO,CAAC,GAAGC,MAAM;UACzC;QACD,CAAC;QACDI,oBAAoB,WAApBA,oBAAoBA,CAACV,KAAK,EAAE;UAC3B,IAAMK,OAAO,GAAG,IAAI,CAACN,gBAAgB,CAACC,KAAK,CAAC;UAC5C,OAAO,IAAI,CAACS,iBAAiB,CAACJ,OAAO,CAAC,IAAI,EAAE;QAC7C,CAAC;QACDM,eAAe,WAAfA,eAAeA,CAACX,KAAK,EAAE;UACtB,IAAMM,MAAM,GAAG,IAAI,CAACI,oBAAoB,CAACV,KAAK,CAAC;UAC/C,IAAI,CAACM,MAAM,EAAE,OAAON,KAAK;UACzB,UAAAF,MAAA,CAAUQ,MAAM,QAAAR,MAAA,CAAKE,KAAK;QAC3B,CAAC;QACDY,gBAAgB,WAAhBA,gBAAgBA,CAACZ,KAAK,EAAE;UACvB,OAAO,CAAC,CAAC,IAAI,CAACU,oBAAoB,CAACV,KAAK,CAAC;QAC1C,CAAC;QACDa,iBAAiB,WAAjBA,iBAAiBA,CAACC,SAAS,EAAE;UAC5B,OAAOnD,MAAM,CAAC1B,SAAS,CAAC,CAAC4E,iBAAiB,CAACC,SAAS,CAAC;QACtD,CAAC;QACD3B,mBAAmB,WAAnBA,mBAAmBA,CAAA,EAAG;UAAA,IAAA4B,MAAA;UACrB,IAAI,CAAC,IAAI,CAACC,GAAG,EAAE;;UAEf;UACA,IAAMC,SAAS,GAAG,IAAI,CAACD,GAAG,CAACE,gBAAgB,CAAC,6CAA6C,CAAC;UAC1FD,SAAS,CAACrG,OAAO,CAAC,UAACqD,EAAE;YAAA,OAAKA,EAAE,CAACkD,MAAM,CAAC,CAAC;UAAA,EAAC;;UAEtC;UACA;UACA,IAAI,CAACC,2BAA2B,CAAC,CAAC;;UAElC;UACA,IAAMC,cAAc,GAAG,IAAI,CAACL,GAAG,CAACM,aAAa,CAAC,uBAAuB,CAAC;UACtE,IAAID,cAAc,EAAE;YACnBA,cAAc,CAACE,KAAK,CAACC,UAAU,GAAG,YAAY;YAC9CH,cAAc,CAACE,KAAK,CAACE,YAAY,GAAG,YAAY;UACjD;UAEA,IAAMC,KAAK,GAAG,IAAI,CAACV,GAAG,CAACE,gBAAgB,CAAC,6CAA6C,CAAC;UACtFQ,KAAK,CAAC9G,OAAO,CAAC,UAAC+G,IAAI,EAAK;YACvBA,IAAI,CAACJ,KAAK,CAACK,SAAS,GAAG,YAAY;UACpC,CAAC,CAAC;;UAEF;UACA,IAAMC,OAAO,GAAG,IAAI,CAACb,GAAG,CAACE,gBAAgB,CAAC,+CAA+C,CAAC;UAC1FW,OAAO,CAACjH,OAAO,CAAC,UAACqD,EAAE,EAAK;YACvBA,EAAE,CAACsD,KAAK,CAACO,QAAQ,GAAG,KAAK;YACzB7D,EAAE,CAACsD,KAAK,CAACQ,UAAU,GAAG,KAAK;YAC3B9D,EAAE,CAACsD,KAAK,CAACS,OAAO,GAAG,MAAM;YACzB/D,EAAE,CAACsD,KAAK,CAACC,UAAU,GAAG,QAAQ;YAC9BvD,EAAE,CAACsD,KAAK,CAACU,GAAG,GAAG,OAAO;YACtBhE,EAAE,CAACsD,KAAK,CAACW,UAAU,GAAG,QAAQ;UAC/B,CAAC,CAAC;UAEF,IAAMC,KAAK,GAAG,IAAI,CAACnB,GAAG,CAACE,gBAAgB,CAAC,sCAAsC,CAAC;UAC/EiB,KAAK,CAACvH,OAAO,CAAC,UAACqD,EAAE,EAAK;YACrBA,EAAE,CAACsD,KAAK,CAACO,QAAQ,GAAG,KAAK;YACzB7D,EAAE,CAACsD,KAAK,CAACQ,UAAU,GAAG,KAAK;UAC5B,CAAC,CAAC;;UAEF;UACA,IAAMK,SAAS,GAAG,IAAI,CAACpB,GAAG,CAACE,gBAAgB,CAAC,sCAAsC,CAAC;UACnFkB,SAAS,CAACxH,OAAO,CAAC,UAACqD,EAAE,EAAK;YACzBA,EAAE,CAACsD,KAAK,CAACO,QAAQ,GAAG,KAAK;YACzB7D,EAAE,CAACsD,KAAK,CAACQ,UAAU,GAAG,KAAK;YAC3B9D,EAAE,CAACsD,KAAK,CAACS,OAAO,GAAG,aAAa;YAChC/D,EAAE,CAACsD,KAAK,CAACC,UAAU,GAAG,QAAQ;YAC9BvD,EAAE,CAACsD,KAAK,CAACc,UAAU,GAAG,GAAG;YACzBpE,EAAE,CAACsD,KAAK,CAACe,aAAa,GAAG,GAAG;YAC5B;YACArE,EAAE,CAACsD,KAAK,CAACgB,IAAI,GAAG,UAAU;YAC1BtE,EAAE,CAACsD,KAAK,CAACiB,QAAQ,GAAG,GAAG;YACvBvE,EAAE,CAACsD,KAAK,CAACkB,QAAQ,GAAG,MAAM;YAC1BxE,EAAE,CAACsD,KAAK,CAACmB,QAAQ,GAAG,QAAQ;YAC5BzE,EAAE,CAACsD,KAAK,CAACoB,YAAY,GAAG,UAAU;YAClC1E,EAAE,CAACsD,KAAK,CAACW,UAAU,GAAG,QAAQ;UAC/B,CAAC,CAAC;UACF,IAAMU,KAAK,GAAG,IAAI,CAAC5B,GAAG,CAACE,gBAAgB,CAAC,iCAAiC,CAAC;UAC1E0B,KAAK,CAAChI,OAAO,CAAC,UAACqD,EAAE,EAAK;YACrBA,EAAE,CAACsD,KAAK,CAACQ,UAAU,GAAG,KAAK;YAC3B;YACA9D,EAAE,CAACsD,KAAK,CAACiB,QAAQ,GAAG,GAAG;YACvBvE,EAAE,CAACsD,KAAK,CAACgB,IAAI,GAAG,UAAU;YAC1BtE,EAAE,CAACsD,KAAK,CAACmB,QAAQ,GAAG,QAAQ;YAC5BzE,EAAE,CAACsD,KAAK,CAACoB,YAAY,GAAG,UAAU;YAClC1E,EAAE,CAACsD,KAAK,CAACW,UAAU,GAAG,QAAQ;UAC/B,CAAC,CAAC;;UAEF;UACAW,qBAAqB,CAAC,YAAM;YAC3BA,qBAAqB,CAAC,YAAM;cAC3B9B,MAAI,CAAC+B,2BAA2B,CAAC,CAAC;YACnC,CAAC,CAAC;UACH,CAAC,CAAC;QACH,CAAC;QACDC,mBAAmB,WAAnBA,mBAAmBA,CAAA,EAAG;UACrB,IAAI,CAAC,IAAI,CAAC/B,GAAG,EAAE;UACf,IAAMgC,SAAS,GAAG,IAAI,CAAChC,GAAG,CAACM,aAAa,CAAC,uBAAuB,CAAC;UACjE,IAAI,CAAC0B,SAAS,EAAE;UAEhB,IAAMtB,KAAK,GAAGlI,KAAK,CAACW,IAAI,CAAC6I,SAAS,CAAC9B,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;UAC3E,IAAI,CAACQ,KAAK,CAACjK,MAAM,EAAE;UAEnB,IAAMwL,QAAQ,GAAGvB,KAAK,CAACwB,IAAI,CAAC,UAACxM,CAAC;YAAA,OAAKA,CAAC,CAAC4K,aAAa,CAAC,kBAAkB,CAAC;UAAA,EAAC;UACvE,IAAM6B,SAAS,GAAGzB,KAAK,CAACwB,IAAI,CAAC,UAACxM,CAAC;YAAA,OAAK,CAACA,CAAC,CAAC4K,aAAa,CAAC,kBAAkB,CAAC;UAAA,EAAC;UACzE,IAAI,CAAC2B,QAAQ,IAAI,CAACE,SAAS,EAAE;UAE7B,IAAMC,EAAE,GAAGH,QAAQ,CAACI,qBAAqB,CAAC,CAAC,CAACC,MAAM;UAClD,IAAMC,EAAE,GAAGJ,SAAS,CAACE,qBAAqB,CAAC,CAAC,CAACC,MAAM;UACnD,IAAI,CAACF,EAAE,IAAI,CAACG,EAAE,EAAE;;UAEhB;UACA,IAAItB,GAAG,GAAGmB,EAAE,GAAG,CAAC,GAAGG,EAAE;UACrB,IAAI,CAAClI,MAAM,CAACmI,QAAQ,CAACvB,GAAG,CAAC,EAAE;;UAE3B;UACAA,GAAG,GAAGwB,IAAI,CAACC,GAAG,CAAC,CAAC,EAAED,IAAI,CAACE,GAAG,CAAC,EAAE,EAAEF,IAAI,CAACG,KAAK,CAAC3B,GAAG,CAAC,CAAC,CAAC;UAEhDe,SAAS,CAACzB,KAAK,CAACsC,WAAW,CAAC,kBAAkB,KAAA/D,MAAA,CAAKmC,GAAG,OAAI,CAAC;QAC5D,CAAC;QACD6B,2BAA2B,WAA3BA,2BAA2BA,CAAA,EAAG;UAC7B,IAAI,CAAC,IAAI,CAAC9C,GAAG,EAAE;UACf,IAAMgC,SAAS,GAAG,IAAI,CAAChC,GAAG,CAACM,aAAa,CAAC,2CAA2C,CAAC;UACrF,IAAI,CAAC0B,SAAS,EAAE;UAEhB,IAAM1K,CAAC,GAAG0K,SAAS,CAACe,WAAW;UAC/B,IAAI,CAACzL,CAAC,EAAE;;UAER;UACA,IAAM0L,YAAY,GAAG,GAAG;UAExB,IAAMC,EAAE,GAAGtG,MAAM,CAACuG,gBAAgB,CAAClB,SAAS,CAAC;UAC7C,IAAMmB,MAAM,GAAGF,EAAE,CAACG,SAAS,IAAIH,EAAE,CAACI,gBAAgB,CAAC,YAAY,CAAC,IAAI,MAAM;UAC1E,IAAMC,KAAK,GAAGC,UAAU,CAACJ,MAAM,CAAC,IAAI,EAAE;UAEtC,IAAMK,KAAK,GAAGf,IAAI,CAACC,GAAG,CAAC,CAAC,EAAED,IAAI,CAACE,GAAG,CAAC,EAAE,EAAEF,IAAI,CAACgB,KAAK,CAAC,CAACnM,CAAC,GAAGgM,KAAK,KAAKN,YAAY,GAAGM,KAAK,CAAC,CAAC,CAAC,CAAC;UACzFtB,SAAS,CAACzB,KAAK,CAACsC,WAAW,CAAC,wBAAwB,EAAEzI,MAAM,CAACoJ,KAAK,CAAC,CAAC;QACrE,CAAC;QACDpD,2BAA2B,WAA3BA,2BAA2BA,CAAA,EAAG;UAAA,IAAAsD,MAAA;UAC7B,IAAMC,OAAO,GAAG,0BAA0B;UAC1C,IAAIC,OAAO,GAAGC,QAAQ,CAACC,cAAc,CAACH,OAAO,CAAC;UAC9C,IAAI,CAACC,OAAO,EAAE;YACbA,OAAO,GAAGC,QAAQ,CAACE,aAAa,CAAC,OAAO,CAAC;YACzCH,OAAO,CAACjG,EAAE,GAAGgG,OAAO;YACpBE,QAAQ,CAACG,IAAI,CAACC,WAAW,CAACL,OAAO,CAAC;UACnC;;UAEA;UACAA,OAAO,CAACM,WAAW,GAAG,mgBAiBpB3E,IAAI,CAAC,CAAC;UAER,IAAMc,cAAc,GAAG,IAAI,CAACL,GAAG,IAAI,IAAI,CAACA,GAAG,CAACM,aAAa,GACtD,IAAI,CAACN,GAAG,CAACM,aAAa,CAAC,uBAAuB,CAAC,GAC/C,IAAI;UACP,IAAID,cAAc,EAAE;YACnBA,cAAc,CAAC8D,SAAS,CAAChE,MAAM,CAAC,qBAAqB,CAAC;YACtDE,cAAc,CAAC8D,SAAS,CAAChE,MAAM,CAAC,kBAAkB,CAAC;YACnDE,cAAc,CAAC8D,SAAS,CAACC,GAAG,CAAC,kBAAkB,CAAC;;YAEhD;YACA,IAAI,CAAC,IAAI,CAACC,sBAAsB,EAAE;cACjC,IAAI,CAACA,sBAAsB,GAAG,IAAI;cAClC1H,MAAM,CAAC2H,gBAAgB,CAAC,QAAQ,EAAE,YAAM;gBACvCZ,MAAI,CAAC5B,2BAA2B,CAAC,CAAC;cACnC,CAAC,CAAC;YACH;UACD;QACD,CAAC;QACDA,2BAA2B,WAA3BA,2BAA2BA,CAAA,EAAG;UAC7B,IAAI,CAAC,IAAI,CAAC9B,GAAG,EAAE;UACf,IAAMuE,IAAI,GAAG,IAAI,CAACvE,GAAG,CAACM,aAAa,CAAC,wCAAwC,CAAC;UAC7E,IAAI,CAACiE,IAAI,EAAE;UAEX,IAAMtB,EAAE,GAAGtG,MAAM,CAACuG,gBAAgB,CAACqB,IAAI,CAAC;UACxC,IAAMC,SAAS,GAAGjB,UAAU,CAACN,EAAE,CAACI,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC;UACxE,IAAMoB,MAAM,GAAGlB,UAAU,CAACN,EAAE,CAACI,gBAAgB,CAAC,SAAS,CAAC,CAAC,IAAIE,UAAU,CAACN,EAAE,CAACI,gBAAgB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;UAExG,IAAMqB,KAAK,GAAGlM,KAAK,CAACW,IAAI,CAACoL,IAAI,CAACrE,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;UACtE,IAAI,CAACwE,KAAK,CAACjO,MAAM,EAAE;;UAEnB;UACAiO,KAAK,CAAC9K,OAAO,CAAC,UAACiF,IAAI,EAAK;YACvBA,IAAI,CAAC0B,KAAK,CAACoE,UAAU,GAAG,EAAE;YAC1B9F,IAAI,CAAC0B,KAAK,CAACqE,SAAS,GAAG,EAAE;UAC1B,CAAC,CAAC;UAEF,IAAMC,IAAI,GAAGH,KAAK,CAAClL,MAAM,CAAC,UAAC9D,CAAC;YAAA,OAAKA,CAAC,CAAC4K,aAAa,CAAC,kBAAkB,CAAC;UAAA,EAAC;UACrE,IAAMwE,MAAK,GAAGJ,KAAK,CAAClL,MAAM,CAAC,UAAC9D,CAAC;YAAA,OAAK,CAACA,CAAC,CAAC4K,aAAa,CAAC,kBAAkB,CAAC;UAAA,EAAC;;UAEvE;UACA,IAAI,CAACuE,IAAI,CAACpO,MAAM,IAAI,CAACqO,MAAK,CAACrO,MAAM,EAAE;YAClCiO,KAAK,CAAC9K,OAAO,CAAC,UAACiF,IAAI,EAAK;cACvB,IAAMkG,CAAC,GAAGlG,IAAI,CAACwD,qBAAqB,CAAC,CAAC,CAACC,MAAM;cAC7C,IAAM0C,IAAI,GAAGvC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAED,IAAI,CAACwC,IAAI,CAAC,CAACF,CAAC,GAAGN,MAAM,KAAKD,SAAS,GAAGC,MAAM,CAAC,CAAC,CAAC;cACxE5F,IAAI,CAAC0B,KAAK,CAACoE,UAAU,WAAA7F,MAAA,CAAWkG,IAAI,CAAE;YACvC,CAAC,CAAC;YACF;UACD;UAEA,IAAMzC,EAAE,GAAGE,IAAI,CAACC,GAAG,CAAAtK,KAAA,CAARqK,IAAI,EAAA1J,kBAAA,CAAQ+L,MAAK,CAACI,GAAG,CAAC,UAACxP,CAAC;YAAA,OAAKA,CAAC,CAAC2M,qBAAqB,CAAC,CAAC,CAACC,MAAM;UAAA,EAAC,EAAC;UAC1E,IAAMF,EAAE,GAAGK,IAAI,CAACC,GAAG,CAAAtK,KAAA,CAARqK,IAAI,EAAA1J,kBAAA,CAAQ8L,IAAI,CAACK,GAAG,CAAC,UAACxP,CAAC;YAAA,OAAKA,CAAC,CAAC2M,qBAAqB,CAAC,CAAC,CAACC,MAAM;UAAA,EAAC,EAAC;;UAEzE;UACA,IAAI6C,CAAC,GAAG/C,EAAE,GAAG,CAAC,GAAGG,EAAE;UACnB,IAAI,CAAClI,MAAM,CAACmI,QAAQ,CAAC2C,CAAC,CAAC,EAAEA,CAAC,GAAGV,MAAM;UACnCU,CAAC,GAAG1C,IAAI,CAACC,GAAG,CAAC,CAAC,EAAED,IAAI,CAACE,GAAG,CAAC,EAAE,EAAEF,IAAI,CAACG,KAAK,CAACuC,CAAC,CAAC,CAAC,CAAC;;UAE5C;UACAZ,IAAI,CAAChE,KAAK,CAACsC,WAAW,CAAC,kBAAkB,KAAA/D,MAAA,CAAKqG,CAAC,OAAI,CAAC;UAEpD,IAAMC,MAAM,GAAG3C,IAAI,CAACG,KAAK,CAACL,EAAE,CAAC;UAC7B,IAAM8C,KAAK,GAAG5C,IAAI,CAACG,KAAK,CAACH,IAAI,CAACC,GAAG,CAACN,EAAE,EAAE,CAAC,GAAGG,EAAE,GAAG4C,CAAC,CAAC,CAAC;UAClDL,MAAK,CAAClL,OAAO,CAAC,UAAClE,CAAC,EAAK;YAAEA,CAAC,CAAC6K,KAAK,CAACqE,SAAS,MAAA9F,MAAA,CAAMsG,MAAM,OAAI;UAAE,CAAC,CAAC;UAC5DP,IAAI,CAACjL,OAAO,CAAC,UAAClE,CAAC,EAAK;YAAEA,CAAC,CAAC6K,KAAK,CAACqE,SAAS,MAAA9F,MAAA,CAAMuG,KAAK,OAAI;UAAE,CAAC,CAAC;;UAE1D;UACA,IAAMC,YAAY,GAAGH,CAAC;UACtBT,KAAK,CAAC9K,OAAO,CAAC,UAACiF,IAAI,EAAK;YACvB,IAAMkG,CAAC,GAAGlG,IAAI,CAACwD,qBAAqB,CAAC,CAAC,CAACC,MAAM;YAC7C,IAAM0C,IAAI,GAAGvC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAED,IAAI,CAACwC,IAAI,CAAC,CAACF,CAAC,GAAGO,YAAY,KAAKd,SAAS,GAAGc,YAAY,CAAC,CAAC,CAAC;YACpFzG,IAAI,CAAC0B,KAAK,CAACoE,UAAU,WAAA7F,MAAA,CAAWkG,IAAI,CAAE;UACvC,CAAC,CAAC;QACH,CAAC;QACDO,iBAAiB,WAAjBA,iBAAiBA,CAACC,WAAW,EAAE;UAC9B,IAAIC,MAAM,GAAG,GAAG;UAChB,IAAIC,aAAa,GAAI,KAAK;UAAC,IAAAC,SAAA,GAAApN,0BAAA,CACR,IAAI,CAACyF,KAAK;YAAA4H,KAAA;UAAA;YAA7B,KAAAD,SAAA,CAAA9M,CAAA,MAAA+M,KAAA,GAAAD,SAAA,CAAAtQ,CAAA,IAAAwB,IAAA,GAA+B;cAAA,IAApBD,IAAI,GAAAgP,KAAA,CAAA9O,KAAA;cACd,IAAGF,IAAI,CAACiP,OAAO,KAAKL,WAAW,EAAC;gBAC/BE,aAAa,GAAG,IAAI;gBACpBD,MAAM,GAAG7O,IAAI,CAACkP,OAAO;gBACrB;cACD;cACA,IAAIlP,IAAI,CAACmP,cAAc,IAAIvN,KAAK,CAACC,OAAO,CAAC7B,IAAI,CAACmP,cAAc,CAAC,EAAE;gBAC9D,IAAMC,OAAK,GAAGpP,IAAI,CAACmP,cAAc,CAAC7D,IAAI,CAAC,UAAA+D,EAAE;kBAAA,OAAIA,EAAE,CAACrI,MAAM,KAAK4H,WAAW;gBAAA,EAAC;gBACvE,IAAIQ,OAAK,EAAE;kBACVP,MAAM,GAAG7O,IAAI,CAACkP,OAAO;gBACtB;cACD;cACA,IAAIlP,IAAI,CAACsP,cAAc,IAAI1N,KAAK,CAACC,OAAO,CAAC7B,IAAI,CAACsP,cAAc,CAAC,EAAE;gBAC9D,IAAMF,OAAK,GAAGpP,IAAI,CAACsP,cAAc,CAAChE,IAAI,CAAC,UAAA+D,EAAE;kBAAA,OAAKA,EAAE,CAACH,OAAO,KAAKN,WAAW,IAAIS,EAAE,CAACJ,OAAO,KAAKL,WAAW;gBAAA,CAAC,CAAC;gBACxG,IAAIQ,OAAK,EAAE;kBACV,IAAGA,OAAK,CAACF,OAAO,KAAKN,WAAW,EAAC;oBAChCC,MAAM,GAAGO,OAAK,CAACH,OAAO;kBACvB,CAAC,MAAI;oBACJJ,MAAM,GAAGO,OAAK,CAACF,OAAO;kBACvB;kBACAJ,aAAa,GAAG,IAAI;gBACrB;cACD;YACD;UAAC,SAAAS,GAAA;YAAAR,SAAA,CAAA1Q,CAAA,CAAAkR,GAAA;UAAA;YAAAR,SAAA,CAAA1P,CAAA;UAAA;UACD,IAAGyP,aAAa,KAAK,KAAK,EAAC;YAC1B,KAAK,IAAIjQ,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG,IAAI,CAACwI,QAAQ,CAACxH,MAAM,EAAEhB,CAAC,EAAE,EAAE;cAC9C,IAAM2Q,OAAO,GAAG,IAAI,CAACnI,QAAQ,CAACxI,CAAC,CAAC;cAChC,IAAG2Q,OAAO,CAACN,OAAO,KAAKN,WAAW,EAAC;gBAClC;gBACA,IAAGY,OAAO,CAACP,OAAO,KAAK,EAAE,EAAC;kBACzB;kBACA,IAAIO,OAAO,CAACL,cAAc,IAAIvN,KAAK,CAACC,OAAO,CAAC2N,OAAO,CAACL,cAAc,CAAC,IAAKK,OAAO,CAACL,cAAc,CAACtP,MAAM,EAAE;oBACtG,IAAMuP,KAAK,GAAGI,OAAO,CAACL,cAAc,CAAC7D,IAAI,CAAC,UAAA+D,EAAE;sBAAA,OAAIA,EAAE,CAACrI,MAAM,KAAK4H,WAAW;oBAAA,EAAC;oBAC1E,IAAIQ,KAAK,EAAE;sBACVP,MAAM,GAAGO,KAAK,CAACpI,MAAM;oBACtB;kBACD,CAAC,MAAK,IAAGwI,OAAO,CAACC,KAAK,EAAC;oBACtB;oBACAZ,MAAM,GAAGW,OAAO,CAACE,OAAO;kBACzB,CAAC,MAAI;oBACJ;oBACAb,MAAM,GAAGW,OAAO,CAACG,KAAK;kBACvB;gBACD,CAAC,MAAI;kBACJd,MAAM,GAAGW,OAAO,CAACP,OAAO;gBACzB;gBACA;cACD,CAAC,MAAK,IAAGO,OAAO,CAACP,OAAO,KAAKL,WAAW,EAAC;gBACxC;gBACAC,MAAM,GAAGW,OAAO,CAACN,OAAO;gBACxB;cACD,CAAC,MAAI;gBACJ,IAAIM,OAAO,CAACL,cAAc,IAAIvN,KAAK,CAACC,OAAO,CAAC2N,OAAO,CAACL,cAAc,CAAC,EAAE;kBACpE,IAAMC,MAAK,GAAGI,OAAO,CAACL,cAAc,CAAC7D,IAAI,CAAC,UAAA+D,EAAE;oBAAA,OAAIA,EAAE,CAACrI,MAAM,KAAK4H,WAAW;kBAAA,EAAC;kBAC1E,IAAIQ,MAAK,EAAE;oBACVP,MAAM,GAAGW,OAAO,CAACN,OAAO;kBACzB;gBACD;cACD;YACD;UACD;UACA,OAAOL,MAAM;QACd,CAAC;QACDe,YAAY,WAAZA,YAAYA,CAAChB,WAAW,EAAE;UACzB,IAAMxG,KAAK,GAAG5E,MAAM,CAAC,IAAI,CAACmL,iBAAiB,CAACC,WAAW,CAAC,IAAI,EAAE,CAAC,CAACjG,IAAI,CAAC,CAAC;UACtE,OAAOP,KAAK,KAAK,EAAE,IAAIA,KAAK,KAAK,GAAG,IAAIA,KAAK,KAAK,GAAG;QACtD,CAAC;QACDyH,iBAAiB,WAAjBA,iBAAiBA,CAACjB,WAAW,EAAE;UAC9B,IAAMxG,KAAK,GAAG5E,MAAM,CAAC,IAAI,CAACmL,iBAAiB,CAACC,WAAW,CAAC,IAAI,EAAE,CAAC,CAACjG,IAAI,CAAC,CAAC;UACtE,OAAO,IAAI,CAACiH,YAAY,CAAChB,WAAW,CAAC,GAAGxG,KAAK,GAAG,GAAG;QACpD,CAAC;QACD0H,gBAAgB,WAAhBA,gBAAgBA,CAAClB,WAAW,EAAE;UAC7B;UACA,IAAMxG,KAAK,GAAG,IAAI,CAACyH,iBAAiB,CAACjB,WAAW,CAAC;UACjD,IAAMlG,MAAM,GAAG,IAAI,CAACI,oBAAoB,CAACV,KAAK,CAAC;UAC/C,OAAOM,MAAM,IAAI,GAAG;QACrB;MACD,CAAC;MACDjC,IAAI,EAAE;QACL,gBAAgB,EAAE,EAAE;QACpB,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,CACV,CAAC;QACD,YAAY,EAAE,EAAE;QAChB,mBAAmB,EAAE,CAAC,CAAC;QACvB,OAAO,EAAE;MAEV;IACD,CAAC,CAAC;IACFV,MAAM,CAAC1B,SAAS,CAAC,CAAC0L,+BAA+B,CAAC,CAAC;IAEnDhK,MAAM,CAAC1B,SAAS,CAAC,CAAC2L,YAAY,GAAG,IAAI5J,GAAG,CAAC;MACxCC,EAAE,EAAE,QAAQ;MACZC,UAAU,EAAE,CAAC,IAAI,EAAC,IAAI,CAAC;MACvBG,IAAI,EAAE;QACL,gBAAgB,EAAE,EAAE;QACpBP,UAAU,EAAEA,UAAU;QACtB+J,UAAU,EAAGrL,CAAC,CAAC,aAAa,CAAC,CAACqB,GAAG,CAAC,CAAC,KAAK,GAAG,IAAIC,UAAU,KAAK,EAAG;QACjEkB,KAAK,EAAE;MAER,CAAC;MACDb,OAAO,EAAE;QACR2J,aAAa,WAAbA,aAAaA,CAAClQ,IAAI,EAAC;UAClB,IAAGA,IAAI,CAACmQ,QAAQ,KAAG,EAAE,IAAInQ,IAAI,CAACoQ,SAAS,CAACC,SAAS,KAAK/K,SAAS,EAAE;YAChE,OAAO,IAAI,CAACsB,cAAc,IAAI,IAAI,CAAC0J,WAAW,CAACtQ,IAAI,CAAC;UACrD;UACA,OAAO,IAAI;QACZ,CAAC;QACDuQ,qBAAqB,WAArBA,qBAAqBA,CAACC,SAAS,EAAE;UAChC;UACA,IAAMC,EAAE,GAAG,OAAOD,SAAS,KAAK,QAAQ,GAAG7D,UAAU,CAAC6D,SAAS,CAAC,GAAGA,SAAS;;UAE5E;UACA,IAAME,EAAE,GAAGD,EAAE,GAAG,IAAI,GAAGA,EAAE,GAAG,IAAI,GAAGA,EAAE;UAErC,IAAME,IAAI,GAAG,IAAIC,IAAI,CAACF,EAAE,CAAC;UAEzB,IAAMG,KAAK,GAAGrN,MAAM,CAACmN,IAAI,CAACG,QAAQ,CAAC,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;UACtD,IAAMC,OAAO,GAAGxN,MAAM,CAACmN,IAAI,CAACM,UAAU,CAAC,CAAC,CAAC,CAACF,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;UAC1D,IAAMG,OAAO,GAAG1N,MAAM,CAACmN,IAAI,CAACQ,UAAU,CAAC,CAAC,CAAC,CAACJ,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;UAE1D,UAAA7I,MAAA,CAAU2I,KAAK,OAAA3I,MAAA,CAAI8I,OAAO,OAAA9I,MAAA,CAAIgJ,OAAO;QACtC,CAAC;QACDZ,WAAW,WAAXA,WAAWA,CAACtQ,IAAI,EAAC;UAChB,IAAIoR,MAAM,GAAGvF,IAAI,CAACgB,KAAK,CAAC+D,IAAI,CAACS,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;UAC1C,IAAGrR,IAAI,CAACoR,MAAM,KAAK,EAAE,EAAC;YACrBA,MAAM,GAAGpR,IAAI,CAACoR,MAAM;UACrB;UACA,OAAOrL,MAAM,CAAC1B,SAAS,CAAC,CAACiN,YAAY,CAACF,MAAM,GAAGpR,IAAI,CAACuR,KAAK,CAAC;QAC3D,CAAC;QACDC,WAAW,WAAXA,WAAWA,CAACxR,IAAI,EAAC;UAChB,IAAGA,IAAI,CAACoR,MAAM,KAAK,EAAE,EAAC;YACrB,OAAO,GAAG;UACX;UACA,OAAOrL,MAAM,CAAC1B,SAAS,CAAC,CAAC4E,iBAAiB,CAACjJ,IAAI,CAACoR,MAAM,CAAC;QACxD,CAAC;QACD5K,wBAAwB,WAAxBA,wBAAwBA,CAACC,IAAI,EAAE;UAC9B,IAAI,CAACG,cAAc,GAAG,CAAC,GAAChC,CAAC,CAAC,sBAAsB,CAAC,CAACqB,GAAG,CAAC,CAAC;UACvD;UACA,KAAK,IAAMa,OAAO,IAAIL,IAAI,CAACI,MAAM,EAAE;YAClC,IAAM4K,KAAK,GAAGhL,IAAI,CAACI,MAAM,CAACC,OAAO,CAAC;YAClC;YACA,IAAIlF,KAAK,CAACC,OAAO,CAAC4P,KAAK,CAACrK,KAAK,CAAC,EAAE;cAAA,IAAAsK,WAAA;cAC/B;cACA,CAAAA,WAAA,GAAAjL,IAAI,CAACW,KAAK,EAACtE,IAAI,CAAAtB,KAAA,CAAAkQ,WAAA,EAAAvP,kBAAA,CAAIsP,KAAK,CAACrK,KAAK,EAAC;YAChC;UACD;UACA,IAAI,CAACA,KAAK,GAAGX,IAAI,CAACW,KAAK;UACvB,IAAI,CAACE,SAAS,CAAC,YAAM;YACpBqK,UAAU,CAACC,qBAAqB,CAAC,aAAa,CAAC;UAChD,CAAC,CAAC;QACH,CAAC;QACD3I,iBAAiB,WAAjBA,iBAAiBA,CAACC,SAAS,EAAE;UAC5B,OAAOnD,MAAM,CAAC1B,SAAS,CAAC,CAAC4E,iBAAiB,CAACC,SAAS,CAAC;QACtD,CAAC;QACDH,eAAe,WAAfA,eAAeA,CAACX,KAAK,EAAE;UACtB,IAAMyJ,CAAC,GAAG9L,MAAM,CAAC1B,SAAS,CAAC,CAAC8B,aAAa;UACzC,IAAI0L,CAAC,IAAI,OAAOA,CAAC,CAAC9I,eAAe,KAAK,UAAU,EAAE;YACjD,OAAO8I,CAAC,CAAC9I,eAAe,CAACX,KAAK,CAAC;UAChC;UACA,OAAOA,KAAK;QACb,CAAC;QACD0J,YAAY,WAAZA,YAAYA,CAACC,KAAK,EAAE;UACnB,IAAIC,MAAM,GAAGpN,CAAC,CAACmN,KAAK,CAACC,MAAM,CAAC;UAC5B,IAAGA,MAAM,CAACC,IAAI,CAAC,UAAU,CAAC,KAAK3M,SAAS,EAAC;YACxC0M,MAAM,GAAGpN,CAAC,CAACmN,KAAK,CAACC,MAAM,CAAC,CAACE,MAAM,CAAC,CAAC;UAClC;UACAnM,MAAM,CAAC1B,SAAS,CAAC,CAAC8N,iBAAiB,CAAC;YAACC,MAAM,EAAE,QAAQ;YAAEC,GAAG,EAAEL,MAAM,CAACC,IAAI,CAAC,UAAU,CAAC;YAAEK,GAAG,EAAEN,MAAM,CAACC,IAAI,CAAC,UAAU;UAAC,CAAC,CAAC;QACpH,CAAC;QACDM,UAAU,WAAVA,UAAUA,CAACR,KAAK,EAAE;UACjB,IAAIC,MAAM,GAAGpN,CAAC,CAACmN,KAAK,CAACC,MAAM,CAAC;UAC5B,IAAGA,MAAM,CAACC,IAAI,CAAC,UAAU,CAAC,KAAK3M,SAAS,EAAC;YACxC0M,MAAM,GAAGpN,CAAC,CAACmN,KAAK,CAACC,MAAM,CAAC,CAACE,MAAM,CAAC,CAAC;UAClC;UACA,IAAG,IAAI,CAAChM,UAAU,KAAK,EAAE,EAAC;YACzB;UACD;UACAH,MAAM,CAAC1B,SAAS,CAAC,CAAC8N,iBAAiB,CAAC;YAACC,MAAM,EAAE,MAAM;YAAEC,GAAG,EAAEL,MAAM,CAACC,IAAI,CAAC,UAAU,CAAC;YAAEK,GAAG,EAAEN,MAAM,CAACC,IAAI,CAAC,UAAU,CAAC;YAAEjL,MAAM,EAAE,IAAI,CAACd;UAAU,CAAC,CAAC;QAC3I,CAAC;QACDsM,aAAa,WAAbA,aAAaA,CAACT,KAAK,EAAC;UACnB,IAAIC,MAAM,GAAGpN,CAAC,CAACmN,KAAK,CAACC,MAAM,CAAC;UAC5B,IAAGA,MAAM,CAACC,IAAI,CAAC,UAAU,CAAC,KAAK3M,SAAS,EAAC;YACxC0M,MAAM,GAAGpN,CAAC,CAACmN,KAAK,CAACC,MAAM,CAAC,CAACE,MAAM,CAAC,CAAC;UAClC;UACA,IAAG,IAAI,CAAChM,UAAU,KAAK,EAAE,EAAC;YACzB;UACD;UACA,IAAIuM,SAAS,GAAGT,MAAM,CAACC,IAAI,CAAC,UAAU,CAAC;UACvC,IAAG,UAAU,KAAKD,MAAM,CAACC,IAAI,CAAC,gBAAgB,CAAC,EAAC;YAC/CQ,SAAS,GAAGT,MAAM,CAACC,IAAI,CAAC,UAAU,CAAC;UACpC;UACAlM,MAAM,CAAC1B,SAAS,CAAC,CAAC8N,iBAAiB,CAAC;YAACC,MAAM,EAAE,SAAS;YAAEC,GAAG,EAAEI,SAAS;YAAEH,GAAG,EAAE,EAAE;YAAEtL,MAAM,EAAE,IAAI,CAACd;UAAU,CAAC,CAAC;QAC3G,CAAC;QACDwM,YAAY,WAAZA,YAAYA,CAACX,KAAK,EAAC;UAClB,IAAIC,MAAM,GAAGpN,CAAC,CAACmN,KAAK,CAACC,MAAM,CAAC;UAC5B,IAAGA,MAAM,CAACC,IAAI,CAAC,UAAU,CAAC,KAAK3M,SAAS,EAAC;YACxC0M,MAAM,GAAGpN,CAAC,CAACmN,KAAK,CAACC,MAAM,CAAC,CAACE,MAAM,CAAC,CAAC;UAClC;UACA,IAAG,IAAI,CAAChM,UAAU,KAAK,EAAE,EAAC;YACzB;UACD;UACAH,MAAM,CAAC1B,SAAS,CAAC,CAAC8N,iBAAiB,CAAC;YAACC,MAAM,EAAE,QAAQ;YAAEC,GAAG,EAAEL,MAAM,CAACC,IAAI,CAAC,UAAU,CAAC;YAAEK,GAAG,EAAEN,MAAM,CAACC,IAAI,CAAC,UAAU,CAAC;YAAEjL,MAAM,EAAE,IAAI,CAACd;UAAU,CAAC,CAAC;QAC7I;MACD;IACD,CAAC,CAAC;IAEFH,MAAM,CAAC1B,SAAS,CAAC,CAACgB,OAAO,GAAG,IAAIe,GAAG,CAAC;MACnCC,EAAE,EAAE,MAAM;MACVC,UAAU,EAAE,CAAC,IAAI,EAAC,IAAI,CAAC;MACvBG,IAAI,EAAE;QACLP,UAAU,EAAEA,UAAU;QACtB+J,UAAU,EAAGrL,CAAC,CAAC,aAAa,CAAC,CAACqB,GAAG,CAAC,CAAC,KAAK,GAAG,IAAIC,UAAU,KAAK,EAAG;QACjEkB,KAAK,EAAE;MAER,CAAC;MACDb,OAAO,EAAE;QACRC,wBAAwB,WAAxBA,wBAAwBA,CAACmM,KAAK,EAAE;UAC/B,IAAI,CAACvL,KAAK,GAAGuL,KAAK;UAClB,IAAI,CAACrL,SAAS,CAAC,YAAM;YACpBqK,UAAU,CAACC,qBAAqB,CAAC,aAAa,CAAC;UAChD,CAAC,CAAC;QACH,CAAC;QACDE,YAAY,WAAZA,YAAYA,CAACC,KAAK,EAAE;UACnB,IAAIC,MAAM,GAAGpN,CAAC,CAACmN,KAAK,CAACC,MAAM,CAAC;UAC5B,IAAGA,MAAM,CAACC,IAAI,CAAC,UAAU,CAAC,KAAK3M,SAAS,EAAC;YACxC0M,MAAM,GAAGpN,CAAC,CAACmN,KAAK,CAACC,MAAM,CAAC,CAACE,MAAM,CAAC,CAAC;UAClC;UACAnM,MAAM,CAAC1B,SAAS,CAAC,CAAC8N,iBAAiB,CAAC;YAACC,MAAM,EAAE,QAAQ;YAAEC,GAAG,EAAEL,MAAM,CAACC,IAAI,CAAC,UAAU,CAAC;YAAEK,GAAG,EAAEN,MAAM,CAACC,IAAI,CAAC,UAAU;UAAC,CAAC,CAAC;QACpH,CAAC;QACDM,UAAU,WAAVA,UAAUA,CAACR,KAAK,EAAE;UACjB,IAAIC,MAAM,GAAGpN,CAAC,CAACmN,KAAK,CAACC,MAAM,CAAC;UAC5B,IAAGA,MAAM,CAACC,IAAI,CAAC,UAAU,CAAC,KAAK3M,SAAS,EAAC;YACxC0M,MAAM,GAAGpN,CAAC,CAACmN,KAAK,CAACC,MAAM,CAAC,CAACE,MAAM,CAAC,CAAC;UAClC;UACA,IAAG,IAAI,CAAChM,UAAU,KAAK,EAAE,EAAC;YACzB;UACD;UACAH,MAAM,CAAC1B,SAAS,CAAC,CAAC8N,iBAAiB,CAAC;YAACC,MAAM,EAAE,MAAM;YAAEC,GAAG,EAAEL,MAAM,CAACC,IAAI,CAAC,UAAU,CAAC;YAAEK,GAAG,EAAEN,MAAM,CAACC,IAAI,CAAC,UAAU,CAAC;YAAEjL,MAAM,EAAE,IAAI,CAACd;UAAU,CAAC,CAAC;QAC3I,CAAC;QACDsM,aAAa,WAAbA,aAAaA,CAACT,KAAK,EAAC;UACnB,IAAIC,MAAM,GAAGpN,CAAC,CAACmN,KAAK,CAACC,MAAM,CAAC;UAC5B,IAAGA,MAAM,CAACC,IAAI,CAAC,UAAU,CAAC,KAAK3M,SAAS,EAAC;YACxC0M,MAAM,GAAGpN,CAAC,CAACmN,KAAK,CAACC,MAAM,CAAC,CAACE,MAAM,CAAC,CAAC;UAClC;UACA,IAAG,IAAI,CAAChM,UAAU,KAAK,EAAE,EAAC;YACzB;UACD;UACA,IAAIuM,SAAS,GAAGT,MAAM,CAACC,IAAI,CAAC,UAAU,CAAC;UACvC,IAAG,UAAU,KAAKD,MAAM,CAACC,IAAI,CAAC,gBAAgB,CAAC,EAAC;YAC/CQ,SAAS,GAAGT,MAAM,CAACC,IAAI,CAAC,UAAU,CAAC;UACpC;UACAlM,MAAM,CAAC1B,SAAS,CAAC,CAAC8N,iBAAiB,CAAC;YAACC,MAAM,EAAE,SAAS;YAAEC,GAAG,EAAEI,SAAS;YAAEH,GAAG,EAAE,EAAE;YAAEtL,MAAM,EAAE,IAAI,CAACd;UAAU,CAAC,CAAC;QAC3G,CAAC;QACDwM,YAAY,WAAZA,YAAYA,CAACX,KAAK,EAAC;UAClB,IAAIC,MAAM,GAAGpN,CAAC,CAACmN,KAAK,CAACC,MAAM,CAAC;UAC5B,IAAGA,MAAM,CAACC,IAAI,CAAC,UAAU,CAAC,KAAK3M,SAAS,EAAC;YACxC0M,MAAM,GAAGpN,CAAC,CAACmN,KAAK,CAACC,MAAM,CAAC,CAACE,MAAM,CAAC,CAAC;UAClC;UACA,IAAG,IAAI,CAAChM,UAAU,KAAK,EAAE,EAAC;YACzB;UACD;UACAH,MAAM,CAAC1B,SAAS,CAAC,CAAC8N,iBAAiB,CAAC;YAACC,MAAM,EAAE,QAAQ;YAAEC,GAAG,EAAEL,MAAM,CAACC,IAAI,CAAC,UAAU,CAAC;YAAEK,GAAG,EAAEN,MAAM,CAACC,IAAI,CAAC,UAAU,CAAC;YAAEjL,MAAM,EAAE,IAAI,CAACd;UAAU,CAAC,CAAC;QAC7I;MACD;IACD,CAAC,CAAC;IACFH,MAAM,CAAC1B,SAAS,CAAC,CAACQ,WAAW,CAAC+N,QAAQ,CAAC,CAAC;IACxC7M,MAAM,CAAC1B,SAAS,CAAC,CAACS,UAAU,CAACa,QAAQ,CAAC,CAAC;IACvCI,MAAM,CAAC1B,SAAS,CAAC,CAACwO,cAAc,CAAC,CAAC;IAClCjO,CAAC,CAAC,aAAa,CAAC,CAACkO,GAAG,CAAC,CAAC;IACtB;IACA;IACAlO,CAAC,CAAC,yBAAyB,CAAC,CAACmO,WAAW,CAAC,WAAW,CAAC;IACrDnO,CAAC,CAAC,+BAA+B,CAAC,CAACoO,IAAI,CAAC,CAAC;IACzCpO,CAAC,CAAC,6BAA6B,CAAC,CAAC2E,MAAM,CAAC,CAAC;IACzC;IACA;IACAxD,MAAM,CAAC1B,SAAS,CAAC,CAAC4O,WAAW,CAAC,CAAC;IAC/BC,WAAW,CAACnN,MAAM,CAAC1B,SAAS,CAAC,CAAC4O,WAAW,EAAE,IAAI,CAAC;EACjD,CAAC;EACKxN,iBAAiB,WAAjBA,iBAAiBA,CAAA,EAAG;IAAA,IAAA0N,MAAA;IAAA,OAAA7R,iBAAA,cAAAb,YAAA,GAAAE,CAAA,UAAAyS,QAAA;MAAA,IAAAC,EAAA;MAAA,OAAA5S,YAAA,GAAAC,CAAA,WAAA4S,QAAA;QAAA,kBAAAA,QAAA,CAAAhU,CAAA,GAAAgU,QAAA,CAAA7U,CAAA;UAAA;YAAA6U,QAAA,CAAAhU,CAAA;YAAAgU,QAAA,CAAA7U,CAAA;YAAA,OAEa0U,MAAI,CAACI,kBAAkB,CAAC,CAAC;UAAA;YAA9DJ,MAAI,CAACK,uBAAuB,GAAAF,QAAA,CAAA7T,CAAA;YAC5B0T,MAAI,CAACpD,+BAA+B,CAAC,CAAC;YAACuD,QAAA,CAAA7U,CAAA;YAAA;UAAA;YAAA6U,QAAA,CAAAhU,CAAA;YAAA+T,EAAA,GAAAC,QAAA,CAAA7T,CAAA;YAEvCgU,OAAO,CAACC,GAAG,CAAC,2BAA2B,EAAAL,EAAG,CAAC;YAC3CF,MAAI,CAACK,uBAAuB,GAAG,CAAC,CAAC;UAAC;YAAA,OAAAF,QAAA,CAAA5T,CAAA;QAAA;MAAA,GAAA0T,OAAA;IAAA;EAEpC,CAAC;EACDrD,+BAA+B,WAA/BA,+BAA+BA,CAAA,EAAG;IACjC,IAAI,CAAC,IAAI,CAACyD,uBAAuB,EAAE;IACnC,IAAI,CAACzN,MAAM,CAAC1B,SAAS,CAAC,CAAC8B,aAAa,EAAE;IACtC,SAAAwN,GAAA,MAAAC,eAAA,GAAgC1U,MAAM,CAACuI,OAAO,CAAC,IAAI,CAAC+L,uBAAuB,CAAC,EAAAG,GAAA,GAAAC,eAAA,CAAA/T,MAAA,EAAA8T,GAAA,IAAE;MAAzE,IAAAE,kBAAA,GAAAnQ,cAAA,CAAAkQ,eAAA,CAAAD,GAAA;QAAOlL,OAAO,GAAAoL,kBAAA;QAAEnL,MAAM,GAAAmL,kBAAA;MAC1B,IAAI9N,MAAM,CAAC1B,SAAS,CAAC,CAAC8B,aAAa,CAACyC,IAAI,EAAE;QACzC7C,MAAM,CAAC1B,SAAS,CAAC,CAAC8B,aAAa,CAACyC,IAAI,CAAC7C,MAAM,CAAC1B,SAAS,CAAC,CAAC8B,aAAa,CAAC0C,iBAAiB,EAAEJ,OAAO,EAAEC,MAAM,CAAC;MACzG,CAAC,MAAM;QACN3C,MAAM,CAAC1B,SAAS,CAAC,CAAC8B,aAAa,CAAC0C,iBAAiB,CAACJ,OAAO,CAAC,GAAGC,MAAM;MACpE;IACD;EACD,CAAC;EACDoL,iBAAiB,WAAjBA,iBAAiBA,CAAA,EAAG;IACnB,OAAO,IAAI3S,OAAO,CAAC,UAACC,OAAO,EAAE2S,MAAM,EAAK;MACvC,IAAI;QACH,IAAMC,GAAG,GAAGC,SAAS,CAACC,IAAI,CAAC,0BAA0B,EAAE,CAAC,CAAC;QACzDF,GAAG,CAACG,eAAe,GAAG,YAAM;UAC3B,IAAMC,EAAE,GAAGJ,GAAG,CAACnF,MAAM;UACrB,IAAI,CAACuF,EAAE,CAACC,gBAAgB,CAACC,QAAQ,CAAC,mBAAmB,CAAC,EAAE;YACvDF,EAAE,CAACG,iBAAiB,CAAC,mBAAmB,EAAE;cAAEC,OAAO,EAAE;YAAU,CAAC,CAAC;UAClE;QACD,CAAC;QACDR,GAAG,CAACS,SAAS,GAAG;UAAA,OAAMrT,OAAO,CAAC4S,GAAG,CAACnF,MAAM,CAAC;QAAA;QACzCmF,GAAG,CAACU,OAAO,GAAG;UAAA,OAAMX,MAAM,CAACC,GAAG,CAACW,KAAK,CAAC;QAAA;MACtC,CAAC,CAAC,OAAOtW,CAAC,EAAE;QACX0V,MAAM,CAAC1V,CAAC,CAAC;MACV;IACD,CAAC,CAAC;EACH,CAAC;EACKuW,aAAa,WAAbA,aAAaA,CAACnM,OAAO,EAAEC,MAAM,EAAE;IAAA,IAAAmM,MAAA;IAAA,OAAAvT,iBAAA,cAAAb,YAAA,GAAAE,CAAA,UAAAmU,SAAA;MAAA,IAAAV,EAAA;MAAA,OAAA3T,YAAA,GAAAC,CAAA,WAAAqU,SAAA;QAAA,kBAAAA,SAAA,CAAAtW,CAAA;UAAA;YAAAsW,SAAA,CAAAtW,CAAA;YAAA,OACnBoW,MAAI,CAACf,iBAAiB,CAAC,CAAC;UAAA;YAAnCM,EAAE,GAAAW,SAAA,CAAAtV,CAAA;YAAA,OAAAsV,SAAA,CAAArV,CAAA,IACD,IAAIyB,OAAO,CAAC,UAACC,OAAO,EAAE2S,MAAM,EAAK;cACvC,IAAMiB,EAAE,GAAGZ,EAAE,CAACa,WAAW,CAAC,mBAAmB,EAAE,WAAW,CAAC;cAC3D,IAAMC,KAAK,GAAGF,EAAE,CAACG,WAAW,CAAC,mBAAmB,CAAC;cACjDD,KAAK,CAACE,GAAG,CAAC;gBAAE3M,OAAO,EAAPA,OAAO;gBAAEC,MAAM,EAANA,MAAM;gBAAE2M,SAAS,EAAEzE,IAAI,CAACS,GAAG,CAAC;cAAE,CAAC,CAAC;cACrD2D,EAAE,CAACM,UAAU,GAAG,YAAM;gBAAElB,EAAE,CAACmB,KAAK,CAAC,CAAC;gBAAEnU,OAAO,CAAC,CAAC;cAAE,CAAC;cAChD4T,EAAE,CAACN,OAAO,GAAG,YAAM;gBAAE,IAAMnF,GAAG,GAAGyF,EAAE,CAACL,KAAK;gBAAEP,EAAE,CAACmB,KAAK,CAAC,CAAC;gBAAExB,MAAM,CAACxE,GAAG,CAAC;cAAE,CAAC;YACtE,CAAC,CAAC;QAAA;MAAA,GAAAuF,QAAA;IAAA;EACH,CAAC;EACKvB,kBAAkB,WAAlBA,kBAAkBA,CAAA,EAAG;IAAA,IAAAiC,MAAA;IAAA,OAAAlU,iBAAA,cAAAb,YAAA,GAAAE,CAAA,UAAA8U,SAAA;MAAA,IAAArB,EAAA;MAAA,OAAA3T,YAAA,GAAAC,CAAA,WAAAgV,SAAA;QAAA,kBAAAA,SAAA,CAAAjX,CAAA;UAAA;YAAAiX,SAAA,CAAAjX,CAAA;YAAA,OACT+W,MAAI,CAAC1B,iBAAiB,CAAC,CAAC;UAAA;YAAnCM,EAAE,GAAAsB,SAAA,CAAAjW,CAAA;YAAA,OAAAiW,SAAA,CAAAhW,CAAA,IACD,IAAIyB,OAAO,CAAC,UAACC,OAAO,EAAE2S,MAAM,EAAK;cACvC,IAAMiB,EAAE,GAAGZ,EAAE,CAACa,WAAW,CAAC,mBAAmB,EAAE,WAAW,CAAC;cAC3D,IAAMC,KAAK,GAAGF,EAAE,CAACG,WAAW,CAAC,mBAAmB,CAAC;cACjD,IAAMnB,GAAG,GAAGkB,KAAK,CAACS,MAAM,CAAC,CAAC;cAC1B3B,GAAG,CAACS,SAAS,GAAG,YAAM;gBACrB,IAAMnG,GAAG,GAAG,CAAC,CAAC;gBACd,IAAM+C,GAAG,GAAGT,IAAI,CAACS,GAAG,CAAC,CAAC;gBACtB,IAAMuE,KAAK,GAAGnS,MAAM,CAAC+R,MAAI,CAAC/Q,kBAAkB,CAAC,IAAK,GAAG,GAAG,EAAE,GAAG,IAAK;gBAAC,IAAAoR,UAAA,GAAAlU,0BAAA,CACjDqS,GAAG,CAACnF,MAAM,IAAI,EAAE;kBAAAiH,MAAA;gBAAA;kBAAlC,KAAAD,UAAA,CAAA5T,CAAA,MAAA6T,MAAA,GAAAD,UAAA,CAAApX,CAAA,IAAAwB,IAAA,GAAoC;oBAAA,IAAzB8V,GAAG,GAAAD,MAAA,CAAA5V,KAAA;oBACb,IAAMuI,OAAO,GAAGsN,GAAG,aAAHA,GAAG,uBAAHA,GAAG,CAAEtN,OAAO;oBAC5B,IAAMC,MAAM,GAAGqN,GAAG,aAAHA,GAAG,uBAAHA,GAAG,CAAErN,MAAM;oBAC1B,IAAM2M,SAAS,GAAG5R,MAAM,CAACsS,GAAG,aAAHA,GAAG,uBAAHA,GAAG,CAAEV,SAAS,CAAC,IAAI,CAAC;oBAC7C,IAAMW,OAAO,GAAGvN,OAAO,IAAIC,MAAM,IAAI2M,SAAS,GAAG,CAAC,IAAKhE,GAAG,GAAGgE,SAAS,IAAKO,KAAK;oBAChF,IAAII,OAAO,EAAE;sBACZ1H,GAAG,CAAC7F,OAAO,CAAC,GAAGC,MAAM;oBACtB,CAAC,MAAM,IAAID,OAAO,EAAE;sBACnB;sBACA,IAAI;wBAAEyM,KAAK,UAAO,CAACzM,OAAO,CAAC;sBAAE,CAAC,CAAC,OAAOpK,CAAC,EAAE,CAAE;oBAC5C;kBACD;gBAAC,SAAAkR,GAAA;kBAAAsG,UAAA,CAAAxX,CAAA,CAAAkR,GAAA;gBAAA;kBAAAsG,UAAA,CAAAxW,CAAA;gBAAA;gBACD2V,EAAE,CAACM,UAAU,GAAG,YAAM;kBAAElB,EAAE,CAACmB,KAAK,CAAC,CAAC;kBAAEnU,OAAO,CAACkN,GAAG,CAAC;gBAAE,CAAC;gBACnD0G,EAAE,CAACN,OAAO,GAAG,YAAM;kBAAE,IAAMnF,GAAG,GAAGyF,EAAE,CAACL,KAAK;kBAAEP,EAAE,CAACmB,KAAK,CAAC,CAAC;kBAAExB,MAAM,CAACxE,GAAG,CAAC;gBAAE,CAAC;cACtE,CAAC;cACDyE,GAAG,CAACU,OAAO,GAAG,YAAM;gBAAE,IAAMnF,GAAG,GAAGyE,GAAG,CAACW,KAAK;gBAAEP,EAAE,CAACmB,KAAK,CAAC,CAAC;gBAAExB,MAAM,CAACxE,GAAG,CAAC;cAAE,CAAC;YACxE,CAAC,CAAC;QAAA;MAAA,GAAAkG,QAAA;IAAA;EACH,CAAC;EACD/P,oBAAoB,WAApBA,oBAAoBA,CAAA,EAAG;IACtBd,CAAC,CAACqR,GAAG,CAAC;MACLC,GAAG,EAAEnQ,MAAM,CAAC1B,SAAS,CAAC,CAACa,gBAAgB;MACvCiR,EAAE,EAAE,KAAK;MACTC,MAAM,EAAE,MAAM;MACdC,SAAS,WAATA,SAASA,CAACC,QAAQ,EAAE;QAAA,IAAAC,cAAA,EAAAC,eAAA;QACnB/C,OAAO,CAACC,GAAG,CAAC,wBAAwB,EAAE4C,QAAQ,CAAC;QAC/C,IAAMG,WAAW,GAAGH,QAAQ,aAARA,QAAQ,gBAAAC,cAAA,GAARD,QAAQ,CAAE7P,IAAI,cAAA8P,cAAA,uBAAdA,cAAA,CAAgBG,YAAY;QAChD,IAAMC,YAAY,GAAGL,QAAQ,aAARA,QAAQ,gBAAAE,eAAA,GAARF,QAAQ,CAAE7P,IAAI,cAAA+P,eAAA,uBAAdA,eAAA,CAAgBI,aAAa;QAClD,IAAIH,WAAW,IAAIE,YAAY,EAAE;UAChC5Q,MAAM,CAAC1B,SAAS,CAAC,CAACwS,aAAa,CAACJ,WAAW,EAAEE,YAAY,CAAC;UAC1D5Q,MAAM,CAAC1B,SAAS,CAAC,CAACyS,iBAAiB,CAAC,CAAC;QACtC;MACD,CAAC;MACDC,SAAS,WAATA,SAASA,CAACT,QAAQ,EAAE;QACnB7C,OAAO,CAACC,GAAG,CAAC,uBAAuB,EAAE4C,QAAQ,CAAC;MAC/C,CAAC;MACDU,OAAO,WAAPA,OAAOA,CAACC,YAAY,EAAEC,OAAO,EAAEC,GAAG,EAAE;QACnC1D,OAAO,CAACC,GAAG,CAAC,qBAAqB,EAAEuD,YAAY,EAAEE,GAAG,CAAC;MACtD;IACD,CAAC,CAAC;EACH,CAAC;EACDN,aAAa,WAAbA,aAAaA,CAACJ,WAAW,EAAEE,YAAY,EAAE;IACxC,IAAI,CAACS,WAAW,GAAG,IAAI,CAACA,WAAW,IAAI,CAAC,CAAC;IACzC,IAAI,CAACA,WAAW,CAACV,YAAY,GAAGD,WAAW;IAC3C,IAAI,CAACW,WAAW,CAACR,aAAa,GAAGD,YAAY;IAC7C,IAAI,CAACS,WAAW,CAACC,GAAG,GAAG,IAAI,CAACC,SAAS,CAACb,WAAW,CAAC;EACnD,CAAC;EACDa,SAAS,WAATA,SAASA,CAACC,KAAK,EAAE;IAChB,IAAI;MACH,IAAI,CAACA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE,OAAO,CAAC;MACjD,IAAMC,KAAK,GAAGD,KAAK,CAACE,KAAK,CAAC,GAAG,CAAC;MAC9B,IAAID,KAAK,CAAC3X,MAAM,GAAG,CAAC,EAAE,OAAO,CAAC;MAC9B,IAAM6X,UAAU,GAAGF,KAAK,CAAC,CAAC,CAAC,CAAClP,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAACA,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;MACjE,IAAMqP,MAAM,GAAGD,UAAU,GAAG,GAAG,CAACE,MAAM,CAAC,CAAC,CAAC,GAAIF,UAAU,CAAC7X,MAAM,GAAG,CAAE,IAAI,CAAC,CAAC;MACzE,IAAMgY,IAAI,GAAGC,IAAI,CAACH,MAAM,CAAC;MACzB,IAAMI,OAAO,GAAGC,IAAI,CAACC,KAAK,CAACJ,IAAI,CAAC;MAChC,OAAOpU,MAAM,CAACsU,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEV,GAAG,CAAC,IAAI,CAAC;IACjC,CAAC,CAAC,OAAOhZ,CAAC,EAAE;MACX,OAAO,CAAC;IACT;EACD,CAAC;EACD6Z,oBAAoB,WAApBA,oBAAoBA,CAAA,EAAkB;IAAA,IAAAC,iBAAA;IAAA,IAAjBC,WAAW,GAAA7W,SAAA,CAAA1B,MAAA,QAAA0B,SAAA,QAAA+D,SAAA,GAAA/D,SAAA,MAAG,CAAC;IACnC,IAAM8V,GAAG,GAAG5T,MAAM,EAAA0U,iBAAA,GAAC,IAAI,CAACf,WAAW,cAAAe,iBAAA,uBAAhBA,iBAAA,CAAkBd,GAAG,CAAC,IAAI,CAAC;IAC9C,IAAI,CAACA,GAAG,EAAE,OAAO,KAAK,CAAC,CAAC;IACxB,IAAMhG,GAAG,GAAGxF,IAAI,CAACgB,KAAK,CAAC+D,IAAI,CAACS,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IACzC,OAAOA,GAAG,GAAG+G,WAAW,IAAIf,GAAG;EAChC,CAAC;EACDgB,8BAA8B,WAA9BA,8BAA8BA,CAAA,EAAG;IAAA,IAAAC,kBAAA;MAAAC,MAAA;IAChC;IACA,IAAI,IAAI,CAACC,qBAAqB,EAAE;MAC/BC,YAAY,CAAC,IAAI,CAACD,qBAAqB,CAAC;MACxC,IAAI,CAACA,qBAAqB,GAAG,IAAI;IAClC;IACA,IAAMnB,GAAG,GAAG5T,MAAM,EAAA6U,kBAAA,GAAC,IAAI,CAAClB,WAAW,cAAAkB,kBAAA,uBAAhBA,kBAAA,CAAkBjB,GAAG,CAAC,IAAI,CAAC;IAC9C,IAAI,CAACA,GAAG,EAAE;IACV,IAAMhG,GAAG,GAAGxF,IAAI,CAACgB,KAAK,CAAC+D,IAAI,CAACS,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IACzC,IAAMqH,YAAY,GAAG7M,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEuL,GAAG,GAAGhG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;IAClD,IAAI,CAACmH,qBAAqB,GAAGG,UAAU,CAAC,YAAM;MAC7C;MACAJ,MAAI,CAAC7S,oBAAoB,CAAC,CAAC;IAC5B,CAAC,EAAEgT,YAAY,GAAG,IAAI,CAAC;EACxB,CAAC;EACDE,2BAA2B,WAA3BA,2BAA2BA,CAACC,MAAM,EAAuB;IAAA,IAAAC,MAAA;IAAA,IAArBC,WAAW,GAAAxX,SAAA,CAAA1B,MAAA,QAAA0B,SAAA,QAAA+D,SAAA,GAAA/D,SAAA,MAAG,KAAK;IACtD,IAAI,IAAI,CAACyX,yBAAyB,EAAE;MACnCP,YAAY,CAAC,IAAI,CAACO,yBAAyB,CAAC;MAC5C,IAAI,CAACA,yBAAyB,GAAG,IAAI;IACtC;IACA,IAAI,CAACC,2BAA2B,GAAG,CAAC,IAAI,CAACA,2BAA2B,IAAI,CAAC,IAAI,CAAC;IAC9E,IAAMC,KAAK,GAAGrN,IAAI,CAACE,GAAG,CAAC,KAAK,EAAE,IAAI,GAAGF,IAAI,CAACsN,GAAG,CAAC,CAAC,EAAEtN,IAAI,CAACE,GAAG,CAAC,CAAC,EAAE,IAAI,CAACkN,2BAA2B,GAAG,CAAC,CAAC,CAAC,CAAC;IACpG,IAAI,CAACD,yBAAyB,GAAGL,UAAU,CAAC,YAAM;MACjD,IAAII,WAAW,IAAID,MAAI,CAACZ,oBAAoB,CAAC,CAAC,CAAC,EAAE;QAChDY,MAAI,CAACpT,oBAAoB,CAAC,CAAC;MAC5B,CAAC,MAAM;QACNoT,MAAI,CAAChC,iBAAiB,CAAC,CAAC;MACzB;IACD,CAAC,EAAEoC,KAAK,CAAC;IACTzF,OAAO,CAACC,GAAG,CAAC,iCAAiC,EAAE;MAAEmF,MAAM,EAANA,MAAM;MAAEO,OAAO,EAAEF;IAAM,CAAC,CAAC;EAC3E,CAAC;EACDpC,iBAAiB,WAAjBA,iBAAiBA,CAAA,EAAG;IAAA,IAAAuC,MAAA;IACnB,IAAI;MAAA,IAAAC,kBAAA;MACH,IAAM7C,WAAW,IAAA6C,kBAAA,GAAG,IAAI,CAAClC,WAAW,cAAAkC,kBAAA,uBAAhBA,kBAAA,CAAkB5C,YAAY;MAClD,IAAI,CAACD,WAAW,EAAE;;MAElB;MACA,IAAI,IAAI,CAAC8C,WAAW,KAAK,IAAI,CAACA,WAAW,CAACC,UAAU,KAAKC,SAAS,CAACC,IAAI,IAAI,IAAI,CAACH,WAAW,CAACC,UAAU,KAAKC,SAAS,CAACE,UAAU,CAAC,EAAE;QACjI;MACD;MACA;MACA,IAAI,CAACV,2BAA2B,GAAG,CAAC;MAEpC,IAAMW,OAAO,GAAG7T,MAAM,CAAC8T,QAAQ,CAACC,QAAQ,KAAK,QAAQ,GAAG,KAAK,GAAG,IAAI;MACpE,IAAMC,MAAM,GAAGhU,MAAM,CAAC8T,QAAQ,CAACG,IAAI,CAAC,CAAC;MACrC,IAAMC,UAAU,GAAGC,kBAAkB,CAACzD,WAAW,CAAC;MAClD,IAAM0D,KAAK,MAAAjS,MAAA,CAAM0R,OAAO,SAAA1R,MAAA,CAAM6R,MAAM,0EAAA7R,MAAA,CAAuE+R,UAAU,CAAE;MAEvH,IAAI,CAACV,WAAW,GAAG,IAAIE,SAAS,CAACU,KAAK,CAAC;MACvC,IAAI,CAACZ,WAAW,CAACa,MAAM,GAAG,YAAM;QAC/B3G,OAAO,CAACC,GAAG,CAAC,uBAAuB,CAAC;QACpC2F,MAAI,CAAChB,8BAA8B,CAAC,CAAC;MACtC,CAAC;MACD,IAAI,CAACkB,WAAW,CAACc,SAAS,GAAG,UAACtI,KAAK,EAAK;QACvCsH,MAAI,CAACiB,uBAAuB,CAACvI,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEtL,IAAI,CAAC;MAC1C,CAAC;MACD,IAAI,CAAC8S,WAAW,CAAC7E,OAAO,GAAG,UAAC3C,KAAK,EAAK;QACrC0B,OAAO,CAACC,GAAG,CAAC,mBAAmB,EAAE3B,KAAK,CAAC;MACxC,CAAC;MACD,IAAI,CAACwH,WAAW,CAACgB,OAAO,GAAG,UAACxI,KAAK,EAAK;QACrC,IAAMyI,IAAI,GAAGzI,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEyI,IAAI;QACxB,IAAM3B,MAAM,GAAG9G,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAE8G,MAAM;QAC5BpF,OAAO,CAACC,GAAG,CAAC,oBAAoB,EAAE;UAAE8G,IAAI,EAAJA,IAAI;UAAE3B,MAAM,EAANA;QAAO,CAAC,CAAC;QAEnD,IAAIQ,MAAI,CAACb,qBAAqB,EAAE;UAC/BC,YAAY,CAACY,MAAI,CAACb,qBAAqB,CAAC;UACxCa,MAAI,CAACb,qBAAqB,GAAG,IAAI;QAClC;;QAEA;QACA,IAAMiC,cAAc,GAAG,IAAIC,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACxD,IAAM3B,WAAW,GAAG0B,cAAc,CAACE,GAAG,CAACH,IAAI,CAAC,IAAInB,MAAI,CAACnB,oBAAoB,CAAC,CAAC,CAAC;QAC5EmB,MAAI,CAACT,2BAA2B,CAAC,OAAO,EAAEG,WAAW,CAAC;MACvD,CAAC;IACF,CAAC,CAAC,OAAO1a,CAAC,EAAE;MACXoV,OAAO,CAACC,GAAG,CAAC,wBAAwB,EAAErV,CAAC,CAAC;MACxC,IAAI,CAACua,2BAA2B,CAAC,YAAY,EAAE,IAAI,CAACV,oBAAoB,CAAC,CAAC,CAAC,CAAC;IAC7E;EACD,CAAC;EACDoC,uBAAuB,WAAvBA,uBAAuBA,CAAC7T,IAAI,EAAE;IAC7B,IAAI;MACH,IAAI,CAACA,IAAI,EAAE;MACX,IAAMmU,MAAM,GAAG,OAAOnU,IAAI,KAAK,QAAQ,GAAGuR,IAAI,CAACC,KAAK,CAACxR,IAAI,CAAC,GAAGA,IAAI;MACjE,IAAMqH,KAAK,GAAGlM,KAAK,CAACC,OAAO,CAAC+Y,MAAM,CAAC,GAAGA,MAAM,GAAG,CAACA,MAAM,CAAC;MAAC,IAAAC,UAAA,GAAAlZ,0BAAA,CACrCmM,KAAK;QAAAgN,MAAA;MAAA;QAAxB,KAAAD,UAAA,CAAA5Y,CAAA,MAAA6Y,MAAA,GAAAD,UAAA,CAAApc,CAAA,IAAAwB,IAAA,GAA0B;UAAA,IAAfgI,IAAI,GAAA6S,MAAA,CAAA5a,KAAA;UACd,IAAMmI,MAAM,GAAG7E,MAAM,CAAC,CAAAyE,IAAI,aAAJA,IAAI,uBAAJA,IAAI,CAAEjB,MAAM,KAAI,EAAE,CAAC,CAACsB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;UAC7D,IAAMG,OAAO,GAAGJ,MAAM,CAACxI,MAAM,IAAI,EAAE,GAAGwI,MAAM,GAAGA,MAAM,CAACtE,KAAK,CAAC,CAAC,EAAE,CAAC;UAChE,IAAM2E,MAAM,GAAGlF,MAAM,CAAC,CAAAyE,IAAI,aAAJA,IAAI,uBAAJA,IAAI,CAAES,MAAM,KAAI,EAAE,CAAC,CAACC,IAAI,CAAC,CAAC;UAChD,IAAIF,OAAO,IAAIC,MAAM,EAAE;YACtB,IAAI,CAAC8K,uBAAuB,GAAG,IAAI,CAACA,uBAAuB,IAAI,CAAC,CAAC;YACjE,IAAI,CAACA,uBAAuB,CAAC/K,OAAO,CAAC,GAAGC,MAAM;YAC9C,IAAI,CAACkM,aAAa,CAACnM,OAAO,EAAEC,MAAM,CAAC,SAAM,CAAC,UAACrK,CAAC;cAAA,OAAKoV,OAAO,CAACC,GAAG,CAAC,2BAA2B,EAAErV,CAAC,CAAC;YAAA,EAAC;UAC9F;UACA,IAAI0H,MAAM,CAAC1B,SAAS,CAAC,CAAC8B,aAAa,EAAE;YACpCJ,MAAM,CAAC1B,SAAS,CAAC,CAAC8B,aAAa,CAACoC,mBAAmB,CAACN,IAAI,CAAC;UAC1D;QACD;MAAC,SAAAsH,GAAA;QAAAsL,UAAA,CAAAxc,CAAA,CAAAkR,GAAA;MAAA;QAAAsL,UAAA,CAAAxb,CAAA;MAAA;IACF,CAAC,CAAC,OAAOhB,CAAC,EAAE;MACXoV,OAAO,CAACC,GAAG,CAAC,yBAAyB,EAAErV,CAAC,CAAC;IAC1C;EACD,CAAC;EACD4K,iBAAiB,WAAjBA,iBAAiBA,CAACC,SAAS,EAAE;IAC5B,IAAI,CAACA,SAAS,EAAE,OAAO,GAAG;IAE1B,IAAMmI,GAAG,GAAGxF,IAAI,CAACgB,KAAK,CAAC+D,IAAI,CAACS,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IACzC,IAAM0J,WAAW,GAAG1J,GAAG,GAAGnI,SAAS;IAEnC,OAAOnD,MAAM,CAAC1B,SAAS,CAAC,CAACiN,YAAY,CAACyJ,WAAW,CAAC;EACnD,CAAC;EACDzJ,YAAY,WAAZA,YAAYA,CAACyJ,WAAW,EAAC;IACxB,IAAIA,WAAW,GAAG,CAAC,EAAE,OAAO,GAAG;IAC/B;IACA,IAAMlK,KAAK,GAAKhF,IAAI,CAACgB,KAAK,CAACkO,WAAW,GAAG,IAAI,CAAC;IAC9C,IAAM/J,OAAO,GAAGnF,IAAI,CAACgB,KAAK,CAAEkO,WAAW,GAAG,IAAI,GAAI,EAAE,CAAC;IACrD,IAAM7J,OAAO,GAAGrF,IAAI,CAACG,KAAK,CAAC+O,WAAW,GAAG,EAAE,CAAC;IAC5C,IAAIlK,KAAK,GAAG,CAAC,EAAE;MACd,UAAA3I,MAAA,CAAU2I,KAAK,OAAA3I,MAAA,CAAI8I,OAAO,CAAClN,QAAQ,CAAC,CAAC,CAACiN,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,OAAA7I,MAAA,CAAIgJ,OAAO,CAACpN,QAAQ,CAAC,CAAC,CAACiN,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;IAC9F,CAAC,MAAM,IAAIC,OAAO,GAAG,CAAC,EAAE;MACvB,UAAA9I,MAAA,CAAU8I,OAAO,OAAA9I,MAAA,CAAIgJ,OAAO,CAACpN,QAAQ,CAAC,CAAC,CAACiN,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;IACzD,CAAC,MAAM;MACN,UAAA7I,MAAA,CAAUgJ,OAAO;IAClB;EACD,CAAC;EACDlL,eAAe,WAAfA,eAAeA,CAACgV,WAAW,EAAE9a,KAAK,EAAE;IACnC,IAAG6F,MAAM,CAAC1B,SAAS,CAAC,CAACG,MAAM,EAAC;MAC3B;IACD;IACA,IAAIiC,IAAI,GAAAxD,eAAA,KACN+X,WAAW,EAAG9a,KAAK,CACpB;IACD0E,CAAC,CAACqR,GAAG,CAAC;MACLC,GAAG,EAAEnQ,MAAM,CAAC1B,SAAS,CAAC,CAACe,iBAAiB;MACxC+Q,EAAE,EAAE,KAAK;MACTC,MAAM,EAAE,MAAM;MACd3P,IAAI,EAAEA,IAAI;MACVwU,WAAW,WAAXA,WAAWA,CAAC3E,QAAQ,EAAE;QACrB,OAAOA,QAAQ,KAAKhR,SAAS,IAAIpG,MAAM,CAACwD,IAAI,CAAC4T,QAAQ,CAAC,CAACzW,MAAM,GAAG,CAAC,IAAIyW,QAAQ,CAAC4E,OAAO,KAAK,IAAI;MAC/F,CAAC;MACD7E,SAAS,WAATA,SAASA,CAACC,QAAQ,EAAE;QACnB,IAAG0E,WAAW,KAAK,SAAS,EAAC;UAC5BpW,CAAC,CAAC,UAAU,CAAC,CAACqB,GAAG,CAACrB,CAAC,CAACmB,MAAM,CAAC1B,SAAS,CAAC,CAACK,iBAAiB,CAAC,CAACiB,QAAQ,CAAC,WAAW,CAAC,CAAC;QAChF,CAAC,MAAK,IAAIqV,WAAW,KAAK,aAAa,EAAC;UACvCjV,MAAM,CAAC8T,QAAQ,CAACsB,IAAI,GAAGpV,MAAM,CAAC8T,QAAQ,CAACsB,IAAI;QAC5C;MACD,CAAC;MACDpE,SAAS,WAATA,SAASA,CAACT,QAAQ,EAAE;QACnB7C,OAAO,CAACC,GAAG,CAAC4C,QAAQ,CAAC;MACtB,CAAC;MACDU,OAAO,WAAPA,OAAOA,CAACC,YAAY,EAAEC,OAAO,EAAEC,GAAG,EAAE;QACnC1D,OAAO,CAACC,GAAG,CAACuD,YAAY,EAACE,GAAG,CAAC;MAC9B;IACD,CAAC,CAAC;EACH,CAAC;EACDhF,iBAAiB,WAAjBA,iBAAiBA,CAAC1L,IAAI,EAAE;IACvB7B,CAAC,CAACqR,GAAG,CAAC;MACLC,GAAG,EAAEnQ,MAAM,CAAC1B,SAAS,CAAC,CAACc,cAAc;MACrCgR,EAAE,EAAE,KAAK;MACTC,MAAM,EAAE,MAAM;MACd3P,IAAI,EAAEA,IAAI;MACVwU,WAAW,WAAXA,WAAWA,CAAC3E,QAAQ,EAAE;QACrB,OAAOA,QAAQ,KAAKhR,SAAS,IAAIpG,MAAM,CAACwD,IAAI,CAAC4T,QAAQ,CAAC,CAACzW,MAAM,GAAG,CAAC,IAAIyW,QAAQ,CAAC4E,OAAO,KAAK,IAAI;MAC/F,CAAC;MACD7E,SAAS,WAATA,SAASA,CAACC,QAAQ,EAAE;QACnB7C,OAAO,CAACC,GAAG,CAAC4C,QAAQ,CAAC;MACtB,CAAC;MACDS,SAAS,WAATA,SAASA,CAACT,QAAQ,EAAE;QACnB7C,OAAO,CAACC,GAAG,CAAC4C,QAAQ,CAAC;MACtB,CAAC;MACDU,OAAO,WAAPA,OAAOA,CAACC,YAAY,EAAEC,OAAO,EAAEC,GAAG,EAAE;QACnC1D,OAAO,CAACC,GAAG,CAACuD,YAAY,EAACE,GAAG,CAAC;MAC9B;IACD,CAAC,CAAC;EACH,CAAC;EACDlE,WAAW,WAAXA,WAAWA,CAAA,EAAG;IACbrO,CAAC,CAACqR,GAAG,CAAC;MACLC,GAAG,EAAEnQ,MAAM,CAAC1B,SAAS,CAAC,CAACY,mBAAmB;MAC1CkR,EAAE,EAAE,KAAK;MACTC,MAAM,EAAE,MAAM;MACd6E,WAAW,WAAXA,WAAWA,CAAC3E,QAAQ,EAAE;QACrB,OAAOA,QAAQ,KAAKhR,SAAS,IAAIpG,MAAM,CAACwD,IAAI,CAAC4T,QAAQ,CAAC,CAACzW,MAAM,GAAG,CAAC,IAAIyW,QAAQ,CAAC4E,OAAO,KAAK,IAAI;MAC/F,CAAC;MACD7E,SAAS,WAATA,SAASA,CAACC,QAAQ,EAAE;QACnBvQ,MAAM,CAAC1B,SAAS,CAAC,CAAC8B,aAAa,CAACK,wBAAwB,CAAC8P,QAAQ,CAAC;QAClEvQ,MAAM,CAAC1B,SAAS,CAAC,CAAC2L,YAAY,CAACxJ,wBAAwB,CAAC8P,QAAQ,CAAC;MAClE,CAAC;MACDS,SAAS,WAATA,SAASA,CAACT,QAAQ,EAAE;QACnB7C,OAAO,CAACC,GAAG,CAAC4C,QAAQ,CAAC;MACtB,CAAC;MACDU,OAAO,WAAPA,OAAOA,CAACC,YAAY,EAAEC,OAAO,EAAEC,GAAG,EAAE;QACnC1D,OAAO,CAACC,GAAG,CAACuD,YAAY,EAACE,GAAG,CAAC;MAC9B;IACD,CAAC,CAAC;EACH,CAAC;EAED;AACD;AACA;AACA;AACA;EACCiE,gBAAgB,WAAhBA,gBAAgBA,CAACC,QAAQ,EAAE;IAC1B,IAAMxM,MAAM,GAAGwM,QAAQ;IACvBxM,MAAM,CAACpI,IAAI,GAAGV,MAAM,CAAC1B,SAAS,CAAC,CAACM,QAAQ,CAAC2W,IAAI,CAAC,YAAY,CAAC;IAC3D,OAAOzM,MAAM;EACd,CAAC;EACD;AACD;AACA;EACC0M,eAAe,WAAfA,eAAeA,CAAA,EAAG,CAElB,CAAC;EACD;AACD;AACA;EACC1I,cAAc,WAAdA,cAAcA,CAAA,EAAG;IAChB2I,IAAI,CAAC7W,QAAQ,GAAGoB,MAAM,CAAC1B,SAAS,CAAC,CAACM,QAAQ;IAC1C6W,IAAI,CAACtF,GAAG,MAAAhO,MAAA,CAAMlD,aAAa,EAAAkD,MAAA,CAAG/D,KAAK,UAAO;IAC1CqX,IAAI,CAACjW,aAAa,GAAGQ,MAAM,CAAC1B,SAAS,CAAC,CAACkB,aAAa;IACpDiW,IAAI,CAACJ,gBAAgB,GAAGrV,MAAM,CAAC1B,SAAS,CAAC,CAAC+W,gBAAgB;IAC1DI,IAAI,CAACD,eAAe,GAAGxV,MAAM,CAAC1B,SAAS,CAAC,CAACkX,eAAe;IACxDC,IAAI,CAAChW,UAAU,CAAC,CAAC;EAClB;AACD,CAAC;AAEDZ,CAAC,CAACqI,QAAQ,CAAC,CAACwO,KAAK,CAAC,YAAM;EACvB1V,MAAM,CAAC1B,SAAS,CAAC,CAACmB,UAAU,CAAC,CAAC;AAC/B,CAAC,CAAC","ignoreList":[]}
\ No newline at end of file
diff --git a/public/assets/js/src/module-monitor-active-calls-index.js b/public/assets/js/src/module-monitor-active-calls-index.js
index 47d2e97..015c5c4 100644
--- a/public/assets/js/src/module-monitor-active-calls-index.js
+++ b/public/assets/js/src/module-monitor-active-calls-index.js
@@ -13,12 +13,14 @@ const inputClassName = 'mikopbx-module-input';
/* global $, globalRootUrl, globalTranslate, Form, Config, Vue, Extensions */
const ModuleMonitorActiveCalls = {
isInit: true,
+ contactsCacheTtlMs: 120 * 60 * 1000,
queueNameSelector: '#app-queue div.scrolling.dropdown',
$formObj: $('#'+idForm),
$checkBoxes: $('#'+idForm+' .ui.checkbox'),
$dropDowns: $('#'+idForm+' .ui.dropdown'),
activeChannelsUrl: globalRootUrl + idUrl + "/getActiveChannels",
activeChannelsUrlV2: globalRootUrl + idUrl + "/getActiveChannelsV2",
+ backendEnableUrl: globalRootUrl + idUrl + "/backandEnable",
executeCallUrl: globalRootUrl + idUrl + "/executeCall",
saveUserActionUrl: globalRootUrl + idUrl + "/saveUser",
$widget: undefined,
@@ -32,6 +34,9 @@ const ModuleMonitorActiveCalls = {
* On page load we init some Semantic UI library
*/
initialize() {
+ this.initContactsCache();
+ this.requestBackendEnable();
+
$("#nowUser.dropdown.enable").dropdown({
onChange: function onChange(value, text, $choice) {
window[className].onChangeSetting('adminUserId', value);
@@ -100,6 +105,35 @@ const ModuleMonitorActiveCalls = {
}
return available.concat(unavailable);
},
+ normalizePhone10(phone) {
+ const digits = String(phone || '').replace(/\D+/g, '');
+ if (digits.length <= 10) return digits;
+ return digits.slice(-10);
+ },
+ updateContactFromWs(contact) {
+ const phone10 = this.normalizePhone10(contact?.number);
+ if (!phone10) return;
+ const client = String(contact?.client || '').trim();
+ if (!client) return;
+ // Vue2: ensure reactivity for new keys
+ if (this.$set) {
+ this.$set(this.contactsByPhone10, phone10, client);
+ } else {
+ this.contactsByPhone10[phone10] = client;
+ }
+ },
+ getClientNameByPhone(phone) {
+ const phone10 = this.normalizePhone10(phone);
+ return this.contactsByPhone10[phone10] || '';
+ },
+ getClientHeader(phone) {
+ const client = this.getClientNameByPhone(phone);
+ if (!client) return phone;
+ return `${client} <${phone}>`;
+ },
+ hasClientByPhone(phone) {
+ return !!this.getClientNameByPhone(phone);
+ },
formatElapsedTime(enterTime) {
return window[className].formatElapsedTime(enterTime);
},
@@ -397,9 +431,10 @@ const ModuleMonitorActiveCalls = {
return this.hasPeerPhone(agentNumber) ? phone : '—';
},
getPeerNameLabel(agentNumber) {
- // Placeholder for future "peer name" feature
- void agentNumber;
- return '—';
+ // Use cached contacts (WS + IndexedDB) to show client name for peer phone.
+ const phone = this.getPeerPhoneLabel(agentNumber);
+ const client = this.getClientNameByPhone(phone);
+ return client || '—';
}
},
data: {
@@ -410,10 +445,12 @@ const ModuleMonitorActiveCalls = {
"agents": {
},
"agentsList": [],
+ "contactsByPhone10": {},
"calls": [
]
},
});
+ window[className].applyContactsCacheToQueueWidget();
window[className].$callsWidget = new Vue({
el: '#calls',
@@ -479,6 +516,13 @@ const ModuleMonitorActiveCalls = {
formatElapsedTime(enterTime) {
return window[className].formatElapsedTime(enterTime);
},
+ getClientHeader(phone) {
+ const q = window[className].$widgetQueues;
+ if (q && typeof q.getClientHeader === 'function') {
+ return q.getClientHeader(phone);
+ }
+ return phone;
+ },
hangupAction(event) {
let target = $(event.target);
if(target.attr('data-ch1') === undefined){
@@ -596,6 +640,230 @@ const ModuleMonitorActiveCalls = {
window[className].updateLines();
setInterval(window[className].updateLines, 2000);
},
+ async initContactsCache() {
+ try {
+ this._contactsCacheByPhone10 = await this.idbLoadAllContacts();
+ this.applyContactsCacheToQueueWidget();
+ } catch (e) {
+ console.log('contacts cache init error', e);
+ this._contactsCacheByPhone10 = {};
+ }
+ },
+ applyContactsCacheToQueueWidget() {
+ if (!this._contactsCacheByPhone10) return;
+ if (!window[className].$widgetQueues) return;
+ for (const [phone10, client] of Object.entries(this._contactsCacheByPhone10)) {
+ if (window[className].$widgetQueues.$set) {
+ window[className].$widgetQueues.$set(window[className].$widgetQueues.contactsByPhone10, phone10, client);
+ } else {
+ window[className].$widgetQueues.contactsByPhone10[phone10] = client;
+ }
+ }
+ },
+ idbOpenContactsDb() {
+ return new Promise((resolve, reject) => {
+ try {
+ const req = indexedDB.open('ModuleMonitorActiveCalls', 1);
+ req.onupgradeneeded = () => {
+ const db = req.result;
+ if (!db.objectStoreNames.contains('contactsByPhone10')) {
+ db.createObjectStore('contactsByPhone10', { keyPath: 'phone10' });
+ }
+ };
+ req.onsuccess = () => resolve(req.result);
+ req.onerror = () => reject(req.error);
+ } catch (e) {
+ reject(e);
+ }
+ });
+ },
+ async idbPutContact(phone10, client) {
+ const db = await this.idbOpenContactsDb();
+ return new Promise((resolve, reject) => {
+ const tx = db.transaction('contactsByPhone10', 'readwrite');
+ const store = tx.objectStore('contactsByPhone10');
+ store.put({ phone10, client, updatedAt: Date.now() });
+ tx.oncomplete = () => { db.close(); resolve(); };
+ tx.onerror = () => { const err = tx.error; db.close(); reject(err); };
+ });
+ },
+ async idbLoadAllContacts() {
+ const db = await this.idbOpenContactsDb();
+ return new Promise((resolve, reject) => {
+ const tx = db.transaction('contactsByPhone10', 'readwrite');
+ const store = tx.objectStore('contactsByPhone10');
+ const req = store.getAll();
+ req.onsuccess = () => {
+ const map = {};
+ const now = Date.now();
+ const ttlMs = Number(this.contactsCacheTtlMs) || (120 * 60 * 1000);
+ for (const row of req.result || []) {
+ const phone10 = row?.phone10;
+ const client = row?.client;
+ const updatedAt = Number(row?.updatedAt) || 0;
+ const isFresh = phone10 && client && updatedAt > 0 && (now - updatedAt) <= ttlMs;
+ if (isFresh) {
+ map[phone10] = client;
+ } else if (phone10) {
+ // Cleanup expired/broken records
+ try { store.delete(phone10); } catch (e) { /* ignore */ }
+ }
+ }
+ tx.oncomplete = () => { db.close(); resolve(map); };
+ tx.onerror = () => { const err = tx.error; db.close(); reject(err); };
+ };
+ req.onerror = () => { const err = req.error; db.close(); reject(err); };
+ });
+ },
+ requestBackendEnable() {
+ $.api({
+ url: window[className].backendEnableUrl,
+ on: 'now',
+ method: 'POST',
+ onSuccess(response) {
+ console.log('backandEnable response', response);
+ const accessToken = response?.data?.access_token;
+ const refreshToken = response?.data?.refresh_token;
+ if (accessToken && refreshToken) {
+ window[className].setAuthTokens(accessToken, refreshToken);
+ window[className].connectContactsWs();
+ }
+ },
+ onFailure(response) {
+ console.log('backandEnable failure', response);
+ },
+ onError(errorMessage, element, xhr) {
+ console.log('backandEnable error', errorMessage, xhr);
+ }
+ });
+ },
+ setAuthTokens(accessToken, refreshToken) {
+ this._authTokens = this._authTokens || {};
+ this._authTokens.access_token = accessToken;
+ this._authTokens.refresh_token = refreshToken;
+ this._authTokens.exp = this.getJwtExp(accessToken);
+ },
+ getJwtExp(token) {
+ try {
+ if (!token || typeof token !== 'string') return 0;
+ const parts = token.split('.');
+ if (parts.length < 2) return 0;
+ const payloadB64 = parts[1].replace(/-/g, '+').replace(/_/g, '/');
+ const padded = payloadB64 + '='.repeat((4 - (payloadB64.length % 4)) % 4);
+ const json = atob(padded);
+ const payload = JSON.parse(json);
+ return Number(payload?.exp) || 0;
+ } catch (e) {
+ return 0;
+ }
+ },
+ isAccessTokenExpired(skewSeconds = 0) {
+ const exp = Number(this._authTokens?.exp) || 0;
+ if (!exp) return false; // unknown exp -> don't force refresh
+ const now = Math.floor(Date.now() / 1000);
+ return now + skewSeconds >= exp;
+ },
+ scheduleContactsWsTokenRefresh() {
+ // Proactively refresh token shortly before expiry by re-requesting backendEnable.
+ if (this._contactsWsTokenTimer) {
+ clearTimeout(this._contactsWsTokenTimer);
+ this._contactsWsTokenTimer = null;
+ }
+ const exp = Number(this._authTokens?.exp) || 0;
+ if (!exp) return;
+ const now = Math.floor(Date.now() / 1000);
+ const refreshInSec = Math.max(1, exp - now - 15); // 15s before exp
+ this._contactsWsTokenTimer = setTimeout(() => {
+ // Re-get tokens and reconnect WS
+ this.requestBackendEnable();
+ }, refreshInSec * 1000);
+ },
+ scheduleContactsWsReconnect(reason, forceReAuth = false) {
+ if (this._contactsWsReconnectTimer) {
+ clearTimeout(this._contactsWsReconnectTimer);
+ this._contactsWsReconnectTimer = null;
+ }
+ this._contactsWsReconnectAttempt = (this._contactsWsReconnectAttempt || 0) + 1;
+ const delay = Math.min(30000, 1000 * Math.pow(2, Math.min(5, this._contactsWsReconnectAttempt - 1)));
+ this._contactsWsReconnectTimer = setTimeout(() => {
+ if (forceReAuth || this.isAccessTokenExpired(5)) {
+ this.requestBackendEnable();
+ } else {
+ this.connectContactsWs();
+ }
+ }, delay);
+ console.log('contacts ws reconnect scheduled', { reason, delayMs: delay });
+ },
+ connectContactsWs() {
+ try {
+ const accessToken = this._authTokens?.access_token;
+ if (!accessToken) return;
+
+ // Avoid reconnecting if already connected/connecting
+ if (this._contactsWs && (this._contactsWs.readyState === WebSocket.OPEN || this._contactsWs.readyState === WebSocket.CONNECTING)) {
+ return;
+ }
+ // Reset backoff on explicit connect attempt
+ this._contactsWsReconnectAttempt = 0;
+
+ const wsProto = window.location.protocol === 'https:' ? 'wss' : 'ws';
+ const wsHost = window.location.host; // host:port of current page
+ const tokenParam = encodeURIComponent(accessToken);
+ const wsUrl = `${wsProto}://${wsHost}/pbxcore/api/module-softphone-backend/v1/sub/contacts?authorization=${tokenParam}`;
+
+ this._contactsWs = new WebSocket(wsUrl);
+ this._contactsWs.onopen = () => {
+ console.log('contacts ws connected');
+ this.scheduleContactsWsTokenRefresh();
+ };
+ this._contactsWs.onmessage = (event) => {
+ this.handleContactsWsMessage(event?.data);
+ };
+ this._contactsWs.onerror = (event) => {
+ console.log('contacts ws error', event);
+ };
+ this._contactsWs.onclose = (event) => {
+ const code = event?.code;
+ const reason = event?.reason;
+ console.log('contacts ws closed', { code, reason });
+
+ if (this._contactsWsTokenTimer) {
+ clearTimeout(this._contactsWsTokenTimer);
+ this._contactsWsTokenTimer = null;
+ }
+
+ // 1000 = normal close -> reconnect; auth closes vary by server implementation.
+ const authCloseCodes = new Set([1008, 4001, 4401, 4403]);
+ const forceReAuth = authCloseCodes.has(code) || this.isAccessTokenExpired(0);
+ this.scheduleContactsWsReconnect('close', forceReAuth);
+ };
+ } catch (e) {
+ console.log('contacts ws init error', e);
+ this.scheduleContactsWsReconnect('init_error', this.isAccessTokenExpired(0));
+ }
+ },
+ handleContactsWsMessage(data) {
+ try {
+ if (!data) return;
+ const parsed = typeof data === 'string' ? JSON.parse(data) : data;
+ const items = Array.isArray(parsed) ? parsed : [parsed];
+ for (const item of items) {
+ const digits = String(item?.number || '').replace(/\D+/g, '');
+ const phone10 = digits.length <= 10 ? digits : digits.slice(-10);
+ const client = String(item?.client || '').trim();
+ if (phone10 && client) {
+ this._contactsCacheByPhone10 = this._contactsCacheByPhone10 || {};
+ this._contactsCacheByPhone10[phone10] = client;
+ this.idbPutContact(phone10, client).catch((e) => console.log('contacts cache save error', e));
+ }
+ if (window[className].$widgetQueues) {
+ window[className].$widgetQueues.updateContactFromWs(item);
+ }
+ }
+ } catch (e) {
+ console.log('contacts ws parse error', e);
+ }
+ },
formatElapsedTime(enterTime) {
if (!enterTime) return '—';
From 53a013afc20b6220ec2bab2beb0b385cee26f3bc Mon Sep 17 00:00:00 2001
From: boffart <5922739+boffart@users.noreply.github.com>
Date: Thu, 15 Jan 2026 19:37:59 +0300
Subject: [PATCH 12/23] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?=
=?UTF-8?q?=D1=82=D0=B0=D0=BB=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD?=
=?UTF-8?q?=D0=B8=D0=B5=20=D0=B0=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D1=8B=D1=85?=
=?UTF-8?q?=20=D0=B2=D1=8B=D0=B7=D0=BE=D0=B2=D0=BE=D0=B2=20=D1=87=D0=B5?=
=?UTF-8?q?=D1=80=D0=B5=D0=B7=20wss=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8F?=
=?UTF-8?q?=20ModuleSoftphoneBackend.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../ModuleMonitorActiveCallsController.php | 4 +-
Lib/MonitorActiveCallsMain.php | 12 +++
bin/WorkerActiveCalls.php | 33 ++++---
.../js/module-monitor-active-calls-index.js | 97 ++++++++++++++++++-
.../module-monitor-active-calls-index.js.map | 2 +-
.../src/module-monitor-active-calls-index.js | 89 ++++++++++++++++-
6 files changed, 218 insertions(+), 19 deletions(-)
diff --git a/App/Controllers/ModuleMonitorActiveCallsController.php b/App/Controllers/ModuleMonitorActiveCallsController.php
index 1980a29..cdc6a5f 100644
--- a/App/Controllers/ModuleMonitorActiveCallsController.php
+++ b/App/Controllers/ModuleMonitorActiveCallsController.php
@@ -17,6 +17,7 @@
use Modules\ModuleMonitorActiveCalls\App\Forms\ModuleMonitorActiveCallsForm;
use Modules\ModuleMonitorActiveCalls\bin\WorkerAmiActions;
use Modules\ModuleMonitorActiveCalls\Lib\CacheManager;
+use Modules\ModuleMonitorActiveCalls\Lib\MonitorActiveCallsMain;
use Modules\ModuleMonitorActiveCalls\Models\ModuleMonitorActiveCalls;
use Modules\ModuleMonitorActiveCalls\Models\UsersSettings;
use Modules\ModuleUsersUI\Lib\Constants;
@@ -149,8 +150,7 @@ public function saveAction() :void
public function backandEnableAction() :void
{
- $result = PbxExtensionModules::findFirstByUniqid("ModuleSoftphoneBackend");
- if ($result !== null && intval($result->disabled ) === 0) {
+ if (MonitorActiveCallsMain::backendExists()) {
// Модуль включен.
$api = new ModuleSoftphoneBackendApi();
$api->initialize();
diff --git a/Lib/MonitorActiveCallsMain.php b/Lib/MonitorActiveCallsMain.php
index db10e12..67ea198 100644
--- a/Lib/MonitorActiveCallsMain.php
+++ b/Lib/MonitorActiveCallsMain.php
@@ -3,6 +3,7 @@
namespace Modules\ModuleMonitorActiveCalls\Lib;
+use MikoPBX\Common\Models\PbxExtensionModules;
use MikoPBX\Core\System\Processes;
use MikoPBX\Core\System\Util;
use MikoPBX\Core\Workers\Cron\WorkerSafeScriptsCore;
@@ -76,4 +77,15 @@ public function startAllServices(bool $restart = false): void
}
}
}
+
+
+ /**
+ * Checks whether the ModuleSoftphoneBackend module exists and is enabled..
+ * @return bool
+ */
+ public static function backendExists(): bool
+ {
+ $result = PbxExtensionModules::findFirstByUniqid("ModuleSoftphoneBackend");
+ return $result !== null && intval($result->disabled ) === 0;
+ }
}
\ No newline at end of file
diff --git a/bin/WorkerActiveCalls.php b/bin/WorkerActiveCalls.php
index 3911b28..8d1480f 100644
--- a/bin/WorkerActiveCalls.php
+++ b/bin/WorkerActiveCalls.php
@@ -24,19 +24,21 @@
use MikoPBX\Common\Models\PbxSettings;
use MikoPBX\Core\System\SystemMessages;
use Modules\ModuleMonitorActiveCalls\Lib\AsteriskManager as CustomAsteriskManager;
-use MikoPBX\Core\Asterisk\AsteriskManager;
use MikoPBX\Core\Workers\WorkerBase;
use MikoPBX\Core\System\Util;
use Modules\ModuleMonitorActiveCalls\Lib\CacheManager;
use Modules\ModuleMonitorActiveCalls\Lib\Logger;
use Modules\ModuleMonitorActiveCalls\Lib\MonitorActiveCallsConf;
-use Modules\ModuleSoftphoneBackend\Lib\RestAPI\Controllers\ApiController;
+use Modules\ModuleMonitorActiveCalls\Lib\MonitorActiveCallsMain;
+use Modules\ModuleSoftphoneBackend\Lib\RestAPI\Controllers\ApiController AS BackendApiController;
require_once 'Globals.php';
class WorkerActiveCalls extends WorkerBase
{
public Logger $logger;
+
+ private bool $backendExists = false;
private bool $init = true;
private string $lastPrintHash = '';
private string $lastPrintUserHash = '';
@@ -157,6 +159,8 @@ public function start($argv):void
{
$this->logger = new Logger('ActiveCalls', 'ModuleMonitorActiveCalls');
$this->logger->writeInfo('Starting...');
+
+ $this->backendExists = MonitorActiveCallsMain::backendExists();
$this->initManagerAsterisk();
$this->getExtensionsInfo();
$this->updateStates();
@@ -361,29 +365,29 @@ private function printActiveCalls():void
$queuesData[$qId]['agents'] = $availableAgents + $unavailableAgents;
}
- $dataPrint = json_encode(['queues' => $queuesData, 'calls' => $calls], JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);
+ $callData = ['queues' => $queuesData, 'calls' => $calls];
+ $dataPrint = json_encode($callData, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);
$newPrintHash = md5($dataPrint);
if($newPrintHash <> $this->lastPrintHash){
$this->lastPrintHash = $newPrintHash;
- CacheManager::setCacheData('getActiveChannelsV2Action', ['queues' => $queuesData, 'calls' => $calls], 80000);
+ CacheManager::setCacheData('getActiveChannelsV2Action', $callData, 80000);
+ if($this->backendExists) {
+ BackendApiController::publishActiveCalls($callData);
+ }
}
+ unset($callData);
+
$data = ['states' => $this->states];
- $dataPrint = json_encode($data, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);
+ $dataPrint = json_encode($data, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);
$newPrintHash = md5($dataPrint);
if($newPrintHash <> $this->lastPrintUserHash){
$this->lastPrintUserHash = $newPrintHash;
CacheManager::setCacheData('getUsersStates', $data, 80000);
- if(class_exists('\Modules\ModuleSoftphoneBackend\Lib\RestAPI\Controllers\ApiController')){
- try {
- $this->logger->writeInfo('publishUserStates...');
- ApiController::publishUserStates($data);
- $this->logger->writeInfo('end publishUserStates...');
- }catch (\Exception $e){
- unset($e);
- }
+ if($this->backendExists){
+ BackendApiController::publishUserStates($data);
}
}
-
+
}
/**
@@ -861,6 +865,7 @@ public function stateEvents($parameters):void
$this->logger->writeInfo($parameters,'update settings...');
$this->getExtensionsInfo();
$this->collectQueuesInfo();
+ $this->backendExists = MonitorActiveCallsMain::backendExists();
return;
}
if($parameters['Event'] === 'ExtensionStatus'){
diff --git a/public/assets/js/module-monitor-active-calls-index.js b/public/assets/js/module-monitor-active-calls-index.js
index b1c7120..4446e18 100644
--- a/public/assets/js/module-monitor-active-calls-index.js
+++ b/public/assets/js/module-monitor-active-calls-index.js
@@ -695,8 +695,17 @@ var ModuleMonitorActiveCalls = {
$('.ui.clearing.hidden.divider').remove();
// Окончание форматирования базовой страницы
//////
+ this.startPollingActiveCalls();
+ },
+ startPollingActiveCalls: function startPollingActiveCalls() {
+ if (this._activeCallsPollTimer) return;
window[className].updateLines();
- setInterval(window[className].updateLines, 2000);
+ this._activeCallsPollTimer = setInterval(window[className].updateLines, 2000);
+ },
+ stopPollingActiveCalls: function stopPollingActiveCalls() {
+ if (!this._activeCallsPollTimer) return;
+ clearInterval(this._activeCallsPollTimer);
+ this._activeCallsPollTimer = null;
},
initContactsCache: function initContactsCache() {
var _this4 = this;
@@ -869,6 +878,7 @@ var ModuleMonitorActiveCalls = {
if (accessToken && refreshToken) {
window[className].setAuthTokens(accessToken, refreshToken);
window[className].connectContactsWs();
+ window[className].connectActiveCallsWs();
}
},
onFailure: function onFailure(response) {
@@ -995,6 +1005,77 @@ var ModuleMonitorActiveCalls = {
this.scheduleContactsWsReconnect('init_error', this.isAccessTokenExpired(0));
}
},
+ scheduleActiveCallsWsReconnect: function scheduleActiveCallsWsReconnect(reason) {
+ var _this0 = this;
+ var forceReAuth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ if (this._activeCallsWsReconnectTimer) {
+ clearTimeout(this._activeCallsWsReconnectTimer);
+ this._activeCallsWsReconnectTimer = null;
+ }
+ this._activeCallsWsReconnectAttempt = (this._activeCallsWsReconnectAttempt || 0) + 1;
+ var delay = Math.min(30000, 1000 * Math.pow(2, Math.min(5, this._activeCallsWsReconnectAttempt - 1)));
+ this._activeCallsWsReconnectTimer = setTimeout(function () {
+ if (forceReAuth || _this0.isAccessTokenExpired(5)) {
+ _this0.requestBackendEnable();
+ } else {
+ _this0.connectActiveCallsWs();
+ }
+ }, delay);
+ console.log('active-calls ws reconnect scheduled', {
+ reason: reason,
+ delayMs: delay
+ });
+ },
+ connectActiveCallsWs: function connectActiveCallsWs() {
+ var _this1 = this;
+ try {
+ var _this$_authTokens4;
+ var accessToken = (_this$_authTokens4 = this._authTokens) === null || _this$_authTokens4 === void 0 ? void 0 : _this$_authTokens4.access_token;
+ if (!accessToken) return;
+
+ // Avoid reconnecting if already connected/connecting
+ if (this._activeCallsWs && (this._activeCallsWs.readyState === WebSocket.OPEN || this._activeCallsWs.readyState === WebSocket.CONNECTING)) {
+ return;
+ }
+ // Reset backoff on explicit connect attempt
+ this._activeCallsWsReconnectAttempt = 0;
+
+ // Token exists -> use WS, disable polling fallback
+ this.stopPollingActiveCalls();
+ var wsProto = window.location.protocol === 'https:' ? 'wss' : 'ws';
+ var wsHost = window.location.host; // host:port of current page
+ var tokenParam = encodeURIComponent(accessToken);
+ var wsUrl = "".concat(wsProto, "://").concat(wsHost, "/pbxcore/api/module-softphone-backend/v1/sub/active-calls?authorization=").concat(tokenParam);
+ this._activeCallsWs = new WebSocket(wsUrl);
+ this._activeCallsWs.onopen = function () {
+ console.log('active-calls ws connected');
+ // Reuse the same token refresh timer (it triggers requestBackendEnable)
+ _this1.scheduleContactsWsTokenRefresh();
+ };
+ this._activeCallsWs.onmessage = function (event) {
+ _this1.handleActiveCallsWsMessage(event === null || event === void 0 ? void 0 : event.data);
+ };
+ this._activeCallsWs.onerror = function (event) {
+ console.log('active-calls ws error', event);
+ };
+ this._activeCallsWs.onclose = function (event) {
+ var code = event === null || event === void 0 ? void 0 : event.code;
+ var reason = event === null || event === void 0 ? void 0 : event.reason;
+ console.log('active-calls ws closed', {
+ code: code,
+ reason: reason
+ });
+
+ // Auth closes vary by server implementation.
+ var authCloseCodes = new Set([1008, 4001, 4401, 4403]);
+ var forceReAuth = authCloseCodes.has(code) || _this1.isAccessTokenExpired(0);
+ _this1.scheduleActiveCallsWsReconnect('close', forceReAuth);
+ };
+ } catch (e) {
+ console.log('active-calls ws init error', e);
+ this.scheduleActiveCallsWsReconnect('init_error', this.isAccessTokenExpired(0));
+ }
+ },
handleContactsWsMessage: function handleContactsWsMessage(data) {
try {
if (!data) return;
@@ -1028,6 +1109,20 @@ var ModuleMonitorActiveCalls = {
console.log('contacts ws parse error', e);
}
},
+ handleActiveCallsWsMessage: function handleActiveCallsWsMessage(data) {
+ try {
+ var _parsed$data;
+ if (!data) return;
+ var parsed = typeof data === 'string' ? JSON.parse(data) : data;
+ var payload = parsed !== null && parsed !== void 0 && parsed.queues ? parsed : parsed !== null && parsed !== void 0 && (_parsed$data = parsed.data) !== null && _parsed$data !== void 0 && _parsed$data.queues ? parsed.data : null;
+ if (!payload) return;
+ if (!window[className].$widgetQueues || !window[className].$callsWidget) return;
+ window[className].$widgetQueues.updatedCallsFromResponse(payload);
+ window[className].$callsWidget.updatedCallsFromResponse(payload);
+ } catch (e) {
+ console.log('active-calls ws parse error', e);
+ }
+ },
formatElapsedTime: function formatElapsedTime(enterTime) {
if (!enterTime) return '—';
var now = Math.floor(Date.now() / 1000);
diff --git a/public/assets/js/module-monitor-active-calls-index.js.map b/public/assets/js/module-monitor-active-calls-index.js.map
index c2258be..39ecb07 100644
--- a/public/assets/js/module-monitor-active-calls-index.js.map
+++ b/public/assets/js/module-monitor-active-calls-index.js.map
@@ -1 +1 @@
-{"version":3,"file":"module-monitor-active-calls-index.js","names":["e","t","r","Symbol","n","iterator","o","toStringTag","i","c","prototype","Generator","u","Object","create","_regeneratorDefine2","f","p","y","G","v","a","d","bind","length","l","TypeError","call","done","value","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","defineProperty","_regeneratorDefine","_invoke","enumerable","configurable","writable","asyncGeneratorStep","Promise","resolve","then","_asyncToGenerator","arguments","apply","_next","_throw","_createForOfIteratorHelper","Array","isArray","_unsupportedIterableToArray","_n","F","s","next","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","from","_arrayLikeToArray","ownKeys","keys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","push","_objectSpread","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","_toPropertyKey","_toPrimitive","_typeof","toPrimitive","String","Number","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_nonIterableRest","toString","slice","constructor","name","test","idUrl","idForm","className","inputClassName","ModuleMonitorActiveCalls","isInit","contactsCacheTtlMs","queueNameSelector","$formObj","$","$checkBoxes","$dropDowns","activeChannelsUrl","globalRootUrl","activeChannelsUrlV2","backendEnableUrl","executeCallUrl","saveUserActionUrl","$widget","undefined","validateRules","initialize","initContactsCache","requestBackendEnable","dropdown","onChange","text","$choice","window","onChangeSetting","val","userNumber","$widgetQueues","Vue","el","delimiters","methods","updatedCallsFromResponse","data","_this","queueNameEl","minWaitVisible","queues","queueId","id","number","agents","agentsList","buildAgentsList","calls","allCalls","$nextTick","normalizeAgentCards","agentsObj","entries","available","unavailable","_i","_entries","_entries$_i","agent","state","item","concat","normalizePhone10","phone","digits","replace","updateContactFromWs","contact","phone10","client","trim","$set","contactsByPhone10","getClientNameByPhone","getClientHeader","hasClientByPhone","formatElapsedTime","enterTime","_this2","$el","artifacts","querySelectorAll","remove","ensureAgentCardsGridMasonry","cardsContainer","querySelector","style","alignItems","alignContent","cards","card","alignSelf","headers","fontSize","lineHeight","display","gap","whiteSpace","metas","numLabels","paddingTop","paddingBottom","flex","minWidth","maxWidth","overflow","textOverflow","names","requestAnimationFrame","layoutAgentCardsGridMasonry","adjustAgentCardsGap","container","tallCard","find","shortCard","ht","getBoundingClientRect","height","hs","isFinite","Math","max","min","round","setProperty","adjustAgentCardsColumnCount","clientWidth","minCardWidth","cs","getComputedStyle","gapRaw","columnGap","getPropertyValue","gapPx","parseFloat","count","floor","_this3","styleId","styleEl","document","getElementById","createElement","head","appendChild","textContent","classList","add","_agentCardsResizeBound","addEventListener","grid","rowHeight","rowGap","items","gridRowEnd","minHeight","tall","short","h","span","ceil","map","g","shortH","tallH","effectiveGap","getSrcNumForAgent","agentNumber","result","answeredFound","_iterator","_step","dst_num","src_num","calledChannels","match","ch","bridgeChannels","err","tmpCall","spyer","spy_num","exten","hasPeerPhone","getPeerPhoneLabel","getPeerNameLabel","applyContactsCacheToQueueWidget","$callsWidget","fullAccess","callIsVisible","dst_chan","queueData","EnterTime","getWaitTime","formatTimestampToTime","timestamp","ts","ms","date","Date","hours","getHours","padStart","minutes","getMinutes","seconds","getSeconds","answer","now","secondToTime","start","getCallTime","queue","_data$calls","Extensions","updatePhonesRepresent","q","hangupAction","event","target","attr","parent","executeCallAction","action","ch1","ch2","joinAction","whisperAction","spChannel","listenAction","lines","checkbox","initializeForm","tab","removeClass","hide","updateLines","setInterval","_this4","_callee","_t","_context","idbLoadAllContacts","_contactsCacheByPhone10","console","log","_i2","_Object$entries","_Object$entries$_i","idbOpenContactsDb","reject","req","indexedDB","open","onupgradeneeded","db","objectStoreNames","contains","createObjectStore","keyPath","onsuccess","onerror","error","idbPutContact","_this5","_callee2","_context2","tx","transaction","store","objectStore","put","updatedAt","oncomplete","close","_this6","_callee3","_context3","getAll","ttlMs","_iterator2","_step2","row","isFresh","api","url","on","method","onSuccess","response","_response$data","_response$data2","accessToken","access_token","refreshToken","refresh_token","setAuthTokens","connectContactsWs","onFailure","onError","errorMessage","element","xhr","_authTokens","exp","getJwtExp","token","parts","split","payloadB64","padded","repeat","json","atob","payload","JSON","parse","isAccessTokenExpired","_this$_authTokens","skewSeconds","scheduleContactsWsTokenRefresh","_this$_authTokens2","_this7","_contactsWsTokenTimer","clearTimeout","refreshInSec","setTimeout","scheduleContactsWsReconnect","reason","_this8","forceReAuth","_contactsWsReconnectTimer","_contactsWsReconnectAttempt","delay","pow","delayMs","_this9","_this$_authTokens3","_contactsWs","readyState","WebSocket","OPEN","CONNECTING","wsProto","location","protocol","wsHost","host","tokenParam","encodeURIComponent","wsUrl","onopen","onmessage","handleContactsWsMessage","onclose","code","authCloseCodes","Set","has","parsed","_iterator3","_step3","diffSeconds","settingName","successTest","success","href","cbBeforeSendForm","settings","form","cbAfterSendForm","Form","ready"],"sources":["src/module-monitor-active-calls-index.js"],"sourcesContent":["/*\n * Copyright (C) MIKO LLC - All Rights Reserved\n * Unauthorized copying of this file, via any medium is strictly prohibited\n * Proprietary and confidential\n * Written by Nikolay Beketov, 11 2018\n *\n */\nconst idUrl = 'module-monitor-active-calls';\nconst idForm = 'module-monitor-active-calls-form';\nconst className = 'ModuleMonitorActiveCalls';\nconst inputClassName = 'mikopbx-module-input';\n\n/* global $, globalRootUrl, globalTranslate, Form, Config, Vue, Extensions */\nconst ModuleMonitorActiveCalls = {\n\tisInit: true,\n\tcontactsCacheTtlMs: 120 * 60 * 1000,\n\tqueueNameSelector: '#app-queue div.scrolling.dropdown',\n\t$formObj: $('#'+idForm),\n\t$checkBoxes: $('#'+idForm+' .ui.checkbox'),\n\t$dropDowns: $('#'+idForm+' .ui.dropdown'),\n\tactiveChannelsUrl: globalRootUrl + idUrl + \"/getActiveChannels\",\n\tactiveChannelsUrlV2: globalRootUrl + idUrl + \"/getActiveChannelsV2\",\n\tbackendEnableUrl: globalRootUrl + idUrl + \"/backandEnable\",\n\texecuteCallUrl: globalRootUrl + idUrl + \"/executeCall\",\n\tsaveUserActionUrl: globalRootUrl + idUrl + \"/saveUser\",\n\t$widget: undefined,\n\n\t/**\n\t * Field validation rules\n\t * https://semantic-ui.com/behaviors/form.html\n\t */\n\tvalidateRules: {},\n\t/**\n\t * On page load we init some Semantic UI library\n\t */\n\tinitialize() {\n\t\tthis.initContactsCache();\n\t\tthis.requestBackendEnable();\n\n\t\t$(\"#nowUser.dropdown.enable\").dropdown({\n\t\t\tonChange: function onChange(value, text, $choice) {\n\t\t\t\twindow[className].onChangeSetting('adminUserId', value);\n\t\t\t}\n\t\t});\n\t\t$(\"#minWaitVisible.dropdown.enable\").dropdown({\n\t\t\tonChange: function onChange(value, text, $choice) {\n\t\t\t\t$('#minWaitVisibleValue').val(value);\n\t\t\t\twindow[className].onChangeSetting('minWaitVisible', value);\n\t\t\t}\n\t\t});\n\t\tlet userNumber = $('#userNumber').val();\n\n\t\twindow[className].$widgetQueues = new Vue({\n\t\t\tel: '#app-queue',\n\t\t\tdelimiters: [\"<%\",\"%>\"],\n\t\t\tmethods: {\n\t\t\t\tupdatedCallsFromResponse(data) {\n\t\t\t\t\tlet queueNameEl = $(window[className].queueNameSelector);\n\t\t\t\t\tthis.minWaitVisible = 1*$('#minWaitVisibleValue').val();\n\n\t\t\t\t\tthis.queues = data.queues;\n\t\t\t\t\tlet queueId = $('#queueId').val();\n\t\t\t\t\tif (queueId in data.queues) {\n\t\t\t\t\t\tthis.id = data.queues[queueId].id;\n\t\t\t\t\t\tthis.name = data.queues[queueId].name;\n\t\t\t\t\t\tthis.number = data.queues[queueId].number;\n\t\t\t\t\t\tthis.agents = data.queues[queueId].agents;\n\t\t\t\t\t\tthis.agentsList = this.buildAgentsList(this.agents);\n\t\t\t\t\t\tthis.calls = Array.isArray(data.queues[queueId].calls) ? data.queues[queueId].calls : [];\n\t\t\t\t\t\tthis.allCalls = data.calls;\n\t\t\t\t\t}else{\n\t\t\t\t\t\tthis.calls = [];\n\t\t\t\t\t\tthis.agentsList = [];\n\t\t\t\t\t}\n\t\t\t\t\tif(queueNameEl.dropdown('is hidden')){\n\t\t\t\t\t\tqueueNameEl.dropdown({\n\t\t\t\t\t\t\tonChange: function onChange(value, text, $choice) {\n\t\t\t\t\t\t\t\twindow[className].onChangeSetting('queueId', value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif(queueNameEl.dropdown('get value') === ''){\n\t\t\t\t\t\t\twindow[className].isInit = true;\n\t\t\t\t\t\t\tqueueNameEl.dropdown('set value', $('#queueId').val())\n\t\t\t\t\t\t\twindow[className].isInit = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Normalize Semantic UI Card typography after render\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tthis.normalizeAgentCards();\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tbuildAgentsList(agentsObj) {\n\t\t\t\t\tconst entries = Object.entries(agentsObj || {});\n\t\t\t\t\tconst available = [];\n\t\t\t\t\tconst unavailable = [];\n\t\t\t\t\tfor (const [number, agent] of entries) {\n\t\t\t\t\t\tconst state = agent?.state || '';\n\t\t\t\t\t\tconst item = { number, ...agent };\n\t\t\t\t\t\tif (state === 'Unavailable') {\n\t\t\t\t\t\t\tunavailable.push(item);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tavailable.push(item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn available.concat(unavailable);\n\t\t\t\t},\n\t\t\t\tnormalizePhone10(phone) {\n\t\t\t\t\tconst digits = String(phone || '').replace(/\\D+/g, '');\n\t\t\t\t\tif (digits.length <= 10) return digits;\n\t\t\t\t\treturn digits.slice(-10);\n\t\t\t\t},\n\t\t\t\tupdateContactFromWs(contact) {\n\t\t\t\t\tconst phone10 = this.normalizePhone10(contact?.number);\n\t\t\t\t\tif (!phone10) return;\n\t\t\t\t\tconst client = String(contact?.client || '').trim();\n\t\t\t\t\tif (!client) return;\n\t\t\t\t\t// Vue2: ensure reactivity for new keys\n\t\t\t\t\tif (this.$set) {\n\t\t\t\t\t\tthis.$set(this.contactsByPhone10, phone10, client);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.contactsByPhone10[phone10] = client;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tgetClientNameByPhone(phone) {\n\t\t\t\t\tconst phone10 = this.normalizePhone10(phone);\n\t\t\t\t\treturn this.contactsByPhone10[phone10] || '';\n\t\t\t\t},\n\t\t\t\tgetClientHeader(phone) {\n\t\t\t\t\tconst client = this.getClientNameByPhone(phone);\n\t\t\t\t\tif (!client) return phone;\n\t\t\t\t\treturn `${client} <${phone}>`;\n\t\t\t\t},\n\t\t\t\thasClientByPhone(phone) {\n\t\t\t\t\treturn !!this.getClientNameByPhone(phone);\n\t\t\t\t},\n\t\t\t\tformatElapsedTime(enterTime) {\n\t\t\t\t\treturn window[className].formatElapsedTime(enterTime);\n\t\t\t\t},\n\t\t\t\tnormalizeAgentCards() {\n\t\t\t\t\tif (!this.$el) return;\n\n\t\t\t\t\t// Cleanup artifacts from previous experiments (placeholders/spacers).\n\t\t\t\t\tconst artifacts = this.$el.querySelectorAll('.agent-peer-placeholder, .agent-peer-spacer');\n\t\t\t\t\tartifacts.forEach((el) => el.remove());\n\n\t\t\t\t\t// Dense layout (masonry) that still fills left-to-right:\n\t\t\t\t\t// flex-wrap can't place items into vertical gaps under tall cards.\n\t\t\t\t\tthis.ensureAgentCardsGridMasonry();\n\n\t\t\t\t\t// Prevent \"equal height\" cards in one row (Semantic UI cards are flex).\n\t\t\t\t\tconst cardsContainer = this.$el.querySelector('.ui.cards.agent-cards');\n\t\t\t\t\tif (cardsContainer) {\n\t\t\t\t\t\tcardsContainer.style.alignItems = 'flex-start';\n\t\t\t\t\t\tcardsContainer.style.alignContent = 'flex-start';\n\t\t\t\t\t}\n\n\t\t\t\t\tconst cards = this.$el.querySelectorAll('.ui.cards.agent-cards > .ui.card.agent-card');\n\t\t\t\t\tcards.forEach((card) => {\n\t\t\t\t\t\tcard.style.alignSelf = 'flex-start';\n\t\t\t\t\t});\n\n\t\t\t\t\t// Semantic UI makes .header bigger than normal text; we need same font size.\n\t\t\t\t\tconst headers = this.$el.querySelectorAll('.ui.card.agent-card .header.agent-card-header');\n\t\t\t\t\theaders.forEach((el) => {\n\t\t\t\t\t\tel.style.fontSize = '1em';\n\t\t\t\t\t\tel.style.lineHeight = '1.2';\n\t\t\t\t\t\tel.style.display = 'flex';\n\t\t\t\t\t\tel.style.alignItems = 'center';\n\t\t\t\t\t\tel.style.gap = '0.5em';\n\t\t\t\t\t\tel.style.whiteSpace = 'nowrap';\n\t\t\t\t\t});\n\n\t\t\t\t\tconst metas = this.$el.querySelectorAll('.ui.card.agent-card .meta.agent-peer');\n\t\t\t\t\tmetas.forEach((el) => {\n\t\t\t\t\t\tel.style.fontSize = '1em';\n\t\t\t\t\t\tel.style.lineHeight = '1.2';\n\t\t\t\t\t});\n\n\t\t\t\t\t// Normalize label/name typography so they have same text height.\n\t\t\t\t\tconst numLabels = this.$el.querySelectorAll('.ui.card.agent-card .agent-num-label');\n\t\t\t\t\tnumLabels.forEach((el) => {\n\t\t\t\t\t\tel.style.fontSize = '1em';\n\t\t\t\t\t\tel.style.lineHeight = '1.2';\n\t\t\t\t\t\tel.style.display = 'inline-flex';\n\t\t\t\t\t\tel.style.alignItems = 'center';\n\t\t\t\t\t\tel.style.paddingTop = '0';\n\t\t\t\t\t\tel.style.paddingBottom = '0';\n\t\t\t\t\t\t// Allow label to shrink (otherwise long numbers force card wider than 180px)\n\t\t\t\t\t\tel.style.flex = '0 1 auto';\n\t\t\t\t\t\tel.style.minWidth = '0';\n\t\t\t\t\t\tel.style.maxWidth = '14ch';\n\t\t\t\t\t\tel.style.overflow = 'hidden';\n\t\t\t\t\t\tel.style.textOverflow = 'ellipsis';\n\t\t\t\t\t\tel.style.whiteSpace = 'nowrap';\n\t\t\t\t\t});\n\t\t\t\t\tconst names = this.$el.querySelectorAll('.ui.card.agent-card .agent-name');\n\t\t\t\t\tnames.forEach((el) => {\n\t\t\t\t\t\tel.style.lineHeight = '1.2';\n\t\t\t\t\t\t// Ellipsis for long names (e.g. \"Салтыков-Щедрин\")\n\t\t\t\t\t\tel.style.minWidth = '0';\n\t\t\t\t\t\tel.style.flex = '1 1 auto';\n\t\t\t\t\t\tel.style.overflow = 'hidden';\n\t\t\t\t\t\tel.style.textOverflow = 'ellipsis';\n\t\t\t\t\t\tel.style.whiteSpace = 'nowrap';\n\t\t\t\t\t});\n\n\t\t\t\t\t// Grid masonry needs row-span calculation after layout.\n\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\t\tthis.layoutAgentCardsGridMasonry();\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tadjustAgentCardsGap() {\n\t\t\t\t\tif (!this.$el) return;\n\t\t\t\t\tconst container = this.$el.querySelector('.ui.cards.agent-cards');\n\t\t\t\t\tif (!container) return;\n\n\t\t\t\t\tconst cards = Array.from(container.querySelectorAll('.ui.card.agent-card'));\n\t\t\t\t\tif (!cards.length) return;\n\n\t\t\t\t\tconst tallCard = cards.find((c) => c.querySelector('.meta.agent-peer'));\n\t\t\t\t\tconst shortCard = cards.find((c) => !c.querySelector('.meta.agent-peer'));\n\t\t\t\t\tif (!tallCard || !shortCard) return;\n\n\t\t\t\t\tconst ht = tallCard.getBoundingClientRect().height;\n\t\t\t\t\tconst hs = shortCard.getBoundingClientRect().height;\n\t\t\t\t\tif (!ht || !hs) return;\n\n\t\t\t\t\t// From 2*(hs+g) = ht+g => g = ht - 2*hs\n\t\t\t\t\tlet gap = ht - 2 * hs;\n\t\t\t\t\tif (!Number.isFinite(gap)) return;\n\n\t\t\t\t\t// Clamp to sane range; negative means \"no extra gap needed\".\n\t\t\t\t\tgap = Math.max(0, Math.min(20, Math.round(gap)));\n\n\t\t\t\t\tcontainer.style.setProperty('--agent-card-gap', `${gap}px`);\n\t\t\t\t},\n\t\t\t\tadjustAgentCardsColumnCount() {\n\t\t\t\t\tif (!this.$el) return;\n\t\t\t\t\tconst container = this.$el.querySelector('.ui.cards.agent-cards.agent-cards-masonry');\n\t\t\t\t\tif (!container) return;\n\n\t\t\t\t\tconst w = container.clientWidth;\n\t\t\t\t\tif (!w) return;\n\n\t\t\t\t\t// Minimum acceptable card width in px (tune if needed)\n\t\t\t\t\tconst minCardWidth = 150;\n\n\t\t\t\t\tconst cs = window.getComputedStyle(container);\n\t\t\t\t\tconst gapRaw = cs.columnGap || cs.getPropertyValue('column-gap') || '16px';\n\t\t\t\t\tconst gapPx = parseFloat(gapRaw) || 16;\n\n\t\t\t\t\tconst count = Math.max(1, Math.min(12, Math.floor((w + gapPx) / (minCardWidth + gapPx))));\n\t\t\t\t\tcontainer.style.setProperty('--agent-card-col-count', String(count));\n\t\t\t\t},\n\t\t\t\tensureAgentCardsGridMasonry() {\n\t\t\t\t\tconst styleId = 'agent-cards-layout-style';\n\t\t\t\t\tlet styleEl = document.getElementById(styleId);\n\t\t\t\t\tif (!styleEl) {\n\t\t\t\t\t\tstyleEl = document.createElement('style');\n\t\t\t\t\t\tstyleEl.id = styleId;\n\t\t\t\t\t\tdocument.head.appendChild(styleEl);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Grid masonry: fills left-to-right and can pack items into gaps.\n\t\t\t\t\tstyleEl.textContent = `\n.ui.cards.agent-cards.agent-cards-grid {\n display: grid !important;\n grid-template-columns: repeat(auto-fill, 240px);\n justify-content: start;\n gap: var(--agent-card-gap, 8px);\n grid-auto-rows: 1px;\n /* Prevent overlap with the legend block below */\n margin-bottom: 1em !important;\n}\n.ui.cards.agent-cards.agent-cards-grid > .ui.card.agent-card {\n width: 240px !important;\n margin: 0 !important;\n overflow: hidden;\n /* reset from previous layouts */\n align-self: start;\n}\n\t\t\t\t\t`.trim();\n\n\t\t\t\t\tconst cardsContainer = this.$el && this.$el.querySelector\n\t\t\t\t\t\t? this.$el.querySelector('.ui.cards.agent-cards')\n\t\t\t\t\t\t: null;\n\t\t\t\t\tif (cardsContainer) {\n\t\t\t\t\t\tcardsContainer.classList.remove('agent-cards-masonry');\n\t\t\t\t\t\tcardsContainer.classList.remove('agent-cards-flex');\n\t\t\t\t\t\tcardsContainer.classList.add('agent-cards-grid');\n\n\t\t\t\t\t\t// Bind once: relayout on resize.\n\t\t\t\t\t\tif (!this._agentCardsResizeBound) {\n\t\t\t\t\t\t\tthis._agentCardsResizeBound = true;\n\t\t\t\t\t\t\twindow.addEventListener('resize', () => {\n\t\t\t\t\t\t\t\tthis.layoutAgentCardsGridMasonry();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tlayoutAgentCardsGridMasonry() {\n\t\t\t\t\tif (!this.$el) return;\n\t\t\t\t\tconst grid = this.$el.querySelector('.ui.cards.agent-cards.agent-cards-grid');\n\t\t\t\t\tif (!grid) return;\n\n\t\t\t\t\tconst cs = window.getComputedStyle(grid);\n\t\t\t\t\tconst rowHeight = parseFloat(cs.getPropertyValue('grid-auto-rows')) || 1;\n\t\t\t\t\tconst rowGap = parseFloat(cs.getPropertyValue('row-gap')) || parseFloat(cs.getPropertyValue('gap')) || 8;\n\n\t\t\t\t\tconst items = Array.from(grid.querySelectorAll('.ui.card.agent-card'));\n\t\t\t\t\tif (!items.length) return;\n\n\t\t\t\t\t// Reset row spans and min-heights to measure natural heights.\n\t\t\t\t\titems.forEach((item) => {\n\t\t\t\t\t\titem.style.gridRowEnd = '';\n\t\t\t\t\t\titem.style.minHeight = '';\n\t\t\t\t\t});\n\n\t\t\t\t\tconst tall = items.filter((c) => c.querySelector('.meta.agent-peer'));\n\t\t\t\t\tconst short = items.filter((c) => !c.querySelector('.meta.agent-peer'));\n\n\t\t\t\t\t// If we don't have both types, just do normal masonry spans.\n\t\t\t\t\tif (!tall.length || !short.length) {\n\t\t\t\t\t\titems.forEach((item) => {\n\t\t\t\t\t\t\tconst h = item.getBoundingClientRect().height;\n\t\t\t\t\t\t\tconst span = Math.max(1, Math.ceil((h + rowGap) / (rowHeight + rowGap)));\n\t\t\t\t\t\t\titem.style.gridRowEnd = `span ${span}`;\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst hs = Math.max(...short.map((c) => c.getBoundingClientRect().height));\n\t\t\t\t\tconst ht = Math.max(...tall.map((c) => c.getBoundingClientRect().height));\n\n\t\t\t\t\t// Want: 2*(hs + g) = (ht + g) => g = ht - 2*hs\n\t\t\t\t\tlet g = ht - 2 * hs;\n\t\t\t\t\tif (!Number.isFinite(g)) g = rowGap;\n\t\t\t\t\tg = Math.max(0, Math.min(24, Math.round(g)));\n\n\t\t\t\t\t// Apply gap and enforce min-heights so the relation holds visually.\n\t\t\t\t\tgrid.style.setProperty('--agent-card-gap', `${g}px`);\n\n\t\t\t\t\tconst shortH = Math.round(hs);\n\t\t\t\t\tconst tallH = Math.round(Math.max(ht, 2 * hs + g));\n\t\t\t\t\tshort.forEach((c) => { c.style.minHeight = `${shortH}px`; });\n\t\t\t\t\ttall.forEach((c) => { c.style.minHeight = `${tallH}px`; });\n\n\t\t\t\t\t// Now compute row spans from final rendered heights.\n\t\t\t\t\tconst effectiveGap = g;\n\t\t\t\t\titems.forEach((item) => {\n\t\t\t\t\t\tconst h = item.getBoundingClientRect().height;\n\t\t\t\t\t\tconst span = Math.max(1, Math.ceil((h + effectiveGap) / (rowHeight + effectiveGap)));\n\t\t\t\t\t\titem.style.gridRowEnd = `span ${span}`;\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tgetSrcNumForAgent(agentNumber) {\n\t\t\t\t\tlet result = '-';\n\t\t\t\t\tlet answeredFound = false;\n\t\t\t\t\tfor (const call of this.calls) {\n\t\t\t\t\t\tif(call.dst_num === agentNumber){\n\t\t\t\t\t\t\tansweredFound = true;\n\t\t\t\t\t\t\tresult = call.src_num;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (call.calledChannels && Array.isArray(call.calledChannels)) {\n\t\t\t\t\t\t\tconst match = call.calledChannels.find(ch => ch.number === agentNumber);\n\t\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\t\tresult = call.src_num;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (call.bridgeChannels && Array.isArray(call.bridgeChannels)) {\n\t\t\t\t\t\t\tconst match = call.bridgeChannels.find(ch => (ch.src_num === agentNumber || ch.dst_num === agentNumber));\n\t\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\t\tif(match.src_num === agentNumber){\n\t\t\t\t\t\t\t\t\tresult = match.dst_num;\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\tresult = match.src_num;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tansweredFound = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(answeredFound === false){\n\t\t\t\t\t\tfor (let i = 0; i < this.allCalls.length; i++) {\n\t\t\t\t\t\t\tconst tmpCall = this.allCalls[i];\n\t\t\t\t\t\t\tif(tmpCall.src_num === agentNumber){\n\t\t\t\t\t\t\t\t// Исходящий\n\t\t\t\t\t\t\t\tif(tmpCall.dst_num === ''){\n\t\t\t\t\t\t\t\t\t// не ответа, дозвон.\n\t\t\t\t\t\t\t\t\tif (tmpCall.calledChannels && Array.isArray(tmpCall.calledChannels) && tmpCall.calledChannels.length) {\n\t\t\t\t\t\t\t\t\t\tconst match = tmpCall.calledChannels.find(ch => ch.number !== agentNumber);\n\t\t\t\t\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\t\t\t\t\tresult = match.number;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}else if(tmpCall.spyer){\n\t\t\t\t\t\t\t\t\t\t// шпионит за номером.\n\t\t\t\t\t\t\t\t\t\tresult = tmpCall.spy_num;\n\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t// нет вызываемых каналов, возможно это вызов на приложение / ivr.\n\t\t\t\t\t\t\t\t\t\tresult = tmpCall.exten;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\tresult = tmpCall.dst_num;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}else if(tmpCall.dst_num === agentNumber){\n\t\t\t\t\t\t\t\t// Входящий на агента, отвечен.\n\t\t\t\t\t\t\t\tresult = tmpCall.src_num;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\tif (tmpCall.calledChannels && Array.isArray(tmpCall.calledChannels)) {\n\t\t\t\t\t\t\t\t\tconst match = tmpCall.calledChannels.find(ch => ch.number === agentNumber);\n\t\t\t\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\t\t\t\tresult = tmpCall.src_num;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t},\n\t\t\t\thasPeerPhone(agentNumber) {\n\t\t\t\t\tconst phone = String(this.getSrcNumForAgent(agentNumber) || '').trim();\n\t\t\t\t\treturn phone !== '' && phone !== '-' && phone !== '—';\n\t\t\t\t},\n\t\t\t\tgetPeerPhoneLabel(agentNumber) {\n\t\t\t\t\tconst phone = String(this.getSrcNumForAgent(agentNumber) || '').trim();\n\t\t\t\t\treturn this.hasPeerPhone(agentNumber) ? phone : '—';\n\t\t\t\t},\n\t\t\t\tgetPeerNameLabel(agentNumber) {\n\t\t\t\t\t// Use cached contacts (WS + IndexedDB) to show client name for peer phone.\n\t\t\t\t\tconst phone = this.getPeerPhoneLabel(agentNumber);\n\t\t\t\t\tconst client = this.getClientNameByPhone(phone);\n\t\t\t\t\treturn client || '—';\n\t\t\t\t}\n\t\t\t},\n\t\t\tdata: {\n\t\t\t\t\"minWaitVisible\": 30,\n\t\t\t\t\"name\": \"\",\n\t\t\t\t\"number\": \"\",\n\t\t\t\t\"queues\": [],\n\t\t\t\t\"agents\": {\n\t\t\t\t},\n\t\t\t\t\"agentsList\": [],\n\t\t\t\t\"contactsByPhone10\": {},\n\t\t\t\t\"calls\": [\n\t\t\t\t]\n\t\t\t},\n\t\t});\n\t\twindow[className].applyContactsCacheToQueueWidget();\n\n\t\twindow[className].$callsWidget = new Vue({\n\t\t\tel: '#calls',\n\t\t\tdelimiters: [\"<%\",\"%>\"],\n\t\t\tdata: {\n\t\t\t\t\"minWaitVisible\": 30,\n\t\t\t\tuserNumber: userNumber,\n\t\t\t\tfullAccess: ($('#fullAccess').val() === \"1\" || userNumber === ''),\n\t\t\t\tcalls: [\n\t\t\t\t]\n\t\t\t},\n\t\t\tmethods: {\n\t\t\t\tcallIsVisible(call){\n\t\t\t\t\tif(call.dst_chan==='' && call.queueData.EnterTime !== undefined ){\n\t\t\t\t\t\treturn this.minWaitVisible <= this.getWaitTime(call);\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t\tformatTimestampToTime(timestamp) {\n\t\t\t\t\t// Если timestamp строка — приводим к числу\n\t\t\t\t\tconst ts = typeof timestamp === 'string' ? parseFloat(timestamp) : timestamp;\n\n\t\t\t\t\t// Если timestamp в секундах (меньше 1e10), умножаем на 1000\n\t\t\t\t\tconst ms = ts < 1e10 ? ts * 1000 : ts;\n\n\t\t\t\t\tconst date = new Date(ms);\n\n\t\t\t\t\tconst hours = String(date.getHours()).padStart(2, '0');\n\t\t\t\t\tconst minutes = String(date.getMinutes()).padStart(2, '0');\n\t\t\t\t\tconst seconds = String(date.getSeconds()).padStart(2, '0');\n\n\t\t\t\t\treturn `${hours}:${minutes}:${seconds}`;\n\t\t\t\t},\n\t\t\t\tgetWaitTime(call){\n\t\t\t\t\tlet answer = Math.floor(Date.now() / 1000);\n\t\t\t\t\tif(call.answer !== ''){\n\t\t\t\t\t\tanswer = call.answer\n\t\t\t\t\t}\n\t\t\t\t\treturn window[className].secondToTime(answer - call.start);\n\t\t\t\t},\n\t\t\t\tgetCallTime(call){\n\t\t\t\t\tif(call.answer === ''){\n\t\t\t\t\t\treturn '-';\n\t\t\t\t\t}\n\t\t\t\t\treturn window[className].formatElapsedTime(call.answer);\n\t\t\t\t},\n\t\t\t\tupdatedCallsFromResponse(data) {\n\t\t\t\t\tthis.minWaitVisible = 1*$('#minWaitVisibleValue').val();\n\t\t\t\t\t// Проходим по всем очередям\n\t\t\t\t\tfor (const queueId in data.queues) {\n\t\t\t\t\t\tconst queue = data.queues[queueId];\n\t\t\t\t\t\t// Проверяем, есть ли у очереди поле calls и является ли оно массивом\n\t\t\t\t\t\tif (Array.isArray(queue.calls)) {\n\t\t\t\t\t\t\t// Добавляем все вызовы из этой очереди в общий массив\n\t\t\t\t\t\t\tdata.calls.push(...queue.calls);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.calls = data.calls;\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tExtensions.updatePhonesRepresent('need-update');\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tformatElapsedTime(enterTime) {\n\t\t\t\t\treturn window[className].formatElapsedTime(enterTime);\n\t\t\t\t},\n\t\t\t\tgetClientHeader(phone) {\n\t\t\t\t\tconst q = window[className].$widgetQueues;\n\t\t\t\t\tif (q && typeof q.getClientHeader === 'function') {\n\t\t\t\t\t\treturn q.getClientHeader(phone);\n\t\t\t\t\t}\n\t\t\t\t\treturn phone;\n\t\t\t\t},\n\t\t\t\thangupAction(event) {\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'hangup', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2')});\n\t\t\t\t},\n\t\t\t\tjoinAction(event) {\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'join', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2'), number: this.userNumber});\n\t\t\t\t},\n\t\t\t\twhisperAction(event){\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlet spChannel = target.attr('data-ch1');\n\t\t\t\t\tif('incoming' === target.attr('data-call-type')){\n\t\t\t\t\t\tspChannel = target.attr('data-ch2');\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'whisper', ch1: spChannel, ch2: '', number: this.userNumber});\n\t\t\t\t},\n\t\t\t\tlistenAction(event){\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'listen', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2'), number: this.userNumber});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\twindow[className].$widget = new Vue({\n\t\t\tel: '#app',\n\t\t\tdelimiters: [\"<%\",\"%>\"],\n\t\t\tdata: {\n\t\t\t\tuserNumber: userNumber,\n\t\t\t\tfullAccess: ($('#fullAccess').val() === \"1\" || userNumber === ''),\n\t\t\t\tcalls: [\n\t\t\t\t]\n\t\t\t},\n\t\t\tmethods: {\n\t\t\t\tupdatedCallsFromResponse(lines) {\n\t\t\t\t\tthis.calls = lines;\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tExtensions.updatePhonesRepresent('need-update');\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\thangupAction(event) {\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'hangup', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2')});\n\t\t\t\t},\n\t\t\t\tjoinAction(event) {\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'join', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2'), number: this.userNumber});\n\t\t\t\t},\n\t\t\t\twhisperAction(event){\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlet spChannel = target.attr('data-ch1');\n\t\t\t\t\tif('incoming' === target.attr('data-call-type')){\n\t\t\t\t\t\tspChannel = target.attr('data-ch2');\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'whisper', ch1: spChannel, ch2: '', number: this.userNumber});\n\t\t\t\t},\n\t\t\t\tlistenAction(event){\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'listen', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2'), number: this.userNumber});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\twindow[className].$checkBoxes.checkbox();\n\t\twindow[className].$dropDowns.dropdown();\n\t\twindow[className].initializeForm();\n\t\t$('.menu .item').tab();\n\t\t//////\n\t\t// Удаляем отступы контейнера.\n\t\t$('#main-content-container').removeClass('container');\n\t\t$('#module-status-toggle-segment').hide();\n\t\t$('.ui.clearing.hidden.divider').remove();\n\t\t// Окончание форматирования базовой страницы\n\t\t//////\n\t\twindow[className].updateLines();\n\t\tsetInterval(window[className].updateLines, 2000);\n\t},\n\tasync initContactsCache() {\n\t\ttry {\n\t\t\tthis._contactsCacheByPhone10 = await this.idbLoadAllContacts();\n\t\t\tthis.applyContactsCacheToQueueWidget();\n\t\t} catch (e) {\n\t\t\tconsole.log('contacts cache init error', e);\n\t\t\tthis._contactsCacheByPhone10 = {};\n\t\t}\n\t},\n\tapplyContactsCacheToQueueWidget() {\n\t\tif (!this._contactsCacheByPhone10) return;\n\t\tif (!window[className].$widgetQueues) return;\n\t\tfor (const [phone10, client] of Object.entries(this._contactsCacheByPhone10)) {\n\t\t\tif (window[className].$widgetQueues.$set) {\n\t\t\t\twindow[className].$widgetQueues.$set(window[className].$widgetQueues.contactsByPhone10, phone10, client);\n\t\t\t} else {\n\t\t\t\twindow[className].$widgetQueues.contactsByPhone10[phone10] = client;\n\t\t\t}\n\t\t}\n\t},\n\tidbOpenContactsDb() {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\ttry {\n\t\t\t\tconst req = indexedDB.open('ModuleMonitorActiveCalls', 1);\n\t\t\t\treq.onupgradeneeded = () => {\n\t\t\t\t\tconst db = req.result;\n\t\t\t\t\tif (!db.objectStoreNames.contains('contactsByPhone10')) {\n\t\t\t\t\t\tdb.createObjectStore('contactsByPhone10', { keyPath: 'phone10' });\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\treq.onsuccess = () => resolve(req.result);\n\t\t\t\treq.onerror = () => reject(req.error);\n\t\t\t} catch (e) {\n\t\t\t\treject(e);\n\t\t\t}\n\t\t});\n\t},\n\tasync idbPutContact(phone10, client) {\n\t\tconst db = await this.idbOpenContactsDb();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst tx = db.transaction('contactsByPhone10', 'readwrite');\n\t\t\tconst store = tx.objectStore('contactsByPhone10');\n\t\t\tstore.put({ phone10, client, updatedAt: Date.now() });\n\t\t\ttx.oncomplete = () => { db.close(); resolve(); };\n\t\t\ttx.onerror = () => { const err = tx.error; db.close(); reject(err); };\n\t\t});\n\t},\n\tasync idbLoadAllContacts() {\n\t\tconst db = await this.idbOpenContactsDb();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst tx = db.transaction('contactsByPhone10', 'readwrite');\n\t\t\tconst store = tx.objectStore('contactsByPhone10');\n\t\t\tconst req = store.getAll();\n\t\t\treq.onsuccess = () => {\n\t\t\t\tconst map = {};\n\t\t\t\tconst now = Date.now();\n\t\t\t\tconst ttlMs = Number(this.contactsCacheTtlMs) || (120 * 60 * 1000);\n\t\t\t\tfor (const row of req.result || []) {\n\t\t\t\t\tconst phone10 = row?.phone10;\n\t\t\t\t\tconst client = row?.client;\n\t\t\t\t\tconst updatedAt = Number(row?.updatedAt) || 0;\n\t\t\t\t\tconst isFresh = phone10 && client && updatedAt > 0 && (now - updatedAt) <= ttlMs;\n\t\t\t\t\tif (isFresh) {\n\t\t\t\t\t\tmap[phone10] = client;\n\t\t\t\t\t} else if (phone10) {\n\t\t\t\t\t\t// Cleanup expired/broken records\n\t\t\t\t\t\ttry { store.delete(phone10); } catch (e) { /* ignore */ }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttx.oncomplete = () => { db.close(); resolve(map); };\n\t\t\t\ttx.onerror = () => { const err = tx.error; db.close(); reject(err); };\n\t\t\t};\n\t\t\treq.onerror = () => { const err = req.error; db.close(); reject(err); };\n\t\t});\n\t},\n\trequestBackendEnable() {\n\t\t$.api({\n\t\t\turl: window[className].backendEnableUrl,\n\t\t\ton: 'now',\n\t\t\tmethod: 'POST',\n\t\t\tonSuccess(response) {\n\t\t\t\tconsole.log('backandEnable response', response);\n\t\t\t\tconst accessToken = response?.data?.access_token;\n\t\t\t\tconst refreshToken = response?.data?.refresh_token;\n\t\t\t\tif (accessToken && refreshToken) {\n\t\t\t\t\twindow[className].setAuthTokens(accessToken, refreshToken);\n\t\t\t\t\twindow[className].connectContactsWs();\n\t\t\t\t}\n\t\t\t},\n\t\t\tonFailure(response) {\n\t\t\t\tconsole.log('backandEnable failure', response);\n\t\t\t},\n\t\t\tonError(errorMessage, element, xhr) {\n\t\t\t\tconsole.log('backandEnable error', errorMessage, xhr);\n\t\t\t}\n\t\t});\n\t},\n\tsetAuthTokens(accessToken, refreshToken) {\n\t\tthis._authTokens = this._authTokens || {};\n\t\tthis._authTokens.access_token = accessToken;\n\t\tthis._authTokens.refresh_token = refreshToken;\n\t\tthis._authTokens.exp = this.getJwtExp(accessToken);\n\t},\n\tgetJwtExp(token) {\n\t\ttry {\n\t\t\tif (!token || typeof token !== 'string') return 0;\n\t\t\tconst parts = token.split('.');\n\t\t\tif (parts.length < 2) return 0;\n\t\t\tconst payloadB64 = parts[1].replace(/-/g, '+').replace(/_/g, '/');\n\t\t\tconst padded = payloadB64 + '='.repeat((4 - (payloadB64.length % 4)) % 4);\n\t\t\tconst json = atob(padded);\n\t\t\tconst payload = JSON.parse(json);\n\t\t\treturn Number(payload?.exp) || 0;\n\t\t} catch (e) {\n\t\t\treturn 0;\n\t\t}\n\t},\n\tisAccessTokenExpired(skewSeconds = 0) {\n\t\tconst exp = Number(this._authTokens?.exp) || 0;\n\t\tif (!exp) return false; // unknown exp -> don't force refresh\n\t\tconst now = Math.floor(Date.now() / 1000);\n\t\treturn now + skewSeconds >= exp;\n\t},\n\tscheduleContactsWsTokenRefresh() {\n\t\t// Proactively refresh token shortly before expiry by re-requesting backendEnable.\n\t\tif (this._contactsWsTokenTimer) {\n\t\t\tclearTimeout(this._contactsWsTokenTimer);\n\t\t\tthis._contactsWsTokenTimer = null;\n\t\t}\n\t\tconst exp = Number(this._authTokens?.exp) || 0;\n\t\tif (!exp) return;\n\t\tconst now = Math.floor(Date.now() / 1000);\n\t\tconst refreshInSec = Math.max(1, exp - now - 15); // 15s before exp\n\t\tthis._contactsWsTokenTimer = setTimeout(() => {\n\t\t\t// Re-get tokens and reconnect WS\n\t\t\tthis.requestBackendEnable();\n\t\t}, refreshInSec * 1000);\n\t},\n\tscheduleContactsWsReconnect(reason, forceReAuth = false) {\n\t\tif (this._contactsWsReconnectTimer) {\n\t\t\tclearTimeout(this._contactsWsReconnectTimer);\n\t\t\tthis._contactsWsReconnectTimer = null;\n\t\t}\n\t\tthis._contactsWsReconnectAttempt = (this._contactsWsReconnectAttempt || 0) + 1;\n\t\tconst delay = Math.min(30000, 1000 * Math.pow(2, Math.min(5, this._contactsWsReconnectAttempt - 1)));\n\t\tthis._contactsWsReconnectTimer = setTimeout(() => {\n\t\t\tif (forceReAuth || this.isAccessTokenExpired(5)) {\n\t\t\t\tthis.requestBackendEnable();\n\t\t\t} else {\n\t\t\t\tthis.connectContactsWs();\n\t\t\t}\n\t\t}, delay);\n\t\tconsole.log('contacts ws reconnect scheduled', { reason, delayMs: delay });\n\t},\n\tconnectContactsWs() {\n\t\ttry {\n\t\t\tconst accessToken = this._authTokens?.access_token;\n\t\t\tif (!accessToken) return;\n\n\t\t\t// Avoid reconnecting if already connected/connecting\n\t\t\tif (this._contactsWs && (this._contactsWs.readyState === WebSocket.OPEN || this._contactsWs.readyState === WebSocket.CONNECTING)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Reset backoff on explicit connect attempt\n\t\t\tthis._contactsWsReconnectAttempt = 0;\n\n\t\t\tconst wsProto = window.location.protocol === 'https:' ? 'wss' : 'ws';\n\t\t\tconst wsHost = window.location.host; // host:port of current page\n\t\t\tconst tokenParam = encodeURIComponent(accessToken);\n\t\t\tconst wsUrl = `${wsProto}://${wsHost}/pbxcore/api/module-softphone-backend/v1/sub/contacts?authorization=${tokenParam}`;\n\n\t\t\tthis._contactsWs = new WebSocket(wsUrl);\n\t\t\tthis._contactsWs.onopen = () => {\n\t\t\t\tconsole.log('contacts ws connected');\n\t\t\t\tthis.scheduleContactsWsTokenRefresh();\n\t\t\t};\n\t\t\tthis._contactsWs.onmessage = (event) => {\n\t\t\t\tthis.handleContactsWsMessage(event?.data);\n\t\t\t};\n\t\t\tthis._contactsWs.onerror = (event) => {\n\t\t\t\tconsole.log('contacts ws error', event);\n\t\t\t};\n\t\t\tthis._contactsWs.onclose = (event) => {\n\t\t\t\tconst code = event?.code;\n\t\t\t\tconst reason = event?.reason;\n\t\t\t\tconsole.log('contacts ws closed', { code, reason });\n\n\t\t\t\tif (this._contactsWsTokenTimer) {\n\t\t\t\t\tclearTimeout(this._contactsWsTokenTimer);\n\t\t\t\t\tthis._contactsWsTokenTimer = null;\n\t\t\t\t}\n\n\t\t\t\t// 1000 = normal close -> reconnect; auth closes vary by server implementation.\n\t\t\t\tconst authCloseCodes = new Set([1008, 4001, 4401, 4403]);\n\t\t\t\tconst forceReAuth = authCloseCodes.has(code) || this.isAccessTokenExpired(0);\n\t\t\t\tthis.scheduleContactsWsReconnect('close', forceReAuth);\n\t\t\t};\n\t\t} catch (e) {\n\t\t\tconsole.log('contacts ws init error', e);\n\t\t\tthis.scheduleContactsWsReconnect('init_error', this.isAccessTokenExpired(0));\n\t\t}\n\t},\n\thandleContactsWsMessage(data) {\n\t\ttry {\n\t\t\tif (!data) return;\n\t\t\tconst parsed = typeof data === 'string' ? JSON.parse(data) : data;\n\t\t\tconst items = Array.isArray(parsed) ? parsed : [parsed];\n\t\t\tfor (const item of items) {\n\t\t\t\tconst digits = String(item?.number || '').replace(/\\D+/g, '');\n\t\t\t\tconst phone10 = digits.length <= 10 ? digits : digits.slice(-10);\n\t\t\t\tconst client = String(item?.client || '').trim();\n\t\t\t\tif (phone10 && client) {\n\t\t\t\t\tthis._contactsCacheByPhone10 = this._contactsCacheByPhone10 || {};\n\t\t\t\t\tthis._contactsCacheByPhone10[phone10] = client;\n\t\t\t\t\tthis.idbPutContact(phone10, client).catch((e) => console.log('contacts cache save error', e));\n\t\t\t\t}\n\t\t\t\tif (window[className].$widgetQueues) {\n\t\t\t\t\twindow[className].$widgetQueues.updateContactFromWs(item);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log('contacts ws parse error', e);\n\t\t}\n\t},\n\tformatElapsedTime(enterTime) {\n\t\tif (!enterTime) return '—';\n\n\t\tconst now = Math.floor(Date.now() / 1000);\n\t\tconst diffSeconds = now - enterTime;\n\n\t\treturn window[className].secondToTime(diffSeconds);\n\t},\n\tsecondToTime(diffSeconds){\n\t\tif (diffSeconds < 0) return '0';\n\t\t// Форматируем: чч:мм:сс или мм:сс, или просто секунды\n\t\tconst hours = Math.floor(diffSeconds / 3600);\n\t\tconst minutes = Math.floor((diffSeconds % 3600) / 60);\n\t\tconst seconds = Math.round(diffSeconds % 60);\n\t\tif (hours > 0) {\n\t\t\treturn `${hours}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n\t\t} else if (minutes > 0) {\n\t\t\treturn `${minutes}:${seconds.toString().padStart(2, '0')}`;\n\t\t} else {\n\t\t\treturn `${seconds}`;\n\t\t}\n\t},\n\tonChangeSetting(settingName, value) {\n\t\tif(window[className].isInit){\n\t\t\treturn;\n\t\t}\n\t\tlet data = {\n\t\t\t[settingName]: value\n\t\t};\n\t\t$.api({\n\t\t\turl: window[className].saveUserActionUrl,\n\t\t\ton: 'now',\n\t\t\tmethod: 'POST',\n\t\t\tdata: data,\n\t\t\tsuccessTest(response) {\n\t\t\t\treturn response !== undefined && Object.keys(response).length > 0 && response.success === true;\n\t\t\t},\n\t\t\tonSuccess(response) {\n\t\t\t\tif(settingName === 'queueId'){\n\t\t\t\t\t$('#queueId').val($(window[className].queueNameSelector).dropdown('get value'));\n\t\t\t\t}else if( settingName === 'adminUserId'){\n\t\t\t\t\twindow.location.href = window.location.href;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonFailure(response) {\n\t\t\t\tconsole.log(response);\n\t\t\t},\n\t\t\tonError(errorMessage, element, xhr) {\n\t\t\t\tconsole.log(errorMessage,xhr);\n\t\t\t}\n\t\t});\n\t},\n\texecuteCallAction(data) {\n\t\t$.api({\n\t\t\turl: window[className].executeCallUrl,\n\t\t\ton: 'now',\n\t\t\tmethod: 'POST',\n\t\t\tdata: data,\n\t\t\tsuccessTest(response) {\n\t\t\t\treturn response !== undefined && Object.keys(response).length > 0 && response.success === true;\n\t\t\t},\n\t\t\tonSuccess(response) {\n\t\t\t\tconsole.log(response);\n\t\t\t},\n\t\t\tonFailure(response) {\n\t\t\t\tconsole.log(response);\n\t\t\t},\n\t\t\tonError(errorMessage, element, xhr) {\n\t\t\t\tconsole.log(errorMessage,xhr);\n\t\t\t}\n\t\t});\n\t},\n\tupdateLines() {\n\t\t$.api({\n\t\t\turl: window[className].activeChannelsUrlV2,\n\t\t\ton: 'now',\n\t\t\tmethod: 'POST',\n\t\t\tsuccessTest(response) {\n\t\t\t\treturn response !== undefined && Object.keys(response).length > 0 && response.success === true;\n\t\t\t},\n\t\t\tonSuccess(response) {\n\t\t\t\twindow[className].$widgetQueues.updatedCallsFromResponse(response);\n\t\t\t\twindow[className].$callsWidget.updatedCallsFromResponse(response);\n\t\t\t},\n\t\t\tonFailure(response) {\n\t\t\t\tconsole.log(response);\n\t\t\t},\n\t\t\tonError(errorMessage, element, xhr) {\n\t\t\t\tconsole.log(errorMessage,xhr);\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * We can modify some data before form send\n\t * @param settings\n\t * @returns {*}\n\t */\n\tcbBeforeSendForm(settings) {\n\t\tconst result = settings;\n\t\tresult.data = window[className].$formObj.form('get values');\n\t\treturn result;\n\t},\n\t/**\n\t * Some actions after forms send\n\t */\n\tcbAfterSendForm() {\n\n\t},\n\t/**\n\t * Initialize form parameters\n\t */\n\tinitializeForm() {\n\t\tForm.$formObj = window[className].$formObj;\n\t\tForm.url = `${globalRootUrl}${idUrl}/save`;\n\t\tForm.validateRules = window[className].validateRules;\n\t\tForm.cbBeforeSendForm = window[className].cbBeforeSendForm;\n\t\tForm.cbAfterSendForm = window[className].cbAfterSendForm;\n\t\tForm.initialize();\n\t},\n};\n\n$(document).ready(() => {\n\twindow[className].initialize();\n});\n\n"],"mappings":"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","ignoreList":[]}
\ No newline at end of file
+{"version":3,"file":"module-monitor-active-calls-index.js","names":["e","t","r","Symbol","n","iterator","o","toStringTag","i","c","prototype","Generator","u","Object","create","_regeneratorDefine2","f","p","y","G","v","a","d","bind","length","l","TypeError","call","done","value","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","defineProperty","_regeneratorDefine","_invoke","enumerable","configurable","writable","asyncGeneratorStep","Promise","resolve","then","_asyncToGenerator","arguments","apply","_next","_throw","_createForOfIteratorHelper","Array","isArray","_unsupportedIterableToArray","_n","F","s","next","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","from","_arrayLikeToArray","ownKeys","keys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","push","_objectSpread","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","_toPropertyKey","_toPrimitive","_typeof","toPrimitive","String","Number","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_nonIterableRest","toString","slice","constructor","name","test","idUrl","idForm","className","inputClassName","ModuleMonitorActiveCalls","isInit","contactsCacheTtlMs","queueNameSelector","$formObj","$","$checkBoxes","$dropDowns","activeChannelsUrl","globalRootUrl","activeChannelsUrlV2","backendEnableUrl","executeCallUrl","saveUserActionUrl","$widget","undefined","validateRules","initialize","initContactsCache","requestBackendEnable","dropdown","onChange","text","$choice","window","onChangeSetting","val","userNumber","$widgetQueues","Vue","el","delimiters","methods","updatedCallsFromResponse","data","_this","queueNameEl","minWaitVisible","queues","queueId","id","number","agents","agentsList","buildAgentsList","calls","allCalls","$nextTick","normalizeAgentCards","agentsObj","entries","available","unavailable","_i","_entries","_entries$_i","agent","state","item","concat","normalizePhone10","phone","digits","replace","updateContactFromWs","contact","phone10","client","trim","$set","contactsByPhone10","getClientNameByPhone","getClientHeader","hasClientByPhone","formatElapsedTime","enterTime","_this2","$el","artifacts","querySelectorAll","remove","ensureAgentCardsGridMasonry","cardsContainer","querySelector","style","alignItems","alignContent","cards","card","alignSelf","headers","fontSize","lineHeight","display","gap","whiteSpace","metas","numLabels","paddingTop","paddingBottom","flex","minWidth","maxWidth","overflow","textOverflow","names","requestAnimationFrame","layoutAgentCardsGridMasonry","adjustAgentCardsGap","container","tallCard","find","shortCard","ht","getBoundingClientRect","height","hs","isFinite","Math","max","min","round","setProperty","adjustAgentCardsColumnCount","clientWidth","minCardWidth","cs","getComputedStyle","gapRaw","columnGap","getPropertyValue","gapPx","parseFloat","count","floor","_this3","styleId","styleEl","document","getElementById","createElement","head","appendChild","textContent","classList","add","_agentCardsResizeBound","addEventListener","grid","rowHeight","rowGap","items","gridRowEnd","minHeight","tall","short","h","span","ceil","map","g","shortH","tallH","effectiveGap","getSrcNumForAgent","agentNumber","result","answeredFound","_iterator","_step","dst_num","src_num","calledChannels","match","ch","bridgeChannels","err","tmpCall","spyer","spy_num","exten","hasPeerPhone","getPeerPhoneLabel","getPeerNameLabel","applyContactsCacheToQueueWidget","$callsWidget","fullAccess","callIsVisible","dst_chan","queueData","EnterTime","getWaitTime","formatTimestampToTime","timestamp","ts","ms","date","Date","hours","getHours","padStart","minutes","getMinutes","seconds","getSeconds","answer","now","secondToTime","start","getCallTime","queue","_data$calls","Extensions","updatePhonesRepresent","q","hangupAction","event","target","attr","parent","executeCallAction","action","ch1","ch2","joinAction","whisperAction","spChannel","listenAction","lines","checkbox","initializeForm","tab","removeClass","hide","startPollingActiveCalls","_activeCallsPollTimer","updateLines","setInterval","stopPollingActiveCalls","clearInterval","_this4","_callee","_t","_context","idbLoadAllContacts","_contactsCacheByPhone10","console","log","_i2","_Object$entries","_Object$entries$_i","idbOpenContactsDb","reject","req","indexedDB","open","onupgradeneeded","db","objectStoreNames","contains","createObjectStore","keyPath","onsuccess","onerror","error","idbPutContact","_this5","_callee2","_context2","tx","transaction","store","objectStore","put","updatedAt","oncomplete","close","_this6","_callee3","_context3","getAll","ttlMs","_iterator2","_step2","row","isFresh","api","url","on","method","onSuccess","response","_response$data","_response$data2","accessToken","access_token","refreshToken","refresh_token","setAuthTokens","connectContactsWs","connectActiveCallsWs","onFailure","onError","errorMessage","element","xhr","_authTokens","exp","getJwtExp","token","parts","split","payloadB64","padded","repeat","json","atob","payload","JSON","parse","isAccessTokenExpired","_this$_authTokens","skewSeconds","scheduleContactsWsTokenRefresh","_this$_authTokens2","_this7","_contactsWsTokenTimer","clearTimeout","refreshInSec","setTimeout","scheduleContactsWsReconnect","reason","_this8","forceReAuth","_contactsWsReconnectTimer","_contactsWsReconnectAttempt","delay","pow","delayMs","_this9","_this$_authTokens3","_contactsWs","readyState","WebSocket","OPEN","CONNECTING","wsProto","location","protocol","wsHost","host","tokenParam","encodeURIComponent","wsUrl","onopen","onmessage","handleContactsWsMessage","onclose","code","authCloseCodes","Set","has","scheduleActiveCallsWsReconnect","_this0","_activeCallsWsReconnectTimer","_activeCallsWsReconnectAttempt","_this1","_this$_authTokens4","_activeCallsWs","handleActiveCallsWsMessage","parsed","_iterator3","_step3","_parsed$data","diffSeconds","settingName","successTest","success","href","cbBeforeSendForm","settings","form","cbAfterSendForm","Form","ready"],"sources":["src/module-monitor-active-calls-index.js"],"sourcesContent":["/*\n * Copyright (C) MIKO LLC - All Rights Reserved\n * Unauthorized copying of this file, via any medium is strictly prohibited\n * Proprietary and confidential\n * Written by Nikolay Beketov, 11 2018\n *\n */\nconst idUrl = 'module-monitor-active-calls';\nconst idForm = 'module-monitor-active-calls-form';\nconst className = 'ModuleMonitorActiveCalls';\nconst inputClassName = 'mikopbx-module-input';\n\n/* global $, globalRootUrl, globalTranslate, Form, Config, Vue, Extensions */\nconst ModuleMonitorActiveCalls = {\n\tisInit: true,\n\tcontactsCacheTtlMs: 120 * 60 * 1000,\n\tqueueNameSelector: '#app-queue div.scrolling.dropdown',\n\t$formObj: $('#'+idForm),\n\t$checkBoxes: $('#'+idForm+' .ui.checkbox'),\n\t$dropDowns: $('#'+idForm+' .ui.dropdown'),\n\tactiveChannelsUrl: globalRootUrl + idUrl + \"/getActiveChannels\",\n\tactiveChannelsUrlV2: globalRootUrl + idUrl + \"/getActiveChannelsV2\",\n\tbackendEnableUrl: globalRootUrl + idUrl + \"/backandEnable\",\n\texecuteCallUrl: globalRootUrl + idUrl + \"/executeCall\",\n\tsaveUserActionUrl: globalRootUrl + idUrl + \"/saveUser\",\n\t$widget: undefined,\n\n\t/**\n\t * Field validation rules\n\t * https://semantic-ui.com/behaviors/form.html\n\t */\n\tvalidateRules: {},\n\t/**\n\t * On page load we init some Semantic UI library\n\t */\n\tinitialize() {\n\t\tthis.initContactsCache();\n\t\tthis.requestBackendEnable();\n\n\t\t$(\"#nowUser.dropdown.enable\").dropdown({\n\t\t\tonChange: function onChange(value, text, $choice) {\n\t\t\t\twindow[className].onChangeSetting('adminUserId', value);\n\t\t\t}\n\t\t});\n\t\t$(\"#minWaitVisible.dropdown.enable\").dropdown({\n\t\t\tonChange: function onChange(value, text, $choice) {\n\t\t\t\t$('#minWaitVisibleValue').val(value);\n\t\t\t\twindow[className].onChangeSetting('minWaitVisible', value);\n\t\t\t}\n\t\t});\n\t\tlet userNumber = $('#userNumber').val();\n\n\t\twindow[className].$widgetQueues = new Vue({\n\t\t\tel: '#app-queue',\n\t\t\tdelimiters: [\"<%\",\"%>\"],\n\t\t\tmethods: {\n\t\t\t\tupdatedCallsFromResponse(data) {\n\t\t\t\t\tlet queueNameEl = $(window[className].queueNameSelector);\n\t\t\t\t\tthis.minWaitVisible = 1*$('#minWaitVisibleValue').val();\n\n\t\t\t\t\tthis.queues = data.queues;\n\t\t\t\t\tlet queueId = $('#queueId').val();\n\t\t\t\t\tif (queueId in data.queues) {\n\t\t\t\t\t\tthis.id = data.queues[queueId].id;\n\t\t\t\t\t\tthis.name = data.queues[queueId].name;\n\t\t\t\t\t\tthis.number = data.queues[queueId].number;\n\t\t\t\t\t\tthis.agents = data.queues[queueId].agents;\n\t\t\t\t\t\tthis.agentsList = this.buildAgentsList(this.agents);\n\t\t\t\t\t\tthis.calls = Array.isArray(data.queues[queueId].calls) ? data.queues[queueId].calls : [];\n\t\t\t\t\t\tthis.allCalls = data.calls;\n\t\t\t\t\t}else{\n\t\t\t\t\t\tthis.calls = [];\n\t\t\t\t\t\tthis.agentsList = [];\n\t\t\t\t\t}\n\t\t\t\t\tif(queueNameEl.dropdown('is hidden')){\n\t\t\t\t\t\tqueueNameEl.dropdown({\n\t\t\t\t\t\t\tonChange: function onChange(value, text, $choice) {\n\t\t\t\t\t\t\t\twindow[className].onChangeSetting('queueId', value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif(queueNameEl.dropdown('get value') === ''){\n\t\t\t\t\t\t\twindow[className].isInit = true;\n\t\t\t\t\t\t\tqueueNameEl.dropdown('set value', $('#queueId').val())\n\t\t\t\t\t\t\twindow[className].isInit = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Normalize Semantic UI Card typography after render\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tthis.normalizeAgentCards();\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tbuildAgentsList(agentsObj) {\n\t\t\t\t\tconst entries = Object.entries(agentsObj || {});\n\t\t\t\t\tconst available = [];\n\t\t\t\t\tconst unavailable = [];\n\t\t\t\t\tfor (const [number, agent] of entries) {\n\t\t\t\t\t\tconst state = agent?.state || '';\n\t\t\t\t\t\tconst item = { number, ...agent };\n\t\t\t\t\t\tif (state === 'Unavailable') {\n\t\t\t\t\t\t\tunavailable.push(item);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tavailable.push(item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn available.concat(unavailable);\n\t\t\t\t},\n\t\t\t\tnormalizePhone10(phone) {\n\t\t\t\t\tconst digits = String(phone || '').replace(/\\D+/g, '');\n\t\t\t\t\tif (digits.length <= 10) return digits;\n\t\t\t\t\treturn digits.slice(-10);\n\t\t\t\t},\n\t\t\t\tupdateContactFromWs(contact) {\n\t\t\t\t\tconst phone10 = this.normalizePhone10(contact?.number);\n\t\t\t\t\tif (!phone10) return;\n\t\t\t\t\tconst client = String(contact?.client || '').trim();\n\t\t\t\t\tif (!client) return;\n\t\t\t\t\t// Vue2: ensure reactivity for new keys\n\t\t\t\t\tif (this.$set) {\n\t\t\t\t\t\tthis.$set(this.contactsByPhone10, phone10, client);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.contactsByPhone10[phone10] = client;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tgetClientNameByPhone(phone) {\n\t\t\t\t\tconst phone10 = this.normalizePhone10(phone);\n\t\t\t\t\treturn this.contactsByPhone10[phone10] || '';\n\t\t\t\t},\n\t\t\t\tgetClientHeader(phone) {\n\t\t\t\t\tconst client = this.getClientNameByPhone(phone);\n\t\t\t\t\tif (!client) return phone;\n\t\t\t\t\treturn `${client} <${phone}>`;\n\t\t\t\t},\n\t\t\t\thasClientByPhone(phone) {\n\t\t\t\t\treturn !!this.getClientNameByPhone(phone);\n\t\t\t\t},\n\t\t\t\tformatElapsedTime(enterTime) {\n\t\t\t\t\treturn window[className].formatElapsedTime(enterTime);\n\t\t\t\t},\n\t\t\t\tnormalizeAgentCards() {\n\t\t\t\t\tif (!this.$el) return;\n\n\t\t\t\t\t// Cleanup artifacts from previous experiments (placeholders/spacers).\n\t\t\t\t\tconst artifacts = this.$el.querySelectorAll('.agent-peer-placeholder, .agent-peer-spacer');\n\t\t\t\t\tartifacts.forEach((el) => el.remove());\n\n\t\t\t\t\t// Dense layout (masonry) that still fills left-to-right:\n\t\t\t\t\t// flex-wrap can't place items into vertical gaps under tall cards.\n\t\t\t\t\tthis.ensureAgentCardsGridMasonry();\n\n\t\t\t\t\t// Prevent \"equal height\" cards in one row (Semantic UI cards are flex).\n\t\t\t\t\tconst cardsContainer = this.$el.querySelector('.ui.cards.agent-cards');\n\t\t\t\t\tif (cardsContainer) {\n\t\t\t\t\t\tcardsContainer.style.alignItems = 'flex-start';\n\t\t\t\t\t\tcardsContainer.style.alignContent = 'flex-start';\n\t\t\t\t\t}\n\n\t\t\t\t\tconst cards = this.$el.querySelectorAll('.ui.cards.agent-cards > .ui.card.agent-card');\n\t\t\t\t\tcards.forEach((card) => {\n\t\t\t\t\t\tcard.style.alignSelf = 'flex-start';\n\t\t\t\t\t});\n\n\t\t\t\t\t// Semantic UI makes .header bigger than normal text; we need same font size.\n\t\t\t\t\tconst headers = this.$el.querySelectorAll('.ui.card.agent-card .header.agent-card-header');\n\t\t\t\t\theaders.forEach((el) => {\n\t\t\t\t\t\tel.style.fontSize = '1em';\n\t\t\t\t\t\tel.style.lineHeight = '1.2';\n\t\t\t\t\t\tel.style.display = 'flex';\n\t\t\t\t\t\tel.style.alignItems = 'center';\n\t\t\t\t\t\tel.style.gap = '0.5em';\n\t\t\t\t\t\tel.style.whiteSpace = 'nowrap';\n\t\t\t\t\t});\n\n\t\t\t\t\tconst metas = this.$el.querySelectorAll('.ui.card.agent-card .meta.agent-peer');\n\t\t\t\t\tmetas.forEach((el) => {\n\t\t\t\t\t\tel.style.fontSize = '1em';\n\t\t\t\t\t\tel.style.lineHeight = '1.2';\n\t\t\t\t\t});\n\n\t\t\t\t\t// Normalize label/name typography so they have same text height.\n\t\t\t\t\tconst numLabels = this.$el.querySelectorAll('.ui.card.agent-card .agent-num-label');\n\t\t\t\t\tnumLabels.forEach((el) => {\n\t\t\t\t\t\tel.style.fontSize = '1em';\n\t\t\t\t\t\tel.style.lineHeight = '1.2';\n\t\t\t\t\t\tel.style.display = 'inline-flex';\n\t\t\t\t\t\tel.style.alignItems = 'center';\n\t\t\t\t\t\tel.style.paddingTop = '0';\n\t\t\t\t\t\tel.style.paddingBottom = '0';\n\t\t\t\t\t\t// Allow label to shrink (otherwise long numbers force card wider than 180px)\n\t\t\t\t\t\tel.style.flex = '0 1 auto';\n\t\t\t\t\t\tel.style.minWidth = '0';\n\t\t\t\t\t\tel.style.maxWidth = '14ch';\n\t\t\t\t\t\tel.style.overflow = 'hidden';\n\t\t\t\t\t\tel.style.textOverflow = 'ellipsis';\n\t\t\t\t\t\tel.style.whiteSpace = 'nowrap';\n\t\t\t\t\t});\n\t\t\t\t\tconst names = this.$el.querySelectorAll('.ui.card.agent-card .agent-name');\n\t\t\t\t\tnames.forEach((el) => {\n\t\t\t\t\t\tel.style.lineHeight = '1.2';\n\t\t\t\t\t\t// Ellipsis for long names (e.g. \"Салтыков-Щедрин\")\n\t\t\t\t\t\tel.style.minWidth = '0';\n\t\t\t\t\t\tel.style.flex = '1 1 auto';\n\t\t\t\t\t\tel.style.overflow = 'hidden';\n\t\t\t\t\t\tel.style.textOverflow = 'ellipsis';\n\t\t\t\t\t\tel.style.whiteSpace = 'nowrap';\n\t\t\t\t\t});\n\n\t\t\t\t\t// Grid masonry needs row-span calculation after layout.\n\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\t\tthis.layoutAgentCardsGridMasonry();\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tadjustAgentCardsGap() {\n\t\t\t\t\tif (!this.$el) return;\n\t\t\t\t\tconst container = this.$el.querySelector('.ui.cards.agent-cards');\n\t\t\t\t\tif (!container) return;\n\n\t\t\t\t\tconst cards = Array.from(container.querySelectorAll('.ui.card.agent-card'));\n\t\t\t\t\tif (!cards.length) return;\n\n\t\t\t\t\tconst tallCard = cards.find((c) => c.querySelector('.meta.agent-peer'));\n\t\t\t\t\tconst shortCard = cards.find((c) => !c.querySelector('.meta.agent-peer'));\n\t\t\t\t\tif (!tallCard || !shortCard) return;\n\n\t\t\t\t\tconst ht = tallCard.getBoundingClientRect().height;\n\t\t\t\t\tconst hs = shortCard.getBoundingClientRect().height;\n\t\t\t\t\tif (!ht || !hs) return;\n\n\t\t\t\t\t// From 2*(hs+g) = ht+g => g = ht - 2*hs\n\t\t\t\t\tlet gap = ht - 2 * hs;\n\t\t\t\t\tif (!Number.isFinite(gap)) return;\n\n\t\t\t\t\t// Clamp to sane range; negative means \"no extra gap needed\".\n\t\t\t\t\tgap = Math.max(0, Math.min(20, Math.round(gap)));\n\n\t\t\t\t\tcontainer.style.setProperty('--agent-card-gap', `${gap}px`);\n\t\t\t\t},\n\t\t\t\tadjustAgentCardsColumnCount() {\n\t\t\t\t\tif (!this.$el) return;\n\t\t\t\t\tconst container = this.$el.querySelector('.ui.cards.agent-cards.agent-cards-masonry');\n\t\t\t\t\tif (!container) return;\n\n\t\t\t\t\tconst w = container.clientWidth;\n\t\t\t\t\tif (!w) return;\n\n\t\t\t\t\t// Minimum acceptable card width in px (tune if needed)\n\t\t\t\t\tconst minCardWidth = 150;\n\n\t\t\t\t\tconst cs = window.getComputedStyle(container);\n\t\t\t\t\tconst gapRaw = cs.columnGap || cs.getPropertyValue('column-gap') || '16px';\n\t\t\t\t\tconst gapPx = parseFloat(gapRaw) || 16;\n\n\t\t\t\t\tconst count = Math.max(1, Math.min(12, Math.floor((w + gapPx) / (minCardWidth + gapPx))));\n\t\t\t\t\tcontainer.style.setProperty('--agent-card-col-count', String(count));\n\t\t\t\t},\n\t\t\t\tensureAgentCardsGridMasonry() {\n\t\t\t\t\tconst styleId = 'agent-cards-layout-style';\n\t\t\t\t\tlet styleEl = document.getElementById(styleId);\n\t\t\t\t\tif (!styleEl) {\n\t\t\t\t\t\tstyleEl = document.createElement('style');\n\t\t\t\t\t\tstyleEl.id = styleId;\n\t\t\t\t\t\tdocument.head.appendChild(styleEl);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Grid masonry: fills left-to-right and can pack items into gaps.\n\t\t\t\t\tstyleEl.textContent = `\n.ui.cards.agent-cards.agent-cards-grid {\n display: grid !important;\n grid-template-columns: repeat(auto-fill, 240px);\n justify-content: start;\n gap: var(--agent-card-gap, 8px);\n grid-auto-rows: 1px;\n /* Prevent overlap with the legend block below */\n margin-bottom: 1em !important;\n}\n.ui.cards.agent-cards.agent-cards-grid > .ui.card.agent-card {\n width: 240px !important;\n margin: 0 !important;\n overflow: hidden;\n /* reset from previous layouts */\n align-self: start;\n}\n\t\t\t\t\t`.trim();\n\n\t\t\t\t\tconst cardsContainer = this.$el && this.$el.querySelector\n\t\t\t\t\t\t? this.$el.querySelector('.ui.cards.agent-cards')\n\t\t\t\t\t\t: null;\n\t\t\t\t\tif (cardsContainer) {\n\t\t\t\t\t\tcardsContainer.classList.remove('agent-cards-masonry');\n\t\t\t\t\t\tcardsContainer.classList.remove('agent-cards-flex');\n\t\t\t\t\t\tcardsContainer.classList.add('agent-cards-grid');\n\n\t\t\t\t\t\t// Bind once: relayout on resize.\n\t\t\t\t\t\tif (!this._agentCardsResizeBound) {\n\t\t\t\t\t\t\tthis._agentCardsResizeBound = true;\n\t\t\t\t\t\t\twindow.addEventListener('resize', () => {\n\t\t\t\t\t\t\t\tthis.layoutAgentCardsGridMasonry();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tlayoutAgentCardsGridMasonry() {\n\t\t\t\t\tif (!this.$el) return;\n\t\t\t\t\tconst grid = this.$el.querySelector('.ui.cards.agent-cards.agent-cards-grid');\n\t\t\t\t\tif (!grid) return;\n\n\t\t\t\t\tconst cs = window.getComputedStyle(grid);\n\t\t\t\t\tconst rowHeight = parseFloat(cs.getPropertyValue('grid-auto-rows')) || 1;\n\t\t\t\t\tconst rowGap = parseFloat(cs.getPropertyValue('row-gap')) || parseFloat(cs.getPropertyValue('gap')) || 8;\n\n\t\t\t\t\tconst items = Array.from(grid.querySelectorAll('.ui.card.agent-card'));\n\t\t\t\t\tif (!items.length) return;\n\n\t\t\t\t\t// Reset row spans and min-heights to measure natural heights.\n\t\t\t\t\titems.forEach((item) => {\n\t\t\t\t\t\titem.style.gridRowEnd = '';\n\t\t\t\t\t\titem.style.minHeight = '';\n\t\t\t\t\t});\n\n\t\t\t\t\tconst tall = items.filter((c) => c.querySelector('.meta.agent-peer'));\n\t\t\t\t\tconst short = items.filter((c) => !c.querySelector('.meta.agent-peer'));\n\n\t\t\t\t\t// If we don't have both types, just do normal masonry spans.\n\t\t\t\t\tif (!tall.length || !short.length) {\n\t\t\t\t\t\titems.forEach((item) => {\n\t\t\t\t\t\t\tconst h = item.getBoundingClientRect().height;\n\t\t\t\t\t\t\tconst span = Math.max(1, Math.ceil((h + rowGap) / (rowHeight + rowGap)));\n\t\t\t\t\t\t\titem.style.gridRowEnd = `span ${span}`;\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst hs = Math.max(...short.map((c) => c.getBoundingClientRect().height));\n\t\t\t\t\tconst ht = Math.max(...tall.map((c) => c.getBoundingClientRect().height));\n\n\t\t\t\t\t// Want: 2*(hs + g) = (ht + g) => g = ht - 2*hs\n\t\t\t\t\tlet g = ht - 2 * hs;\n\t\t\t\t\tif (!Number.isFinite(g)) g = rowGap;\n\t\t\t\t\tg = Math.max(0, Math.min(24, Math.round(g)));\n\n\t\t\t\t\t// Apply gap and enforce min-heights so the relation holds visually.\n\t\t\t\t\tgrid.style.setProperty('--agent-card-gap', `${g}px`);\n\n\t\t\t\t\tconst shortH = Math.round(hs);\n\t\t\t\t\tconst tallH = Math.round(Math.max(ht, 2 * hs + g));\n\t\t\t\t\tshort.forEach((c) => { c.style.minHeight = `${shortH}px`; });\n\t\t\t\t\ttall.forEach((c) => { c.style.minHeight = `${tallH}px`; });\n\n\t\t\t\t\t// Now compute row spans from final rendered heights.\n\t\t\t\t\tconst effectiveGap = g;\n\t\t\t\t\titems.forEach((item) => {\n\t\t\t\t\t\tconst h = item.getBoundingClientRect().height;\n\t\t\t\t\t\tconst span = Math.max(1, Math.ceil((h + effectiveGap) / (rowHeight + effectiveGap)));\n\t\t\t\t\t\titem.style.gridRowEnd = `span ${span}`;\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tgetSrcNumForAgent(agentNumber) {\n\t\t\t\t\tlet result = '-';\n\t\t\t\t\tlet answeredFound = false;\n\t\t\t\t\tfor (const call of this.calls) {\n\t\t\t\t\t\tif(call.dst_num === agentNumber){\n\t\t\t\t\t\t\tansweredFound = true;\n\t\t\t\t\t\t\tresult = call.src_num;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (call.calledChannels && Array.isArray(call.calledChannels)) {\n\t\t\t\t\t\t\tconst match = call.calledChannels.find(ch => ch.number === agentNumber);\n\t\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\t\tresult = call.src_num;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (call.bridgeChannels && Array.isArray(call.bridgeChannels)) {\n\t\t\t\t\t\t\tconst match = call.bridgeChannels.find(ch => (ch.src_num === agentNumber || ch.dst_num === agentNumber));\n\t\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\t\tif(match.src_num === agentNumber){\n\t\t\t\t\t\t\t\t\tresult = match.dst_num;\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\tresult = match.src_num;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tansweredFound = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(answeredFound === false){\n\t\t\t\t\t\tfor (let i = 0; i < this.allCalls.length; i++) {\n\t\t\t\t\t\t\tconst tmpCall = this.allCalls[i];\n\t\t\t\t\t\t\tif(tmpCall.src_num === agentNumber){\n\t\t\t\t\t\t\t\t// Исходящий\n\t\t\t\t\t\t\t\tif(tmpCall.dst_num === ''){\n\t\t\t\t\t\t\t\t\t// не ответа, дозвон.\n\t\t\t\t\t\t\t\t\tif (tmpCall.calledChannels && Array.isArray(tmpCall.calledChannels) && tmpCall.calledChannels.length) {\n\t\t\t\t\t\t\t\t\t\tconst match = tmpCall.calledChannels.find(ch => ch.number !== agentNumber);\n\t\t\t\t\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\t\t\t\t\tresult = match.number;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}else if(tmpCall.spyer){\n\t\t\t\t\t\t\t\t\t\t// шпионит за номером.\n\t\t\t\t\t\t\t\t\t\tresult = tmpCall.spy_num;\n\t\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\t\t// нет вызываемых каналов, возможно это вызов на приложение / ivr.\n\t\t\t\t\t\t\t\t\t\tresult = tmpCall.exten;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\t\tresult = tmpCall.dst_num;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}else if(tmpCall.dst_num === agentNumber){\n\t\t\t\t\t\t\t\t// Входящий на агента, отвечен.\n\t\t\t\t\t\t\t\tresult = tmpCall.src_num;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}else{\n\t\t\t\t\t\t\t\tif (tmpCall.calledChannels && Array.isArray(tmpCall.calledChannels)) {\n\t\t\t\t\t\t\t\t\tconst match = tmpCall.calledChannels.find(ch => ch.number === agentNumber);\n\t\t\t\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\t\t\t\tresult = tmpCall.src_num;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t},\n\t\t\t\thasPeerPhone(agentNumber) {\n\t\t\t\t\tconst phone = String(this.getSrcNumForAgent(agentNumber) || '').trim();\n\t\t\t\t\treturn phone !== '' && phone !== '-' && phone !== '—';\n\t\t\t\t},\n\t\t\t\tgetPeerPhoneLabel(agentNumber) {\n\t\t\t\t\tconst phone = String(this.getSrcNumForAgent(agentNumber) || '').trim();\n\t\t\t\t\treturn this.hasPeerPhone(agentNumber) ? phone : '—';\n\t\t\t\t},\n\t\t\t\tgetPeerNameLabel(agentNumber) {\n\t\t\t\t\t// Use cached contacts (WS + IndexedDB) to show client name for peer phone.\n\t\t\t\t\tconst phone = this.getPeerPhoneLabel(agentNumber);\n\t\t\t\t\tconst client = this.getClientNameByPhone(phone);\n\t\t\t\t\treturn client || '—';\n\t\t\t\t}\n\t\t\t},\n\t\t\tdata: {\n\t\t\t\t\"minWaitVisible\": 30,\n\t\t\t\t\"name\": \"\",\n\t\t\t\t\"number\": \"\",\n\t\t\t\t\"queues\": [],\n\t\t\t\t\"agents\": {\n\t\t\t\t},\n\t\t\t\t\"agentsList\": [],\n\t\t\t\t\"contactsByPhone10\": {},\n\t\t\t\t\"calls\": [\n\t\t\t\t]\n\t\t\t},\n\t\t});\n\t\twindow[className].applyContactsCacheToQueueWidget();\n\n\t\twindow[className].$callsWidget = new Vue({\n\t\t\tel: '#calls',\n\t\t\tdelimiters: [\"<%\",\"%>\"],\n\t\t\tdata: {\n\t\t\t\t\"minWaitVisible\": 30,\n\t\t\t\tuserNumber: userNumber,\n\t\t\t\tfullAccess: ($('#fullAccess').val() === \"1\" || userNumber === ''),\n\t\t\t\tcalls: [\n\t\t\t\t]\n\t\t\t},\n\t\t\tmethods: {\n\t\t\t\tcallIsVisible(call){\n\t\t\t\t\tif(call.dst_chan==='' && call.queueData.EnterTime !== undefined ){\n\t\t\t\t\t\treturn this.minWaitVisible <= this.getWaitTime(call);\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t\tformatTimestampToTime(timestamp) {\n\t\t\t\t\t// Если timestamp строка — приводим к числу\n\t\t\t\t\tconst ts = typeof timestamp === 'string' ? parseFloat(timestamp) : timestamp;\n\n\t\t\t\t\t// Если timestamp в секундах (меньше 1e10), умножаем на 1000\n\t\t\t\t\tconst ms = ts < 1e10 ? ts * 1000 : ts;\n\n\t\t\t\t\tconst date = new Date(ms);\n\n\t\t\t\t\tconst hours = String(date.getHours()).padStart(2, '0');\n\t\t\t\t\tconst minutes = String(date.getMinutes()).padStart(2, '0');\n\t\t\t\t\tconst seconds = String(date.getSeconds()).padStart(2, '0');\n\n\t\t\t\t\treturn `${hours}:${minutes}:${seconds}`;\n\t\t\t\t},\n\t\t\t\tgetWaitTime(call){\n\t\t\t\t\tlet answer = Math.floor(Date.now() / 1000);\n\t\t\t\t\tif(call.answer !== ''){\n\t\t\t\t\t\tanswer = call.answer\n\t\t\t\t\t}\n\t\t\t\t\treturn window[className].secondToTime(answer - call.start);\n\t\t\t\t},\n\t\t\t\tgetCallTime(call){\n\t\t\t\t\tif(call.answer === ''){\n\t\t\t\t\t\treturn '-';\n\t\t\t\t\t}\n\t\t\t\t\treturn window[className].formatElapsedTime(call.answer);\n\t\t\t\t},\n\t\t\t\tupdatedCallsFromResponse(data) {\n\t\t\t\t\tthis.minWaitVisible = 1*$('#minWaitVisibleValue').val();\n\t\t\t\t\t// Проходим по всем очередям\n\t\t\t\t\tfor (const queueId in data.queues) {\n\t\t\t\t\t\tconst queue = data.queues[queueId];\n\t\t\t\t\t\t// Проверяем, есть ли у очереди поле calls и является ли оно массивом\n\t\t\t\t\t\tif (Array.isArray(queue.calls)) {\n\t\t\t\t\t\t\t// Добавляем все вызовы из этой очереди в общий массив\n\t\t\t\t\t\t\tdata.calls.push(...queue.calls);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.calls = data.calls;\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tExtensions.updatePhonesRepresent('need-update');\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tformatElapsedTime(enterTime) {\n\t\t\t\t\treturn window[className].formatElapsedTime(enterTime);\n\t\t\t\t},\n\t\t\t\tgetClientHeader(phone) {\n\t\t\t\t\tconst q = window[className].$widgetQueues;\n\t\t\t\t\tif (q && typeof q.getClientHeader === 'function') {\n\t\t\t\t\t\treturn q.getClientHeader(phone);\n\t\t\t\t\t}\n\t\t\t\t\treturn phone;\n\t\t\t\t},\n\t\t\t\thangupAction(event) {\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'hangup', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2')});\n\t\t\t\t},\n\t\t\t\tjoinAction(event) {\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'join', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2'), number: this.userNumber});\n\t\t\t\t},\n\t\t\t\twhisperAction(event){\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlet spChannel = target.attr('data-ch1');\n\t\t\t\t\tif('incoming' === target.attr('data-call-type')){\n\t\t\t\t\t\tspChannel = target.attr('data-ch2');\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'whisper', ch1: spChannel, ch2: '', number: this.userNumber});\n\t\t\t\t},\n\t\t\t\tlistenAction(event){\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'listen', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2'), number: this.userNumber});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\twindow[className].$widget = new Vue({\n\t\t\tel: '#app',\n\t\t\tdelimiters: [\"<%\",\"%>\"],\n\t\t\tdata: {\n\t\t\t\tuserNumber: userNumber,\n\t\t\t\tfullAccess: ($('#fullAccess').val() === \"1\" || userNumber === ''),\n\t\t\t\tcalls: [\n\t\t\t\t]\n\t\t\t},\n\t\t\tmethods: {\n\t\t\t\tupdatedCallsFromResponse(lines) {\n\t\t\t\t\tthis.calls = lines;\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tExtensions.updatePhonesRepresent('need-update');\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\thangupAction(event) {\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'hangup', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2')});\n\t\t\t\t},\n\t\t\t\tjoinAction(event) {\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'join', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2'), number: this.userNumber});\n\t\t\t\t},\n\t\t\t\twhisperAction(event){\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlet spChannel = target.attr('data-ch1');\n\t\t\t\t\tif('incoming' === target.attr('data-call-type')){\n\t\t\t\t\t\tspChannel = target.attr('data-ch2');\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'whisper', ch1: spChannel, ch2: '', number: this.userNumber});\n\t\t\t\t},\n\t\t\t\tlistenAction(event){\n\t\t\t\t\tlet target = $(event.target);\n\t\t\t\t\tif(target.attr('data-ch1') === undefined){\n\t\t\t\t\t\ttarget = $(event.target).parent();\n\t\t\t\t\t}\n\t\t\t\t\tif(this.userNumber === ''){\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\twindow[className].executeCallAction({action: 'listen', ch1: target.attr('data-ch1'), ch2: target.attr('data-ch2'), number: this.userNumber});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\twindow[className].$checkBoxes.checkbox();\n\t\twindow[className].$dropDowns.dropdown();\n\t\twindow[className].initializeForm();\n\t\t$('.menu .item').tab();\n\t\t//////\n\t\t// Удаляем отступы контейнера.\n\t\t$('#main-content-container').removeClass('container');\n\t\t$('#module-status-toggle-segment').hide();\n\t\t$('.ui.clearing.hidden.divider').remove();\n\t\t// Окончание форматирования базовой страницы\n\t\t//////\n\t\tthis.startPollingActiveCalls();\n\t},\n\tstartPollingActiveCalls() {\n\t\tif (this._activeCallsPollTimer) return;\n\t\twindow[className].updateLines();\n\t\tthis._activeCallsPollTimer = setInterval(window[className].updateLines, 2000);\n\t},\n\tstopPollingActiveCalls() {\n\t\tif (!this._activeCallsPollTimer) return;\n\t\tclearInterval(this._activeCallsPollTimer);\n\t\tthis._activeCallsPollTimer = null;\n\t},\n\tasync initContactsCache() {\n\t\ttry {\n\t\t\tthis._contactsCacheByPhone10 = await this.idbLoadAllContacts();\n\t\t\tthis.applyContactsCacheToQueueWidget();\n\t\t} catch (e) {\n\t\t\tconsole.log('contacts cache init error', e);\n\t\t\tthis._contactsCacheByPhone10 = {};\n\t\t}\n\t},\n\tapplyContactsCacheToQueueWidget() {\n\t\tif (!this._contactsCacheByPhone10) return;\n\t\tif (!window[className].$widgetQueues) return;\n\t\tfor (const [phone10, client] of Object.entries(this._contactsCacheByPhone10)) {\n\t\t\tif (window[className].$widgetQueues.$set) {\n\t\t\t\twindow[className].$widgetQueues.$set(window[className].$widgetQueues.contactsByPhone10, phone10, client);\n\t\t\t} else {\n\t\t\t\twindow[className].$widgetQueues.contactsByPhone10[phone10] = client;\n\t\t\t}\n\t\t}\n\t},\n\tidbOpenContactsDb() {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\ttry {\n\t\t\t\tconst req = indexedDB.open('ModuleMonitorActiveCalls', 1);\n\t\t\t\treq.onupgradeneeded = () => {\n\t\t\t\t\tconst db = req.result;\n\t\t\t\t\tif (!db.objectStoreNames.contains('contactsByPhone10')) {\n\t\t\t\t\t\tdb.createObjectStore('contactsByPhone10', { keyPath: 'phone10' });\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\treq.onsuccess = () => resolve(req.result);\n\t\t\t\treq.onerror = () => reject(req.error);\n\t\t\t} catch (e) {\n\t\t\t\treject(e);\n\t\t\t}\n\t\t});\n\t},\n\tasync idbPutContact(phone10, client) {\n\t\tconst db = await this.idbOpenContactsDb();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst tx = db.transaction('contactsByPhone10', 'readwrite');\n\t\t\tconst store = tx.objectStore('contactsByPhone10');\n\t\t\tstore.put({ phone10, client, updatedAt: Date.now() });\n\t\t\ttx.oncomplete = () => { db.close(); resolve(); };\n\t\t\ttx.onerror = () => { const err = tx.error; db.close(); reject(err); };\n\t\t});\n\t},\n\tasync idbLoadAllContacts() {\n\t\tconst db = await this.idbOpenContactsDb();\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst tx = db.transaction('contactsByPhone10', 'readwrite');\n\t\t\tconst store = tx.objectStore('contactsByPhone10');\n\t\t\tconst req = store.getAll();\n\t\t\treq.onsuccess = () => {\n\t\t\t\tconst map = {};\n\t\t\t\tconst now = Date.now();\n\t\t\t\tconst ttlMs = Number(this.contactsCacheTtlMs) || (120 * 60 * 1000);\n\t\t\t\tfor (const row of req.result || []) {\n\t\t\t\t\tconst phone10 = row?.phone10;\n\t\t\t\t\tconst client = row?.client;\n\t\t\t\t\tconst updatedAt = Number(row?.updatedAt) || 0;\n\t\t\t\t\tconst isFresh = phone10 && client && updatedAt > 0 && (now - updatedAt) <= ttlMs;\n\t\t\t\t\tif (isFresh) {\n\t\t\t\t\t\tmap[phone10] = client;\n\t\t\t\t\t} else if (phone10) {\n\t\t\t\t\t\t// Cleanup expired/broken records\n\t\t\t\t\t\ttry { store.delete(phone10); } catch (e) { /* ignore */ }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttx.oncomplete = () => { db.close(); resolve(map); };\n\t\t\t\ttx.onerror = () => { const err = tx.error; db.close(); reject(err); };\n\t\t\t};\n\t\t\treq.onerror = () => { const err = req.error; db.close(); reject(err); };\n\t\t});\n\t},\n\trequestBackendEnable() {\n\t\t$.api({\n\t\t\turl: window[className].backendEnableUrl,\n\t\t\ton: 'now',\n\t\t\tmethod: 'POST',\n\t\t\tonSuccess(response) {\n\t\t\t\tconsole.log('backandEnable response', response);\n\t\t\t\tconst accessToken = response?.data?.access_token;\n\t\t\t\tconst refreshToken = response?.data?.refresh_token;\n\t\t\t\tif (accessToken && refreshToken) {\n\t\t\t\t\twindow[className].setAuthTokens(accessToken, refreshToken);\n\t\t\t\t\twindow[className].connectContactsWs();\n\t\t\t\t\twindow[className].connectActiveCallsWs();\n\t\t\t\t}\n\t\t\t},\n\t\t\tonFailure(response) {\n\t\t\t\tconsole.log('backandEnable failure', response);\n\t\t\t},\n\t\t\tonError(errorMessage, element, xhr) {\n\t\t\t\tconsole.log('backandEnable error', errorMessage, xhr);\n\t\t\t}\n\t\t});\n\t},\n\tsetAuthTokens(accessToken, refreshToken) {\n\t\tthis._authTokens = this._authTokens || {};\n\t\tthis._authTokens.access_token = accessToken;\n\t\tthis._authTokens.refresh_token = refreshToken;\n\t\tthis._authTokens.exp = this.getJwtExp(accessToken);\n\t},\n\tgetJwtExp(token) {\n\t\ttry {\n\t\t\tif (!token || typeof token !== 'string') return 0;\n\t\t\tconst parts = token.split('.');\n\t\t\tif (parts.length < 2) return 0;\n\t\t\tconst payloadB64 = parts[1].replace(/-/g, '+').replace(/_/g, '/');\n\t\t\tconst padded = payloadB64 + '='.repeat((4 - (payloadB64.length % 4)) % 4);\n\t\t\tconst json = atob(padded);\n\t\t\tconst payload = JSON.parse(json);\n\t\t\treturn Number(payload?.exp) || 0;\n\t\t} catch (e) {\n\t\t\treturn 0;\n\t\t}\n\t},\n\tisAccessTokenExpired(skewSeconds = 0) {\n\t\tconst exp = Number(this._authTokens?.exp) || 0;\n\t\tif (!exp) return false; // unknown exp -> don't force refresh\n\t\tconst now = Math.floor(Date.now() / 1000);\n\t\treturn now + skewSeconds >= exp;\n\t},\n\tscheduleContactsWsTokenRefresh() {\n\t\t// Proactively refresh token shortly before expiry by re-requesting backendEnable.\n\t\tif (this._contactsWsTokenTimer) {\n\t\t\tclearTimeout(this._contactsWsTokenTimer);\n\t\t\tthis._contactsWsTokenTimer = null;\n\t\t}\n\t\tconst exp = Number(this._authTokens?.exp) || 0;\n\t\tif (!exp) return;\n\t\tconst now = Math.floor(Date.now() / 1000);\n\t\tconst refreshInSec = Math.max(1, exp - now - 15); // 15s before exp\n\t\tthis._contactsWsTokenTimer = setTimeout(() => {\n\t\t\t// Re-get tokens and reconnect WS\n\t\t\tthis.requestBackendEnable();\n\t\t}, refreshInSec * 1000);\n\t},\n\tscheduleContactsWsReconnect(reason, forceReAuth = false) {\n\t\tif (this._contactsWsReconnectTimer) {\n\t\t\tclearTimeout(this._contactsWsReconnectTimer);\n\t\t\tthis._contactsWsReconnectTimer = null;\n\t\t}\n\t\tthis._contactsWsReconnectAttempt = (this._contactsWsReconnectAttempt || 0) + 1;\n\t\tconst delay = Math.min(30000, 1000 * Math.pow(2, Math.min(5, this._contactsWsReconnectAttempt - 1)));\n\t\tthis._contactsWsReconnectTimer = setTimeout(() => {\n\t\t\tif (forceReAuth || this.isAccessTokenExpired(5)) {\n\t\t\t\tthis.requestBackendEnable();\n\t\t\t} else {\n\t\t\t\tthis.connectContactsWs();\n\t\t\t}\n\t\t}, delay);\n\t\tconsole.log('contacts ws reconnect scheduled', { reason, delayMs: delay });\n\t},\n\tconnectContactsWs() {\n\t\ttry {\n\t\t\tconst accessToken = this._authTokens?.access_token;\n\t\t\tif (!accessToken) return;\n\n\t\t\t// Avoid reconnecting if already connected/connecting\n\t\t\tif (this._contactsWs && (this._contactsWs.readyState === WebSocket.OPEN || this._contactsWs.readyState === WebSocket.CONNECTING)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Reset backoff on explicit connect attempt\n\t\t\tthis._contactsWsReconnectAttempt = 0;\n\n\t\t\tconst wsProto = window.location.protocol === 'https:' ? 'wss' : 'ws';\n\t\t\tconst wsHost = window.location.host; // host:port of current page\n\t\t\tconst tokenParam = encodeURIComponent(accessToken);\n\t\t\tconst wsUrl = `${wsProto}://${wsHost}/pbxcore/api/module-softphone-backend/v1/sub/contacts?authorization=${tokenParam}`;\n\n\t\t\tthis._contactsWs = new WebSocket(wsUrl);\n\t\t\tthis._contactsWs.onopen = () => {\n\t\t\t\tconsole.log('contacts ws connected');\n\t\t\t\tthis.scheduleContactsWsTokenRefresh();\n\t\t\t};\n\t\t\tthis._contactsWs.onmessage = (event) => {\n\t\t\t\tthis.handleContactsWsMessage(event?.data);\n\t\t\t};\n\t\t\tthis._contactsWs.onerror = (event) => {\n\t\t\t\tconsole.log('contacts ws error', event);\n\t\t\t};\n\t\t\tthis._contactsWs.onclose = (event) => {\n\t\t\t\tconst code = event?.code;\n\t\t\t\tconst reason = event?.reason;\n\t\t\t\tconsole.log('contacts ws closed', { code, reason });\n\n\t\t\t\tif (this._contactsWsTokenTimer) {\n\t\t\t\t\tclearTimeout(this._contactsWsTokenTimer);\n\t\t\t\t\tthis._contactsWsTokenTimer = null;\n\t\t\t\t}\n\n\t\t\t\t// 1000 = normal close -> reconnect; auth closes vary by server implementation.\n\t\t\t\tconst authCloseCodes = new Set([1008, 4001, 4401, 4403]);\n\t\t\t\tconst forceReAuth = authCloseCodes.has(code) || this.isAccessTokenExpired(0);\n\t\t\t\tthis.scheduleContactsWsReconnect('close', forceReAuth);\n\t\t\t};\n\t\t} catch (e) {\n\t\t\tconsole.log('contacts ws init error', e);\n\t\t\tthis.scheduleContactsWsReconnect('init_error', this.isAccessTokenExpired(0));\n\t\t}\n\t},\n\tscheduleActiveCallsWsReconnect(reason, forceReAuth = false) {\n\t\tif (this._activeCallsWsReconnectTimer) {\n\t\t\tclearTimeout(this._activeCallsWsReconnectTimer);\n\t\t\tthis._activeCallsWsReconnectTimer = null;\n\t\t}\n\t\tthis._activeCallsWsReconnectAttempt = (this._activeCallsWsReconnectAttempt || 0) + 1;\n\t\tconst delay = Math.min(30000, 1000 * Math.pow(2, Math.min(5, this._activeCallsWsReconnectAttempt - 1)));\n\t\tthis._activeCallsWsReconnectTimer = setTimeout(() => {\n\t\t\tif (forceReAuth || this.isAccessTokenExpired(5)) {\n\t\t\t\tthis.requestBackendEnable();\n\t\t\t} else {\n\t\t\t\tthis.connectActiveCallsWs();\n\t\t\t}\n\t\t}, delay);\n\t\tconsole.log('active-calls ws reconnect scheduled', { reason, delayMs: delay });\n\t},\n\tconnectActiveCallsWs() {\n\t\ttry {\n\t\t\tconst accessToken = this._authTokens?.access_token;\n\t\t\tif (!accessToken) return;\n\n\t\t\t// Avoid reconnecting if already connected/connecting\n\t\t\tif (this._activeCallsWs && (this._activeCallsWs.readyState === WebSocket.OPEN || this._activeCallsWs.readyState === WebSocket.CONNECTING)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Reset backoff on explicit connect attempt\n\t\t\tthis._activeCallsWsReconnectAttempt = 0;\n\n\t\t\t// Token exists -> use WS, disable polling fallback\n\t\t\tthis.stopPollingActiveCalls();\n\n\t\t\tconst wsProto = window.location.protocol === 'https:' ? 'wss' : 'ws';\n\t\t\tconst wsHost = window.location.host; // host:port of current page\n\t\t\tconst tokenParam = encodeURIComponent(accessToken);\n\t\t\tconst wsUrl = `${wsProto}://${wsHost}/pbxcore/api/module-softphone-backend/v1/sub/active-calls?authorization=${tokenParam}`;\n\n\t\t\tthis._activeCallsWs = new WebSocket(wsUrl);\n\t\t\tthis._activeCallsWs.onopen = () => {\n\t\t\t\tconsole.log('active-calls ws connected');\n\t\t\t\t// Reuse the same token refresh timer (it triggers requestBackendEnable)\n\t\t\t\tthis.scheduleContactsWsTokenRefresh();\n\t\t\t};\n\t\t\tthis._activeCallsWs.onmessage = (event) => {\n\t\t\t\tthis.handleActiveCallsWsMessage(event?.data);\n\t\t\t};\n\t\t\tthis._activeCallsWs.onerror = (event) => {\n\t\t\t\tconsole.log('active-calls ws error', event);\n\t\t\t};\n\t\t\tthis._activeCallsWs.onclose = (event) => {\n\t\t\t\tconst code = event?.code;\n\t\t\t\tconst reason = event?.reason;\n\t\t\t\tconsole.log('active-calls ws closed', { code, reason });\n\n\t\t\t\t// Auth closes vary by server implementation.\n\t\t\t\tconst authCloseCodes = new Set([1008, 4001, 4401, 4403]);\n\t\t\t\tconst forceReAuth = authCloseCodes.has(code) || this.isAccessTokenExpired(0);\n\t\t\t\tthis.scheduleActiveCallsWsReconnect('close', forceReAuth);\n\t\t\t};\n\t\t} catch (e) {\n\t\t\tconsole.log('active-calls ws init error', e);\n\t\t\tthis.scheduleActiveCallsWsReconnect('init_error', this.isAccessTokenExpired(0));\n\t\t}\n\t},\n\thandleContactsWsMessage(data) {\n\t\ttry {\n\t\t\tif (!data) return;\n\t\t\tconst parsed = typeof data === 'string' ? JSON.parse(data) : data;\n\t\t\tconst items = Array.isArray(parsed) ? parsed : [parsed];\n\t\t\tfor (const item of items) {\n\t\t\t\tconst digits = String(item?.number || '').replace(/\\D+/g, '');\n\t\t\t\tconst phone10 = digits.length <= 10 ? digits : digits.slice(-10);\n\t\t\t\tconst client = String(item?.client || '').trim();\n\t\t\t\tif (phone10 && client) {\n\t\t\t\t\tthis._contactsCacheByPhone10 = this._contactsCacheByPhone10 || {};\n\t\t\t\t\tthis._contactsCacheByPhone10[phone10] = client;\n\t\t\t\t\tthis.idbPutContact(phone10, client).catch((e) => console.log('contacts cache save error', e));\n\t\t\t\t}\n\t\t\t\tif (window[className].$widgetQueues) {\n\t\t\t\t\twindow[className].$widgetQueues.updateContactFromWs(item);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log('contacts ws parse error', e);\n\t\t}\n\t},\n\thandleActiveCallsWsMessage(data) {\n\t\ttry {\n\t\t\tif (!data) return;\n\t\t\tconst parsed = typeof data === 'string' ? JSON.parse(data) : data;\n\t\t\tconst payload = parsed?.queues ? parsed : (parsed?.data?.queues ? parsed.data : null);\n\t\t\tif (!payload) return;\n\t\t\tif (!window[className].$widgetQueues || !window[className].$callsWidget) return;\n\n\t\t\twindow[className].$widgetQueues.updatedCallsFromResponse(payload);\n\t\t\twindow[className].$callsWidget.updatedCallsFromResponse(payload);\n\t\t} catch (e) {\n\t\t\tconsole.log('active-calls ws parse error', e);\n\t\t}\n\t},\n\tformatElapsedTime(enterTime) {\n\t\tif (!enterTime) return '—';\n\n\t\tconst now = Math.floor(Date.now() / 1000);\n\t\tconst diffSeconds = now - enterTime;\n\n\t\treturn window[className].secondToTime(diffSeconds);\n\t},\n\tsecondToTime(diffSeconds){\n\t\tif (diffSeconds < 0) return '0';\n\t\t// Форматируем: чч:мм:сс или мм:сс, или просто секунды\n\t\tconst hours = Math.floor(diffSeconds / 3600);\n\t\tconst minutes = Math.floor((diffSeconds % 3600) / 60);\n\t\tconst seconds = Math.round(diffSeconds % 60);\n\t\tif (hours > 0) {\n\t\t\treturn `${hours}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n\t\t} else if (minutes > 0) {\n\t\t\treturn `${minutes}:${seconds.toString().padStart(2, '0')}`;\n\t\t} else {\n\t\t\treturn `${seconds}`;\n\t\t}\n\t},\n\tonChangeSetting(settingName, value) {\n\t\tif(window[className].isInit){\n\t\t\treturn;\n\t\t}\n\t\tlet data = {\n\t\t\t[settingName]: value\n\t\t};\n\t\t$.api({\n\t\t\turl: window[className].saveUserActionUrl,\n\t\t\ton: 'now',\n\t\t\tmethod: 'POST',\n\t\t\tdata: data,\n\t\t\tsuccessTest(response) {\n\t\t\t\treturn response !== undefined && Object.keys(response).length > 0 && response.success === true;\n\t\t\t},\n\t\t\tonSuccess(response) {\n\t\t\t\tif(settingName === 'queueId'){\n\t\t\t\t\t$('#queueId').val($(window[className].queueNameSelector).dropdown('get value'));\n\t\t\t\t}else if( settingName === 'adminUserId'){\n\t\t\t\t\twindow.location.href = window.location.href;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonFailure(response) {\n\t\t\t\tconsole.log(response);\n\t\t\t},\n\t\t\tonError(errorMessage, element, xhr) {\n\t\t\t\tconsole.log(errorMessage,xhr);\n\t\t\t}\n\t\t});\n\t},\n\texecuteCallAction(data) {\n\t\t$.api({\n\t\t\turl: window[className].executeCallUrl,\n\t\t\ton: 'now',\n\t\t\tmethod: 'POST',\n\t\t\tdata: data,\n\t\t\tsuccessTest(response) {\n\t\t\t\treturn response !== undefined && Object.keys(response).length > 0 && response.success === true;\n\t\t\t},\n\t\t\tonSuccess(response) {\n\t\t\t\tconsole.log(response);\n\t\t\t},\n\t\t\tonFailure(response) {\n\t\t\t\tconsole.log(response);\n\t\t\t},\n\t\t\tonError(errorMessage, element, xhr) {\n\t\t\t\tconsole.log(errorMessage,xhr);\n\t\t\t}\n\t\t});\n\t},\n\tupdateLines() {\n\t\t$.api({\n\t\t\turl: window[className].activeChannelsUrlV2,\n\t\t\ton: 'now',\n\t\t\tmethod: 'POST',\n\t\t\tsuccessTest(response) {\n\t\t\t\treturn response !== undefined && Object.keys(response).length > 0 && response.success === true;\n\t\t\t},\n\t\t\tonSuccess(response) {\n\t\t\t\twindow[className].$widgetQueues.updatedCallsFromResponse(response);\n\t\t\t\twindow[className].$callsWidget.updatedCallsFromResponse(response);\n\t\t\t},\n\t\t\tonFailure(response) {\n\t\t\t\tconsole.log(response);\n\t\t\t},\n\t\t\tonError(errorMessage, element, xhr) {\n\t\t\t\tconsole.log(errorMessage,xhr);\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * We can modify some data before form send\n\t * @param settings\n\t * @returns {*}\n\t */\n\tcbBeforeSendForm(settings) {\n\t\tconst result = settings;\n\t\tresult.data = window[className].$formObj.form('get values');\n\t\treturn result;\n\t},\n\t/**\n\t * Some actions after forms send\n\t */\n\tcbAfterSendForm() {\n\n\t},\n\t/**\n\t * Initialize form parameters\n\t */\n\tinitializeForm() {\n\t\tForm.$formObj = window[className].$formObj;\n\t\tForm.url = `${globalRootUrl}${idUrl}/save`;\n\t\tForm.validateRules = window[className].validateRules;\n\t\tForm.cbBeforeSendForm = window[className].cbBeforeSendForm;\n\t\tForm.cbAfterSendForm = window[className].cbAfterSendForm;\n\t\tForm.initialize();\n\t},\n};\n\n$(document).ready(() => {\n\twindow[className].initialize();\n});\n\n"],"mappings":"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","ignoreList":[]}
\ No newline at end of file
diff --git a/public/assets/js/src/module-monitor-active-calls-index.js b/public/assets/js/src/module-monitor-active-calls-index.js
index 015c5c4..88cb962 100644
--- a/public/assets/js/src/module-monitor-active-calls-index.js
+++ b/public/assets/js/src/module-monitor-active-calls-index.js
@@ -637,8 +637,17 @@ const ModuleMonitorActiveCalls = {
$('.ui.clearing.hidden.divider').remove();
// Окончание форматирования базовой страницы
//////
+ this.startPollingActiveCalls();
+ },
+ startPollingActiveCalls() {
+ if (this._activeCallsPollTimer) return;
window[className].updateLines();
- setInterval(window[className].updateLines, 2000);
+ this._activeCallsPollTimer = setInterval(window[className].updateLines, 2000);
+ },
+ stopPollingActiveCalls() {
+ if (!this._activeCallsPollTimer) return;
+ clearInterval(this._activeCallsPollTimer);
+ this._activeCallsPollTimer = null;
},
async initContactsCache() {
try {
@@ -727,6 +736,7 @@ const ModuleMonitorActiveCalls = {
if (accessToken && refreshToken) {
window[className].setAuthTokens(accessToken, refreshToken);
window[className].connectContactsWs();
+ window[className].connectActiveCallsWs();
}
},
onFailure(response) {
@@ -842,6 +852,69 @@ const ModuleMonitorActiveCalls = {
this.scheduleContactsWsReconnect('init_error', this.isAccessTokenExpired(0));
}
},
+ scheduleActiveCallsWsReconnect(reason, forceReAuth = false) {
+ if (this._activeCallsWsReconnectTimer) {
+ clearTimeout(this._activeCallsWsReconnectTimer);
+ this._activeCallsWsReconnectTimer = null;
+ }
+ this._activeCallsWsReconnectAttempt = (this._activeCallsWsReconnectAttempt || 0) + 1;
+ const delay = Math.min(30000, 1000 * Math.pow(2, Math.min(5, this._activeCallsWsReconnectAttempt - 1)));
+ this._activeCallsWsReconnectTimer = setTimeout(() => {
+ if (forceReAuth || this.isAccessTokenExpired(5)) {
+ this.requestBackendEnable();
+ } else {
+ this.connectActiveCallsWs();
+ }
+ }, delay);
+ console.log('active-calls ws reconnect scheduled', { reason, delayMs: delay });
+ },
+ connectActiveCallsWs() {
+ try {
+ const accessToken = this._authTokens?.access_token;
+ if (!accessToken) return;
+
+ // Avoid reconnecting if already connected/connecting
+ if (this._activeCallsWs && (this._activeCallsWs.readyState === WebSocket.OPEN || this._activeCallsWs.readyState === WebSocket.CONNECTING)) {
+ return;
+ }
+ // Reset backoff on explicit connect attempt
+ this._activeCallsWsReconnectAttempt = 0;
+
+ // Token exists -> use WS, disable polling fallback
+ this.stopPollingActiveCalls();
+
+ const wsProto = window.location.protocol === 'https:' ? 'wss' : 'ws';
+ const wsHost = window.location.host; // host:port of current page
+ const tokenParam = encodeURIComponent(accessToken);
+ const wsUrl = `${wsProto}://${wsHost}/pbxcore/api/module-softphone-backend/v1/sub/active-calls?authorization=${tokenParam}`;
+
+ this._activeCallsWs = new WebSocket(wsUrl);
+ this._activeCallsWs.onopen = () => {
+ console.log('active-calls ws connected');
+ // Reuse the same token refresh timer (it triggers requestBackendEnable)
+ this.scheduleContactsWsTokenRefresh();
+ };
+ this._activeCallsWs.onmessage = (event) => {
+ this.handleActiveCallsWsMessage(event?.data);
+ };
+ this._activeCallsWs.onerror = (event) => {
+ console.log('active-calls ws error', event);
+ };
+ this._activeCallsWs.onclose = (event) => {
+ const code = event?.code;
+ const reason = event?.reason;
+ console.log('active-calls ws closed', { code, reason });
+
+ // Auth closes vary by server implementation.
+ const authCloseCodes = new Set([1008, 4001, 4401, 4403]);
+ const forceReAuth = authCloseCodes.has(code) || this.isAccessTokenExpired(0);
+ this.scheduleActiveCallsWsReconnect('close', forceReAuth);
+ };
+ } catch (e) {
+ console.log('active-calls ws init error', e);
+ this.scheduleActiveCallsWsReconnect('init_error', this.isAccessTokenExpired(0));
+ }
+ },
handleContactsWsMessage(data) {
try {
if (!data) return;
@@ -864,6 +937,20 @@ const ModuleMonitorActiveCalls = {
console.log('contacts ws parse error', e);
}
},
+ handleActiveCallsWsMessage(data) {
+ try {
+ if (!data) return;
+ const parsed = typeof data === 'string' ? JSON.parse(data) : data;
+ const payload = parsed?.queues ? parsed : (parsed?.data?.queues ? parsed.data : null);
+ if (!payload) return;
+ if (!window[className].$widgetQueues || !window[className].$callsWidget) return;
+
+ window[className].$widgetQueues.updatedCallsFromResponse(payload);
+ window[className].$callsWidget.updatedCallsFromResponse(payload);
+ } catch (e) {
+ console.log('active-calls ws parse error', e);
+ }
+ },
formatElapsedTime(enterTime) {
if (!enterTime) return '—';
From 70477b1b4b612610bd99b4f4bdc005c58bc30da8 Mon Sep 17 00:00:00 2001
From: boffart <5922739+boffart@users.noreply.github.com>
Date: Fri, 16 Jan 2026 10:28:43 +0300
Subject: [PATCH 13/23] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?=
=?UTF-8?q?=D0=B8=D0=BB=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5?=
=?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B2=D1=8B=D0=B7=D0=BE=D0=B2=D0=BE=D0=B2?=
=?UTF-8?q?=20=D0=B2=20=D0=BE=D0=B6=D0=B8=D0=B4=D0=B0=D0=BD=D0=B8=D0=B8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
App/Views/index.volt | 6 +++---
Lib/MonitorActiveCallsMain.php | 1 -
bin/WorkerAmiActions.php | 5 +++++
3 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/App/Views/index.volt b/App/Views/index.volt
index 1f9935f..c0e1bbe 100644
--- a/App/Views/index.volt
+++ b/App/Views/index.volt
@@ -69,7 +69,7 @@
|