(() => {
let isSorting = false;
const sortTable = () => {
if (isSorting) return;
// Ищем все строки таблицы
let rows = Array.from(document.querySelectorAll('tbody tr')).filter(r => !r.querySelector('th'));
let container = document.querySelector('tbody');
if (!rows.length) {
const badges = Array.from(document.querySelectorAll('*')).filter(el =>
el.children.length === 0 && /(^|\s)(не\s+)?выполнено(\s|$)/i.test(el.textContent)
);
if (badges.length > 0) {
let p = badges[0].parentElement;
while (p && p.parentElement && p.parentElement.children.length < 3) p = p.parentElement;
container = p.parentElement;
rows = Array.from(container.children);
}
}
// Берем все строки заказов
rows = rows.filter(r => /(не\s+)?выполнено/i.test(r.innerText));
if (!rows.length || !container) return;
// «Не выполнено» -> 0 (наверх), «Выполнено» -> 1 (вниз)
const getStatusPriority = (row) => {
return (row.innerText || '').toLowerCase().includes('не выполнено') ? 0 : 1;
};
const getShelfNum = (row) => {
const match = (row.innerText || '').match(/Полка[-\s]*(\d+)/i);
return match ? parseInt(match[1], 10) : 999999;
};
const compareRows = (a, b) => {
const sDiff = getStatusPriority(a) - getStatusPriority(b);
if (sDiff !== 0) return sDiff;
return getShelfNum(a) - getShelfNum(b);
};
let alreadySorted = true;
for (let i = 0; i < rows.length - 1; i++) {
if (compareRows(rows[i], rows[i + 1]) > 0) {
alreadySorted = false;
break;
}
}
if (alreadySorted) return;
isSorting = true;
rows.sort(compareRows);
rows.forEach(row => container.appendChild(row));
setTimeout(() => { isSorting = false; }, 100);
};
sortTable();
if (window._ozonShelfObserver) {
window._ozonShelfObserver.disconnect();
}
window._ozonShelfObserver = new MutationObserver(() => {
sortTable();
});
window._ozonShelfObserver.observe(document.body, { childList: true, subtree: true });
console.log('✅ Готово! Зеленые «Выполнено» внизу, красные «Не выполнено» вверху по полкам.');
})();