/* fn-code.js — создание функции из кода (независимый модуль) */ function onLangChangeCode() { var lang = document.getElementById('cc-lang').value; var t = LANG_TEMPLATES[lang]; if (t) { document.getElementById('cc-entry').value = t.entrypoint; document.getElementById('cc-code').value = t.code; } // Обновляем лейбл поля зависимостей под язык var depsLabels = { python: 'Зависимости (requirements.txt)', nodejs: 'Зависимости (package.json dependencies)', php: 'Зависимости (composer.json)', ruby: 'Зависимости (Gemfile)', }; var depsPlaceholders = { python: 'boto3\nrequests>=2.28\npsycopg2-binary', nodejs: 'express: ^4.18.2\naxios: ^1.6.0', php: '{\n "require": {\n "guzzlehttp/guzzle": "^7.0"\n }\n}', ruby: "gem 'httparty'\ngem 'pg'", }; var label = document.getElementById('cc-deps-label'); var area = document.getElementById('cc-deps'); if (label) label.textContent = depsLabels[lang] || 'Зависимости'; if (area) area.placeholder = depsPlaceholders[lang] || ''; } function openCreateCode() { document.getElementById('cc-lang').value = 'python'; onLangChangeCode(); document.getElementById('cc-name').value = ''; document.getElementById('cc-route').value = ''; document.getElementById('cc-methods').value = 'GET'; document.getElementById('cc-timeout').value = '60'; document.getElementById('cc-deps').value = ''; document.getElementById('cc-schedule-enabled').checked = false; document.getElementById('cc-cron').value = ''; toggleScheduleFields('cc'); var aiRes = document.getElementById('cc-ai-result'); if (aiRes) { aiRes.style.display = 'none'; aiRes.textContent = ''; } hideModalError('cc-error'); document.getElementById('create-code-modal').classList.add('open'); document.getElementById('cc-name').focus(); } function closeCreateCode() { document.getElementById('create-code-modal').classList.remove('open'); } async function submitCreateCode() { const btn = document.getElementById('cc-submit'); btn.disabled = true; const progress = startTimedStatus('Создаём функцию...', 'Создание функции...', explainDelay); try { const name = document.getElementById('cc-name').value.trim(); if (!name) throw new Error('name is required'); const lang = document.getElementById('cc-lang').value.trim(); if (!lang) throw new Error('language is required'); await requestJSON(API_BASE + '/functions', 'POST', { name: name, language: lang, entrypoint: document.getElementById('cc-entry').value.trim(), route: document.getElementById('cc-route').value.trim(), methods: parseMethods(document.getElementById('cc-methods').value), timeout: parseTimeout(document.getElementById('cc-timeout').value), code: document.getElementById('cc-code').value, deps: document.getElementById('cc-deps').value.trim(), }); try { await syncScheduleForFunction(name, 'cc'); } catch (scheduleErr) { try { await requestJSON(API_BASE + '/functions/' + encodeURIComponent(name), 'DELETE'); } catch (rollbackErr) { scheduleErr.message += '; rollback failed: ' + rollbackErr.message; } throw scheduleErr; } closeCreateCode(); progress.stop('Функция создана: ' + name, 'ok'); await reloadAll(); } catch (e) { progress.stop('Ошибка создания: ' + e.message, 'err'); showModalError('cc-error', 'Ошибка: ' + e.message); } finally { btn.disabled = false; } }