Implement warehouse/lot pricing updates and configurator performance fixes
This commit is contained in:
@@ -38,7 +38,7 @@
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-6 pb-12">
|
||||
<main class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-6">
|
||||
{{template "content" .}}
|
||||
</main>
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
|
||||
<!-- Sync Info Modal -->
|
||||
<div id="sync-modal" class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 hidden">
|
||||
<div class="bg-white rounded-lg shadow-xl max-w-md w-full mx-4">
|
||||
<div class="bg-white rounded-lg shadow-xl max-w-lg w-full mx-4">
|
||||
<div class="p-6">
|
||||
<div class="flex justify-between items-center mb-4">
|
||||
<h3 class="text-lg font-medium text-gray-900">Информация о синхронизации</h3>
|
||||
@@ -57,28 +57,64 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="space-y-4">
|
||||
<div class="space-y-5">
|
||||
<!-- Section 1: DB Connection -->
|
||||
<div>
|
||||
<h4 class="font-medium text-gray-900">Статус БД</h4>
|
||||
<p id="modal-db-status" class="text-sm text-gray-600">Проверка...</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h4 class="font-medium text-gray-900">Количество ошибок</h4>
|
||||
<p id="modal-error-count" class="text-sm text-gray-600">0</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h4 class="font-medium text-gray-900">Последняя синхронизация</h4>
|
||||
<p id="modal-last-sync" class="text-sm text-gray-600">-</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<h4 class="font-medium text-gray-900">Список ошибок</h4>
|
||||
<div id="modal-errors-list" class="mt-2 text-sm text-gray-600 max-h-40 overflow-y-auto">
|
||||
<p>Нет ошибок</p>
|
||||
<h4 class="font-medium text-gray-900 mb-2">Подключение к БД</h4>
|
||||
<div class="text-sm space-y-1">
|
||||
<div class="flex justify-between">
|
||||
<span class="text-gray-500">Адрес:</span>
|
||||
<span id="modal-db-host" class="text-gray-700 font-mono">—</span>
|
||||
</div>
|
||||
<div class="flex justify-between">
|
||||
<span class="text-gray-500">Пользователь:</span>
|
||||
<span id="modal-db-user" class="text-gray-700">—</span>
|
||||
</div>
|
||||
<div class="flex justify-between">
|
||||
<span class="text-gray-500">Статус:</span>
|
||||
<span id="modal-db-status" class="text-gray-700">Проверка...</span>
|
||||
</div>
|
||||
<div class="flex justify-between">
|
||||
<span class="text-gray-500">Последняя синхронизация:</span>
|
||||
<span id="modal-last-sync" class="text-gray-700">—</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Section 2: Statistics -->
|
||||
<div>
|
||||
<h4 class="font-medium text-gray-900 mb-2">Статистика</h4>
|
||||
<div class="grid grid-cols-2 gap-2 text-sm">
|
||||
<div class="flex justify-between bg-gray-50 rounded px-3 py-1.5">
|
||||
<span class="text-gray-500">Компоненты (lot):</span>
|
||||
<span id="modal-lot-count" class="font-medium text-gray-700">—</span>
|
||||
</div>
|
||||
<div class="flex justify-between bg-gray-50 rounded px-3 py-1.5">
|
||||
<span class="text-gray-500">Котировки:</span>
|
||||
<span id="modal-lotlog-count" class="font-medium text-gray-700">—</span>
|
||||
</div>
|
||||
<div class="flex justify-between bg-gray-50 rounded px-3 py-1.5">
|
||||
<span class="text-gray-500">Конфигурации:</span>
|
||||
<span id="modal-config-count" class="font-medium text-gray-700">—</span>
|
||||
</div>
|
||||
<div class="flex justify-between bg-gray-50 rounded px-3 py-1.5">
|
||||
<span class="text-gray-500">Проекты:</span>
|
||||
<span id="modal-project-count" class="font-medium text-gray-700">—</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Section 3: Pending Changes (shown only if any) -->
|
||||
<div id="modal-pending-section" class="hidden">
|
||||
<h4 class="font-medium text-gray-900 mb-2">Ожидающие синхронизации</h4>
|
||||
<div id="modal-pending-list" class="text-sm max-h-40 overflow-y-auto space-y-1"></div>
|
||||
</div>
|
||||
|
||||
<!-- Section 4: Errors (shown only if any) -->
|
||||
<div id="modal-errors-section" class="hidden">
|
||||
<h4 class="font-medium text-gray-900 mb-2">Ошибки синхронизации</h4>
|
||||
<div id="modal-errors-list" class="text-sm max-h-40 overflow-y-auto space-y-1"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-6 flex justify-end">
|
||||
@@ -90,13 +126,6 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer class="fixed bottom-0 left-0 right-0 bg-gray-800 text-gray-300 text-xs py-1 px-4">
|
||||
<div class="max-w-7xl mx-auto flex justify-between">
|
||||
<span id="db-status">БД: проверка...</span>
|
||||
<span id="db-counts"></span>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script>
|
||||
function showToast(msg, type) {
|
||||
const colors = { success: 'bg-green-500', error: 'bg-red-500', info: 'bg-blue-500' };
|
||||
@@ -129,37 +158,75 @@
|
||||
const resp = await fetch('/api/sync/info');
|
||||
const data = await resp.json();
|
||||
|
||||
document.getElementById('modal-db-status').textContent = data.is_online ? 'Подключено' : 'Отключено';
|
||||
document.getElementById('modal-error-count').textContent = data.error_count;
|
||||
// Section 1: DB Connection
|
||||
document.getElementById('modal-db-host').textContent = data.db_host ? data.db_host + '/' + data.db_name : '—';
|
||||
document.getElementById('modal-db-user').textContent = data.db_user || '—';
|
||||
|
||||
const statusEl = document.getElementById('modal-db-status');
|
||||
if (data.is_online) {
|
||||
statusEl.innerHTML = '<span class="inline-block w-2 h-2 rounded-full bg-green-500 mr-1"></span>Online';
|
||||
} else {
|
||||
statusEl.innerHTML = '<span class="inline-block w-2 h-2 rounded-full bg-red-500 mr-1"></span>Offline';
|
||||
}
|
||||
|
||||
if (data.last_sync_at) {
|
||||
const date = new Date(data.last_sync_at);
|
||||
document.getElementById('modal-last-sync').textContent = date.toLocaleString('ru-RU');
|
||||
} else {
|
||||
document.getElementById('modal-last-sync').textContent = 'Нет данных';
|
||||
document.getElementById('modal-last-sync').textContent = '—';
|
||||
}
|
||||
|
||||
// Load error list
|
||||
// Section 2: Statistics
|
||||
document.getElementById('modal-lot-count').textContent = data.is_online ? data.lot_count.toLocaleString() : '—';
|
||||
document.getElementById('modal-lotlog-count').textContent = data.is_online ? data.lot_log_count.toLocaleString() : '—';
|
||||
document.getElementById('modal-config-count').textContent = data.config_count.toLocaleString();
|
||||
document.getElementById('modal-project-count').textContent = data.project_count.toLocaleString();
|
||||
|
||||
// Section 3: Pending changes
|
||||
const pendingSection = document.getElementById('modal-pending-section');
|
||||
const pendingList = document.getElementById('modal-pending-list');
|
||||
if (data.pending_changes && data.pending_changes.length > 0) {
|
||||
pendingSection.classList.remove('hidden');
|
||||
pendingList.innerHTML = data.pending_changes.map(ch => {
|
||||
const shortUUID = ch.entity_uuid.substring(0, 8);
|
||||
const time = new Date(ch.created_at).toLocaleString('ru-RU');
|
||||
const hasError = ch.last_error ? ' border-l-2 border-red-400 pl-2' : '';
|
||||
const errorLine = ch.last_error ? `<div class="text-red-500 text-xs mt-0.5">${ch.last_error}</div>` : '';
|
||||
return `<div class="bg-gray-50 rounded px-3 py-1.5${hasError}">
|
||||
<span class="font-medium">${ch.operation}</span>
|
||||
<span class="text-gray-500">${ch.entity_type}</span>
|
||||
<span class="font-mono text-xs text-gray-400">${shortUUID}</span>
|
||||
<span class="text-gray-400 text-xs ml-1">${time}</span>
|
||||
${errorLine}
|
||||
</div>`;
|
||||
}).join('');
|
||||
} else {
|
||||
pendingSection.classList.add('hidden');
|
||||
}
|
||||
|
||||
// Section 4: Errors
|
||||
const errorsSection = document.getElementById('modal-errors-section');
|
||||
const errorsList = document.getElementById('modal-errors-list');
|
||||
if (data.errors && data.errors.length > 0) {
|
||||
errorsList.innerHTML = data.errors.map(error =>
|
||||
`<div class="mb-1"><span class="font-medium">${error.timestamp}</span>: ${error.message}</div>`
|
||||
).join('');
|
||||
errorsSection.classList.remove('hidden');
|
||||
errorsList.innerHTML = data.errors.map(error => {
|
||||
const time = new Date(error.timestamp).toLocaleString('ru-RU');
|
||||
return `<div class="bg-red-50 text-red-700 rounded px-3 py-1.5">
|
||||
<span class="text-xs text-red-400">${time}</span>: ${error.message}
|
||||
</div>`;
|
||||
}).join('');
|
||||
} else {
|
||||
errorsList.innerHTML = '<p>Нет ошибок</p>';
|
||||
errorsSection.classList.add('hidden');
|
||||
}
|
||||
} catch(e) {
|
||||
console.error('Failed to load sync info:', e);
|
||||
document.getElementById('modal-db-status').textContent = 'Ошибка загрузки';
|
||||
document.getElementById('modal-error-count').textContent = '0';
|
||||
document.getElementById('modal-last-sync').textContent = '-';
|
||||
document.getElementById('modal-errors-list').innerHTML = '<p>Ошибка загрузки данных</p>';
|
||||
}
|
||||
}
|
||||
|
||||
// Event delegation for sync dropdown and actions
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
checkDbStatus();
|
||||
loadDBUser();
|
||||
checkWritePermission();
|
||||
});
|
||||
|
||||
@@ -214,26 +281,16 @@
|
||||
syncAction('/api/sync/all', 'Полная синхронизация завершена', button, originalHTML);
|
||||
}
|
||||
|
||||
async function checkDbStatus() {
|
||||
async function loadDBUser() {
|
||||
try {
|
||||
const resp = await fetch('/api/db-status');
|
||||
const data = await resp.json();
|
||||
const statusEl = document.getElementById('db-status');
|
||||
const countsEl = document.getElementById('db-counts');
|
||||
const userEl = document.getElementById('db-user');
|
||||
|
||||
if (data.connected) {
|
||||
statusEl.innerHTML = '<span class="text-green-400">БД: подключено</span>';
|
||||
if (data.db_user) {
|
||||
userEl.innerHTML = '<span class="text-gray-500">@</span>' + data.db_user;
|
||||
}
|
||||
} else {
|
||||
statusEl.innerHTML = '<span class="text-red-400">БД: ошибка - ' + data.error + '</span>';
|
||||
if (data.connected && data.db_user) {
|
||||
userEl.innerHTML = '<span class="text-gray-500">@</span>' + data.db_user;
|
||||
}
|
||||
|
||||
countsEl.textContent = 'lot: ' + data.lot_count + ' | lot_log: ' + data.lot_log_count + ' | metadata: ' + data.metadata_count;
|
||||
} catch(e) {
|
||||
document.getElementById('db-status').innerHTML = '<span class="text-red-400">БД: нет связи</span>';
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
|
||||
@@ -262,7 +319,7 @@
|
||||
|
||||
// Call functions immediately to ensure they run even before DOMContentLoaded
|
||||
// This ensures username and admin link are visible ASAP
|
||||
checkDbStatus();
|
||||
loadDBUser();
|
||||
checkWritePermission();
|
||||
|
||||
// Load last sync time - removed since dropdown is gone
|
||||
|
||||
Reference in New Issue
Block a user