Добавил runtime-кнопки и Android runtime UI

Этот коммит содержится в:
Виктор
2026-05-11 23:56:48 +09:00
родитель 1be7ae76ea
Коммит 36b21f71bc
+109 -1
Просмотреть файл
@@ -25,6 +25,105 @@ async function workspaceApi(url, payload = {}, method = 'POST') {
return await response.json(); 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 => `
<button onclick="runRuntimeCommand('${command.id}')">
${command.label}
</button>
`).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() { async function loadProjects() {
const container = document.getElementById('projectsList'); const container = document.getElementById('projectsList');
@@ -143,8 +242,9 @@ async function loadDevices() {
const data = await workspaceApi('/api/android/devices'); const data = await workspaceApi('/api/android/devices');
const container = document.getElementById('devices'); const container = document.getElementById('devices');
const select = document.getElementById('deviceSelect');
if (!container) { if (!container || !select) {
return; return;
} }
@@ -156,6 +256,7 @@ async function loadDevices() {
if (devices.length === 0) { if (devices.length === 0) {
container.innerHTML = 'Устройства не подключены'; container.innerHTML = 'Устройства не подключены';
select.innerHTML = '<option value="">Нет устройств</option>';
return; return;
} }
@@ -168,10 +269,17 @@ async function loadDevices() {
</div> </div>
`; `;
}).join(''); }).join('');
select.innerHTML = devices.map(device => {
const id = device.split(/\s+/)[0];
return `<option value="${id}">${id}</option>`;
}).join('');
} }
window.addEventListener('load', () => { window.addEventListener('load', () => {
loadDevices(); loadDevices();
loadProjects(); loadProjects();
loadRuntimeCommands();
appendLog('DevConsole workspace runtime готов'); appendLog('DevConsole workspace runtime готов');
}); });