diff --git a/ui/suite/partials/vibe.html b/ui/suite/partials/vibe.html index 0f3094b..a78d3a8 100644 --- a/ui/suite/partials/vibe.html +++ b/ui/suite/partials/vibe.html @@ -598,6 +598,433 @@
+ + + @@ -1473,6 +1900,139 @@ }); } + /* ── Deployment Modal Functions ── */ + var selectedDeploymentTarget = "internal"; + + function selectDeploymentTarget(target) { + selectedDeploymentTarget = target; + + // Update visual selection + var internalOption = document.getElementById("deploymentInternal"); + var externalOption = document.getElementById("deploymentExternal"); + var internalConfig = document.getElementById( + "deploymentInternalConfig", + ); + var externalConfig = document.getElementById( + "deploymentExternalConfig", + ); + + if (target === "internal") { + internalOption.style.borderColor = "var(--accent)"; + internalOption.style.background = "rgba(132, 214, 105, 0.06)"; + externalOption.style.borderColor = "var(--border)"; + externalOption.style.background = "transparent"; + internalConfig.style.display = "block"; + externalConfig.style.display = "none"; + } else { + externalOption.style.borderColor = "var(--accent)"; + externalOption.style.background = "rgba(132, 214, 105, 0.06)"; + internalOption.style.borderColor = "var(--border)"; + internalOption.style.background = "transparent"; + internalConfig.style.display = "none"; + externalConfig.style.display = "block"; + } + } + + function showDeploymentModal() { + var modal = document.getElementById("vibeDeploymentModal"); + if (modal) { + modal.style.display = "block"; + selectDeploymentTarget("internal"); + } + } + + function closeDeploymentModal() { + var modal = document.getElementById("vibeDeploymentModal"); + if (modal) { + modal.style.display = "none"; + } + } + + function executeDeployment() { + var deployButton = document.getElementById("deployButton"); + if (deployButton) { + deployButton.textContent = "Deploying..."; + deployButton.disabled = true; + } + + if (selectedDeploymentTarget === "internal") { + var route = + document.getElementById("deployRoute").value || "my-app"; + var sharedResources = document.getElementById( + "deploySharedResources", + ).checked; + + vibeAddMsg( + "system", + "🚀 Deploying to GB Platform at /apps/" + route + "/...", + ); + + // Simulate deployment (in real implementation, this would call the backend API) + setTimeout(function () { + closeDeploymentModal(); + vibeAddMsg( + "system", + "✅ App deployed successfully to /apps/" + route + "/", + ); + + // Show preview + var previewUrl = document.getElementById("vibePreviewUrl"); + var previewPanel = document.getElementById("vibePreview"); + if (previewUrl && previewPanel) { + previewUrl.value = + window.location.origin + "/apps/" + route + "/"; + previewPanel.style.display = "block"; + } + + if (deployButton) { + deployButton.textContent = "Deploy Now"; + deployButton.disabled = false; + } + }, 2000); + } else { + var repoName = + document.getElementById("deployRepoName").value || "my-app"; + var customDomain = + document.getElementById("deployCustomDomain").value; + var ciCd = document.getElementById("deployCiCd").checked; + var appType = document.getElementById("deployAppType").value; + + vibeAddMsg( + "system", + "🌐 Creating Forgejo repository: " + repoName, + ); + + // Simulate deployment (in real implementation, this would call the backend API) + setTimeout(function () { + closeDeploymentModal(); + var message = + "✅ Repository created and deployed to Forgejo"; + if (customDomain) { + message += " (custom domain: " + customDomain + ")"; + } + vibeAddMsg("system", message); + + if (deployButton) { + deployButton.textContent = "Deploy Now"; + deployButton.disabled = false; + } + }, 3000); + } + } + + // Update route preview in real-time + if (document.readyState !== "loading") { + var routeInput = document.getElementById("deployRoute"); + if (routeInput) { + routeInput.addEventListener("input", function () { + var preview = document.getElementById("deployRoutePreview"); + if (preview) { + preview.textContent = this.value || "my-app"; + } + }); + } + } + if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", initVibe); } else {