Карточка: не сбрасывать выделение текста при автообновлении
Пока пользователь выделяет текст мышью (например, копирует M2M GUID), автообновление пропускает такт: live-опрос и перезагрузка карточки по смене подписи, а также подстановка новых строк в журнале не выполняются, пока выделение активно (window.bjSelecting). Как только выделение снято — обновление продолжается на следующем такте. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -837,6 +837,9 @@ button.dq-link, .dq-link { background:none !important; border:0 !important; padd
|
|||||||
// перерисовывается сама; если оператор уже начал заполнять форму — только предложение обновить.
|
// перерисовывается сама; если оператор уже начал заполнять форму — только предложение обновить.
|
||||||
(function(){
|
(function(){
|
||||||
var dirty = false;
|
var dirty = false;
|
||||||
|
// Пока пользователь выделяет текст мышью (например, копирует M2M GUID), автообновление
|
||||||
|
// не должно трогать страницу — иначе выделение сбрасывается. Такт пропускается, повтор — позже.
|
||||||
|
window.bjSelecting = window.bjSelecting || function(){ try { var s = window.getSelection(); return !!s && !s.isCollapsed && String(s).replace(/\s+/g, '').length > 0; } catch(e){ return false; } };
|
||||||
document.addEventListener('input', function(e){ if (e.target.closest('main form')) dirty = true; }, true);
|
document.addEventListener('input', function(e){ if (e.target.closest('main form')) dirty = true; }, true);
|
||||||
document.addEventListener('change', function(e){ if (e.target.closest('main form')) dirty = true; }, true);
|
document.addEventListener('change', function(e){ if (e.target.closest('main form')) dirty = true; }, true);
|
||||||
try { var u = new URL(location.href); if (u.searchParams.has('flash')) { u.searchParams.delete('flash'); history.replaceState(null, '', u.pathname + u.search + u.hash); } } catch(e){}
|
try { var u = new URL(location.href); if (u.searchParams.has('flash')) { u.searchParams.delete('flash'); history.replaceState(null, '', u.pathname + u.search + u.hash); } } catch(e){}
|
||||||
@@ -880,6 +883,7 @@ button.dq-link, .dq-link { background:none !important; border:0 !important; padd
|
|||||||
meta(e, e.hasAttribute('data-active') ? '<span class="dot"></span>обновляется автоматически' : 'заявка завершена — автообновление не требуется');
|
meta(e, e.hasAttribute('data-active') ? '<span class="dot"></span>обновляется автоматически' : 'заявка завершена — автообновление не требуется');
|
||||||
});
|
});
|
||||||
function tick(){
|
function tick(){
|
||||||
|
if (window.bjSelecting && window.bjSelecting()) return; // идёт выделение текста — не трогаем страницу
|
||||||
var els = document.querySelectorAll('.live[data-live][data-active]');
|
var els = document.querySelectorAll('.live[data-live][data-active]');
|
||||||
if (!els.length) return;
|
if (!els.length) return;
|
||||||
var out = [], inn = [];
|
var out = [], inn = [];
|
||||||
@@ -930,6 +934,7 @@ button.dq-link, .dq-link { background:none !important; border:0 !important; padd
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
function tick(){
|
function tick(){
|
||||||
|
if (window.bjSelecting && window.bjSelecting()) return; // идёт выделение текста — новые строки подставим позже
|
||||||
fetch('/admin/journal/rows?since=' + encodeURIComponent(maxTime()), {cache:'no-store'})
|
fetch('/admin/journal/rows?since=' + encodeURIComponent(maxTime()), {cache:'no-store'})
|
||||||
.then(function(r){ return r.json(); })
|
.then(function(r){ return r.json(); })
|
||||||
.then(function(d){
|
.then(function(d){
|
||||||
|
|||||||
Reference in New Issue
Block a user