Журнал/списки: верхний бейдж статуса обновляется живьём, без F5
Поллер строк в работе (/admin/journal/live, tick в layout.html) обновлял только нижнюю live-строку, а верхний бейдж статуса оставался тем, что отрисовал сервер при загрузке — после отправки показывал «не отправлено», пока страницу не обновишь. LiveStatus получил поля badge/badgeText/outcome (заполняются в liveOutgoing/liveIncoming из тех же источников, что и строка журнала), tick синхронизирует верхний бейдж и бейдж исхода. Касается журнала обмена, «Исходящих» и «Входящих» — у всех общий поллер. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -25,6 +25,11 @@ type LiveStatus struct {
|
||||
Kind string `json:"kind"` // wait | warn | ok | bad
|
||||
Active bool `json:"active"` // в работе: страница продолжает опрашивать
|
||||
Sig string `json:"sig,omitempty"` // отпечаток состояния: изменился — карточка перерисовывается
|
||||
// Верхний бейдж статуса строки журнала/списка — чтобы поллер обновлял и его, а не только
|
||||
// нижнюю live-строку (иначе бейдж застывает до перезагрузки страницы).
|
||||
Badge string `json:"badge,omitempty"` // класс бейджа (как .Status в строке)
|
||||
BadgeText string `json:"badgeText,omitempty"` // русский текст статуса
|
||||
Outcome string `json:"outcome,omitempty"` // бейдж исхода (входящие): Принято/Отказано/Частично…
|
||||
}
|
||||
|
||||
// liveSig — короткий отпечаток всего, что показывает карточка: сменился — страница обновляется.
|
||||
@@ -52,6 +57,7 @@ func liveOutgoing(c ClaimView) LiveStatus {
|
||||
}
|
||||
}
|
||||
st.Sig = liveSig(st.Text, c.Status, c.UpdatedAt, sendFailGet(guid), quik, depoL, watch)
|
||||
st.Badge, st.BadgeText = c.Status, russianState(c.Status)
|
||||
return st
|
||||
}
|
||||
|
||||
@@ -64,6 +70,7 @@ func liveIncoming(it *IncomingTransfer) LiveStatus {
|
||||
watch = globalOrderWatch.Get(it.GUID)
|
||||
}
|
||||
st.Sig = liveSig(st.Text, it, watch)
|
||||
st.Badge, st.BadgeText, st.Outcome = incomingJournalStatus(it)
|
||||
}
|
||||
return st
|
||||
}
|
||||
|
||||
@@ -951,6 +951,16 @@ button.dq-link, .dq-link { background:none !important; border:0 !important; padd
|
||||
e.textContent = st.text;
|
||||
e.className = 'live ' + (big ? 'live-big ' : '') + 'live-' + st.kind;
|
||||
if (!st.active) e.removeAttribute('data-active');
|
||||
if (!big && st.badgeText) { // синхронизируем верхний бейдж статуса строки (не только нижнюю live-строку)
|
||||
var td = e.parentNode, bs = td ? td.querySelectorAll('span.badge') : [];
|
||||
if (bs[0]) { bs[0].className = 'badge ' + (st.badge || ''); if (bs[0].textContent !== st.badgeText) bs[0].textContent = st.badgeText; }
|
||||
var ob = bs[1] || null;
|
||||
if (st.outcome && bs[0]) {
|
||||
var ocls = st.outcome === 'Принято' ? 'confirmed' : (st.outcome === 'Отказано' ? 'rejected' : 'awaiting_decision');
|
||||
if (!ob) { td.insertBefore(document.createTextNode(' '), e); ob = document.createElement('span'); td.insertBefore(ob, e); }
|
||||
ob.className = 'badge ' + ocls; if (ob.textContent !== st.outcome) ob.textContent = st.outcome;
|
||||
} else if (ob) { var sp = ob.previousSibling; if (sp && sp.nodeType === 3 && !sp.nodeValue.trim()) sp.remove(); ob.remove(); }
|
||||
}
|
||||
var nx = e.nextElementSibling;
|
||||
if (big && !(nx && nx.classList.contains('changed'))) {
|
||||
meta(e, st.active ? '<span class="dot"></span>обновляется автоматически · проверено в ' + hhmmss() : 'заявка завершена — автообновление не требуется');
|
||||
|
||||
Reference in New Issue
Block a user