From 36b21f71bc848a5de6f676743eb0692dc78a5f57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80?= <78488229+viktor138irk@users.noreply.github.com> Date: Mon, 11 May 2026 23:56:48 +0900 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20ru?= =?UTF-8?q?ntime-=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B8=20=D0=B8=20Android?= =?UTF-8?q?=20runtime=20UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/workspace.js | 110 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 109 insertions(+), 1 deletion(-) diff --git a/frontend/workspace.js b/frontend/workspace.js index d4734be..cef6308 100644 --- a/frontend/workspace.js +++ b/frontend/workspace.js @@ -25,6 +25,105 @@ async function workspaceApi(url, payload = {}, method = 'POST') { return await response.json(); } +function getSelectedDevice() { + const select = document.getElementById('deviceSelect'); + + if (!select) { + return null; + } + + return select.value || null; +} + +async function loadRuntimeCommands() { + const container = document.getElementById('runtimeButtons'); + + if (!container) { + return; + } + + const data = await workspaceApi('/api/runtime/commands', {}, 'GET'); + + const commands = data.commands || []; + + container.innerHTML = commands.map(command => ` + + `).join(''); +} + +async function runRuntimeCommand(command) { + const workspace = document.getElementById('workspacePath').value; + + if (!workspace) { + appendLog('Workspace не выбран'); + return; + } + + appendLog(`Запуск runtime команды: ${command}`); + + const data = await workspaceApi('/api/runtime/command', { + workspace, + command, + device: getSelectedDevice() + }); + + if (data.result?.stdout) { + appendLog(data.result.stdout); + } + + if (data.result?.stderr) { + appendLog(data.result.stderr); + } + + appendLog(data.success + ? `Команда выполнена: ${data.label}` + : `Ошибка runtime команды: ${data.label}` + ); +} + +async function installLatestApk() { + const workspace = document.getElementById('workspacePath').value; + + const data = await workspaceApi('/api/runtime/install-latest-apk', { + workspace, + device: getSelectedDevice() + }); + + if (data.result?.stdout) { + appendLog(data.result.stdout); + } + + if (data.result?.stderr) { + appendLog(data.result.stderr); + } +} + +async function restartCurrentApp() { + const workspace = document.getElementById('workspacePath').value; + const packageName = document.getElementById('packageName').value; + + if (!packageName) { + appendLog('Укажите package name'); + return; + } + + const data = await workspaceApi('/api/runtime/restart-app', { + workspace, + device: getSelectedDevice(), + package_name: packageName + }); + + if (data.result?.stdout) { + appendLog(data.result.stdout); + } + + if (data.result?.stderr) { + appendLog(data.result.stderr); + } +} + async function loadProjects() { const container = document.getElementById('projectsList'); @@ -143,8 +242,9 @@ async function loadDevices() { const data = await workspaceApi('/api/android/devices'); const container = document.getElementById('devices'); + const select = document.getElementById('deviceSelect'); - if (!container) { + if (!container || !select) { return; } @@ -156,6 +256,7 @@ async function loadDevices() { if (devices.length === 0) { container.innerHTML = 'Устройства не подключены'; + select.innerHTML = ''; return; } @@ -168,10 +269,17 @@ async function loadDevices() { `; }).join(''); + + select.innerHTML = devices.map(device => { + const id = device.split(/\s+/)[0]; + + return ``; + }).join(''); } window.addEventListener('load', () => { loadDevices(); loadProjects(); + loadRuntimeCommands(); appendLog('DevConsole workspace runtime готов'); });