Копирование папок desktop и desktop-angular из ветки main

This commit is contained in:
2025-10-03 16:53:13 +06:00
parent 7909ec619e
commit fbb530c619
70 changed files with 33414 additions and 1 deletions

View File

@@ -0,0 +1,149 @@
(() => {
const qs = (sel) => document.querySelector(sel);
const qst = (sel) => document.querySelector(sel);
function showStatus(message, type = 'success') {
const status = qs('#status');
status.textContent = message;
status.className = `status ${type}`;
status.style.display = 'block';
setTimeout(() => {
status.style.display = 'none';
}, 3000);
}
function validateJson(text) {
try {
JSON.parse(text);
return { valid: true };
} catch (e) {
return { valid: false, error: e.message };
}
}
function formatJson(obj) {
return JSON.stringify(obj, null, 2);
}
// Загрузка текущей конфигурации
async function loadConfig() {
try {
const config = await window.api.getAllConfig();
const jsonText = formatJson(config);
qst('#configJson').value = jsonText;
} catch (e) {
console.error('Failed to load config:', e);
showStatus('Ошибка загрузки конфигурации', 'error');
qst('#configJson').value = '{}';
}
}
// Сохранение конфигурации
async function saveConfig() {
const text = qst('#configJson').value.trim();
if (!text) {
showStatus('Конфигурация не может быть пустой', 'error');
return;
}
const validation = validateJson(text);
if (!validation.valid) {
showStatus(`Неверный JSON: ${validation.error}`, 'error');
return;
}
try {
const config = JSON.parse(text);
const result = await window.api.setAllConfig(config);
if (result.ok) {
showStatus('Конфигурация успешно сохранена');
// Обновляем конфиг в главном окне
setTimeout(() => {
if (window.opener) {
window.opener.location.reload();
}
}, 1000);
} else {
showStatus(`Ошибка сохранения: ${result.error}`, 'error');
}
} catch (e) {
console.error('Failed to save config:', e);
showStatus('Ошибка сохранения конфигурации', 'error');
}
}
// Закрытие окна через IPC
async function closeWindow() {
try {
const result = await window.api.closeSettings();
if (!result.ok) {
console.error('Failed to close settings window:', result.error);
}
} catch (e) {
console.error('Error closing settings window:', e);
}
}
// Обработчики событий
window.addEventListener('DOMContentLoaded', () => {
// Загружаем конфигурацию при открытии
loadConfig();
// Кнопка сохранения
qs('#saveBtn').addEventListener('click', saveConfig);
// Кнопка возврата
qs('#cancelBtn').addEventListener('click', () => closeWindow());
// Горячие клавиши
document.addEventListener('keydown', (e) => {
if (e.ctrlKey || e.metaKey) {
if (e.key === 's') {
e.preventDefault();
saveConfig();
} else if (e.key === 'w' || e.key === 'Escape') {
e.preventDefault();
closeWindow();
}
}
});
// Автосохранение при изменении (опционально)
let saveTimeout;
qst('#configJson').addEventListener('input', () => {
clearTimeout(saveTimeout);
// Можно добавить автосохранение через 5 секунд бездействия
// saveTimeout = setTimeout(() => {
// const validation = validateJson(qst('#configJson').value);
// if (validation.valid) {
// saveConfig();
// }
// }, 5000);
});
});
// Предотвращение случайного закрытия с несохраненными изменениями
let hasUnsavedChanges = false;
qst('#configJson').addEventListener('input', () => {
hasUnsavedChanges = true;
});
// Убираем beforeunload для Electron (не работает корректно)
// window.addEventListener('beforeunload', (e) => {
// if (hasUnsavedChanges) {
// e.preventDefault();
// e.returnValue = 'У вас есть несохраненные изменения. Вы уверены, что хотите закрыть?';
// }
// });
// Сбрасываем флаг после сохранения
const originalSaveConfig = saveConfig;
saveConfig = async function() {
await originalSaveConfig();
hasUnsavedChanges = false;
};
})();