Копирование папок desktop и desktop-angular из ветки main
This commit is contained in:
149
desktop/src/renderer/settings.js
Normal file
149
desktop/src/renderer/settings.js
Normal 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;
|
||||
};
|
||||
})();
|
Reference in New Issue
Block a user