Files
Email-to-operator-name/Tampermonkey_email.js
T

129 lines
4.7 KiB
JavaScript

// ==UserScript==
// @name Плашка оператора (Новые договоры)
// @namespace http://192.168.254.38/
// @version 1.0.0
// @description Показывает плашку с именем оператора из папки "Новые договоры"
// @author yasu
// @match https://admin2.gtn.ru/diagnostics/index.php?*search=*
// @grant GM_xmlhttpRequest
// @connect 192.168.254.38
// @updateURL http://192.168.254.38:8766/script.user.js
// @downloadURL http://192.168.254.38:8766/script.user.js
// ==/UserScript==
(function() {
'use strict';
const BANNER_ID = 'contract-operator-banner';
let bannerShownOnThisPage = false;
function getContractNumberFromUrl() {
const url = window.location.href;
const match = url.match(/[?&]search=(\d+)/);
return match ? match[1] : null;
}
function checkBanner(contractNumber, callback) {
GM_xmlhttpRequest({
method: 'GET',
url: `http://192.168.254.38:8766/get-banner?contract=${contractNumber}`,
timeout: 5000,
onload: function(response) {
try {
callback(null, JSON.parse(response.responseText));
} catch(e) {
callback(e, null);
}
},
onerror: callback,
ontimeout: function() { callback(new Error('Timeout'), null); }
});
}
function closeBanner(contractNumber, callback) {
GM_xmlhttpRequest({
method: 'POST',
url: 'http://192.168.254.38:8766/close-banner',
headers: { 'Content-Type': 'application/json' },
data: JSON.stringify({ contract_number: contractNumber }),
timeout: 5000,
onload: function() { callback(null); },
onerror: callback
});
}
function formatDate(dateString) {
if (!dateString) return '';
const parts = dateString.split(' ');
if (parts.length < 2) return dateString;
const dateParts = parts[0].split('-');
if (dateParts.length === 3) {
return `${dateParts[2]}.${dateParts[1]}.${dateParts[0]} ${parts[1].substring(0, 5)}`;
}
return dateString;
}
function showBanner(operatorName, contractNumber, receivedDate) {
const oldBanner = document.getElementById(BANNER_ID);
if (oldBanner) oldBanner.remove();
const banner = document.createElement('div');
banner.id = BANNER_ID;
banner.style.cssText = `
position: fixed;
top: 10px;
right: 10px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 12px 18px;
border-radius: 8px;
box-shadow: 0 4px 12px rgba(0,0,0,0.2);
z-index: 99999;
font-family: Arial, sans-serif;
font-size: 14px;
cursor: pointer;
min-width: 200px;
border-left: 3px solid #ffd700;
`;
banner.innerHTML = `
<div style="display: flex; justify-content: space-between; align-items: center;">
<div>
<div style="font-weight: bold; font-size: 15px;">📋 ${operatorName}</div>
<div style="font-size: 11px; opacity: 0.8; margin-top: 4px;">Договор №${contractNumber}</div>
${formatDate(receivedDate) ? `<div style="font-size: 10px; opacity: 0.6; margin-top: 2px;">${formatDate(receivedDate)}</div>` : ''}
</div>
<div style="margin-left: 12px; font-size: 18px; font-weight: bold;">&times;</div>
</div>
`;
banner.onclick = () => {
banner.remove();
closeBanner(contractNumber, function(err) {
if (err) console.error('Ошибка при закрытии плашки:', err);
else console.log(`Плашка для договора ${contractNumber} закрыта`);
});
};
document.body.appendChild(banner);
bannerShownOnThisPage = true;
}
function init() {
if (bannerShownOnThisPage) return;
const contractNumber = getContractNumberFromUrl();
if (!contractNumber) return;
checkBanner(contractNumber, function(err, data) {
if (err || !data || data.show !== true) return;
showBanner(data.operator_name, data.contract_number, data.received_date);
});
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();