diff --git a/web/templates/base.html b/web/templates/base.html index 07729d5..9946ae2 100644 --- a/web/templates/base.html +++ b/web/templates/base.html @@ -285,6 +285,14 @@ showToast(successMessage, 'success'); // Update last sync time - removed since dropdown is gone // loadLastSyncTime(); + + // Dispatch custom event for pages to react to sync completion + window.dispatchEvent(new CustomEvent('sync-completed', { + detail: { + endpoint: endpoint, + data: data + } + })); } else if (resp.status === 423) { const reason = data.reason_text || data.error || 'Синхронизация заблокирована.'; showToast(reason, 'error'); diff --git a/web/templates/configs.html b/web/templates/configs.html index afb80e8..fe052cf 100644 --- a/web/templates/configs.html +++ b/web/templates/configs.html @@ -4,13 +4,10 @@

Мои конфигурации

-
- -
@@ -785,44 +782,19 @@ async function loadConfigs() { } } -async function importConfigsFromServer() { - const button = document.getElementById('import-configs-btn'); - const originalText = button.textContent; - button.disabled = true; - button.textContent = 'Импорт...'; - - try { - const resp = await fetch('/api/configs/import', { method: 'POST' }); - const data = await resp.json(); - - if (!resp.ok) { - alert('Ошибка импорта: ' + (data.error || 'неизвестная ошибка')); - return; - } - - alert( - 'Импорт завершен:\n' + - '- Новых: ' + (data.imported || 0) + '\n' + - '- Обновлено: ' + (data.updated || 0) + '\n' + - '- Пропущено (локальные изменения): ' + (data.skipped || 0) - ); - - currentPage = 1; - await loadConfigs(); - } catch (e) { - alert('Ошибка импорта с сервера'); - } finally { - button.disabled = false; - button.textContent = originalText; - } -} - document.addEventListener('DOMContentLoaded', function() { applyStatusModeUI(); loadProjectsForConfigUI().then(loadConfigs); // Load latest pricelist version for badge loadLatestPricelistVersion(); + + // Listen for sync completion events from navbar + window.addEventListener('sync-completed', function(e) { + // Reset pagination and reload configurations list + currentPage = 1; + loadConfigs(); + }); }); document.getElementById('configs-search').addEventListener('input', function(e) { diff --git a/web/templates/pricelists.html b/web/templates/pricelists.html index 1578d1e..62fdd3d 100644 --- a/web/templates/pricelists.html +++ b/web/templates/pricelists.html @@ -235,6 +235,12 @@ document.addEventListener('DOMContentLoaded', function() { checkPricelistWritePermission(); loadPricelists(1); + + // Listen for sync completion events from navbar + window.addEventListener('sync-completed', function(e) { + // Reload pricelists on sync completion + loadPricelists(1); + }); }); {{end}} diff --git a/web/templates/projects.html b/web/templates/projects.html index 0742033..8f49faf 100644 --- a/web/templates/projects.html +++ b/web/templates/projects.html @@ -385,40 +385,48 @@ async function copyProject(projectUUID, projectName) { loadProjects(); } -loadProjects(); - -document.getElementById('projects-search').addEventListener('input', function(e) { - projectsSearch = (e.target.value || '').trim(); - currentPage = 1; +document.addEventListener('DOMContentLoaded', function() { loadProjects(); -}); -document.getElementById('create-project-code').addEventListener('input', function() { - updateCreateProjectTrackerURL(); -}); + document.getElementById('projects-search').addEventListener('input', function(e) { + projectsSearch = (e.target.value || '').trim(); + currentPage = 1; + loadProjects(); + }); -document.getElementById('create-project-tracker-url').addEventListener('input', function(e) { - createProjectTrackerManuallyEdited = (e.target.value || '').trim() !== createProjectLastAutoTrackerURL; -}); + document.getElementById('create-project-code').addEventListener('input', function() { + updateCreateProjectTrackerURL(); + }); -document.getElementById('create-project-code').addEventListener('keydown', function(e) { - if (e.key === 'Enter') { - e.preventDefault(); - createProject(); - } -}); + document.getElementById('create-project-tracker-url').addEventListener('input', function(e) { + createProjectTrackerManuallyEdited = (e.target.value || '').trim() !== createProjectLastAutoTrackerURL; + }); -document.getElementById('create-project-tracker-url').addEventListener('keydown', function(e) { - if (e.key === 'Enter') { - e.preventDefault(); - createProject(); - } -}); + document.getElementById('create-project-code').addEventListener('keydown', function(e) { + if (e.key === 'Enter') { + e.preventDefault(); + createProject(); + } + }); -document.getElementById('create-project-modal').addEventListener('click', function(e) { - if (e.target === this) { - closeCreateProjectModal(); - } + document.getElementById('create-project-tracker-url').addEventListener('keydown', function(e) { + if (e.key === 'Enter') { + e.preventDefault(); + createProject(); + } + }); + + document.getElementById('create-project-modal').addEventListener('click', function(e) { + if (e.target === this) { + closeCreateProjectModal(); + } + }); + + // Listen for sync completion events from navbar + window.addEventListener('sync-completed', function(e) { + // Reset pagination and reload projects list + loadProjects(); + }); }); {{end}}