diff --git a/frontend/workspace.js b/frontend/workspace.js index cef6308..c65ed88 100644 --- a/frontend/workspace.js +++ b/frontend/workspace.js @@ -22,7 +22,13 @@ async function workspaceApi(url, payload = {}, method = 'POST') { body: method === 'GET' ? undefined : JSON.stringify(payload) }); - return await response.json(); + const data = await response.json().catch(() => ({success: false, detail: 'Пустой ответ сервера'})); + + if (!response.ok) { + appendLog(`Ошибка API ${response.status}: ${data.detail || 'unknown error'}`); + } + + return data; } function getSelectedDevice() { @@ -35,6 +41,50 @@ function getSelectedDevice() { return select.value || null; } +async function loadSystemStatus() { + const data = await workspaceApi('/api/system/status', {}, 'GET'); + const status = document.getElementById('githubStatus'); + const username = document.getElementById('githubUsername'); + + if (!status || !username) { + return; + } + + if (data.github?.username) { + username.value = data.github.username; + } + + status.innerText = data.github?.token_set + ? `GitHub: ${data.github.username || 'user'} / token сохранён` + : 'GitHub token не сохранён'; +} + +async function saveGitHubSettings() { + const username = document.getElementById('githubUsername').value.trim(); + const token = document.getElementById('githubToken').value.trim(); + + if (!username) { + appendLog('Укажите GitHub username'); + return; + } + + if (!token) { + appendLog('Укажите GitHub token'); + return; + } + + const data = await workspaceApi('/api/settings/github', { + username, + token + }); + + if (data.success) { + document.getElementById('githubToken').value = ''; + appendLog('GitHub доступ сохранён'); + await loadSystemStatus(); + } +} + async function loadRuntimeCommands() { const container = document.getElementById('runtimeButtons'); @@ -79,7 +129,7 @@ async function runRuntimeCommand(command) { appendLog(data.success ? `Команда выполнена: ${data.label}` - : `Ошибка runtime команды: ${data.label}` + : `Ошибка runtime команды: ${data.label || command}` ); } @@ -159,7 +209,7 @@ function openProject(workspace) { } async function registerCurrentProject(repoUrl, workspace, stack = 'unknown') { - const name = repoUrl.split('/').pop(); + const name = repoUrl.split('/').pop().replace('.git', ''); await workspaceApi('/api/projects/register', { name, @@ -176,6 +226,11 @@ async function registerCurrentProject(repoUrl, workspace, stack = 'unknown') { async function loadWorkspaceTree() { const workspace = document.getElementById('workspacePath').value; + if (!workspace) { + appendLog('Workspace path пустой'); + return; + } + appendLog(`Загрузка workspace: ${workspace}`); const data = await workspaceApi('/api/files/tree', { @@ -278,6 +333,7 @@ async function loadDevices() { } window.addEventListener('load', () => { + loadSystemStatus(); loadDevices(); loadProjects(); loadRuntimeCommands();