/* 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; } } 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-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 = ''; } 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 }); 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'); } finally { btn.disabled = false; } }