feat: light/dark theme toggle, export/import config, and UI modernization
- Add light/dark mode toggle with localStorage persistence - Oracle-branded dark mode: deep backgrounds, vibrant status colors - Original light mode preserved as default - All hardcoded colors replaced with CSS custom properties - Add full config export/import (OCI creds+keys, GenAI, MCP, prompts, settings) - Add Terraform inline prompt editor with auto-save - Add ADB Update Network Access and ACL display in Explorer - Add auto-refresh after Start/Stop resource actions - Update README with new features
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
<title>OCI CIS AI Agent</title>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
|
||||
<style>
|
||||
:root {
|
||||
:root,html.light {
|
||||
--bg:#f4f2ef;--bg1:#ffffff;--bg2:#faf9f7;--bg3:#efeee9;--bg4:#e5e3dd;
|
||||
--bd:#ddd9d2;--bdf:#c5c0b8;
|
||||
--t1:#1c1917;--t2:#44403c;--t3:#78716c;--t4:#a8a29e;
|
||||
@@ -22,13 +22,31 @@
|
||||
--sh2:0 4px 6px -1px rgba(28,25,23,.05),0 2px 4px -2px rgba(28,25,23,.04);
|
||||
--sh3:0 10px 15px -3px rgba(28,25,23,.06),0 4px 6px -4px rgba(28,25,23,.04);
|
||||
--shh:0 20px 25px -5px rgba(28,25,23,.08),0 8px 10px -6px rgba(28,25,23,.04);
|
||||
--tb-bg:rgba(255,255,255,.8);
|
||||
--fm:'JetBrains Mono',monospace;
|
||||
--fs:'Plus Jakarta Sans',-apple-system,system-ui,sans-serif;
|
||||
--trans:cubic-bezier(.22,1,.36,1)
|
||||
}
|
||||
html.dark {
|
||||
--bg:#0d0f14;--bg1:#151820;--bg2:#1a1e28;--bg3:#222733;--bg4:#2a3040;
|
||||
--bd:#2a3040;--bdf:#3a4258;
|
||||
--t1:#f0f0f4;--t2:#c8cad0;--t3:#8b8fa3;--t4:#5a5e6e;
|
||||
--ac:#c74634;--ach:#d9523f;--acd:#a83428;--acl:rgba(199,70,52,.1);--acl2:rgba(199,70,52,.16);
|
||||
--gn:#34c759;--gnl:rgba(52,199,89,.1);--rd:#ff453a;--rdl:rgba(255,69,58,.1);
|
||||
--bl:#0a84ff;--bll:rgba(10,132,255,.1);--yl:#ffd60a;--yll:rgba(255,214,10,.1);
|
||||
--pp:#bf5af2;--ppl:rgba(191,90,242,.1);
|
||||
--ok:#34c759;--w:#ffd60a;--err:#ff453a;
|
||||
--tx2:#8b8fa3;--p:#f0f0f4;--pl:rgba(199,70,52,.1);
|
||||
--b2:#2a3040;--b3:#3a4258;
|
||||
--sh1:0 1px 3px rgba(0,0,0,.3),0 1px 2px rgba(0,0,0,.2);
|
||||
--sh2:0 4px 8px rgba(0,0,0,.3),0 2px 4px rgba(0,0,0,.2);
|
||||
--sh3:0 10px 20px rgba(0,0,0,.35),0 4px 8px rgba(0,0,0,.2);
|
||||
--shh:0 20px 30px rgba(0,0,0,.4),0 8px 12px rgba(0,0,0,.25);
|
||||
--tb-bg:rgba(21,24,32,.85);
|
||||
}
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{font-family:var(--fs);background:var(--bg);color:var(--t1);height:100vh;overflow:hidden;-webkit-font-smoothing:antialiased}
|
||||
::selection{background:rgba(199,70,52,.15);color:var(--t1)}
|
||||
::selection{background:rgba(199,70,52,.2);color:var(--t1)}
|
||||
|
||||
/* ── Sidebar ── */
|
||||
.app{display:flex;height:100vh;overflow:hidden}
|
||||
@@ -58,7 +76,7 @@ body{font-family:var(--fs);background:var(--bg);color:var(--t1);height:100vh;ove
|
||||
|
||||
/* ── Main Content ── */
|
||||
.mc{flex:1;margin-left:260px;height:100vh;overflow:hidden;display:flex;flex-direction:column}
|
||||
.tb{height:56px;background:rgba(255,255,255,.8);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);
|
||||
.tb{height:56px;background:var(--tb-bg);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);
|
||||
border-bottom:1px solid var(--bd);display:flex;align-items:center;justify-content:space-between;padding:0 1.5rem;position:sticky;top:0;z-index:50}
|
||||
.tb-t{font-weight:700;font-size:.92rem;color:var(--t1);letter-spacing:-.01em}
|
||||
.tb-a{display:flex;align-items:center;gap:.6rem}
|
||||
@@ -170,7 +188,7 @@ tbody tr:last-child td{border-bottom:none}
|
||||
.cm-user .cb strong{color:#ffe0db}
|
||||
.cb{max-width:72%;padding:.7rem .95rem;border-radius:var(--rl) var(--rl) var(--rl) 6px;background:var(--bg1);font-size:.82rem;
|
||||
line-height:1.6;border:1px solid var(--bd);white-space:pre-wrap;box-shadow:var(--sh1)}
|
||||
.cm-ts{font-size:.65rem;color:#999;margin-top:3px;opacity:.7}
|
||||
.cm-ts{font-size:.65rem;color:var(--t4);margin-top:3px;opacity:.7}
|
||||
.cb code{font-family:var(--fm);font-size:.73rem;background:var(--bg3);padding:.12rem .3rem;border-radius:5px}
|
||||
.cb strong{color:var(--ac)}
|
||||
.ch-i{display:flex;gap:.45rem;padding:.7rem .85rem;background:var(--bg1);border-top:1px solid var(--bd);box-shadow:0 -2px 8px rgba(0,0,0,.02)}
|
||||
@@ -178,15 +196,15 @@ tbody tr:last-child td{border-bottom:none}
|
||||
.ch-i .btn{border-radius:10px}
|
||||
|
||||
/* ── Report ── */
|
||||
.rif{width:100%;height:calc(100vh - 56px - 6rem);border:1px solid var(--bd);border-radius:var(--rl);background:#fff;box-shadow:var(--sh2)}
|
||||
.rif{width:100%;height:calc(100vh - 56px - 6rem);border:1px solid var(--bd);border-radius:var(--rl);background:var(--bg1);box-shadow:var(--sh2)}
|
||||
|
||||
/* ── Login ── */
|
||||
.lp{min-height:100vh;display:flex;align-items:center;justify-content:center;
|
||||
background:var(--bg);position:relative;overflow:hidden}
|
||||
.lp::before{content:'';position:absolute;top:-30%;right:-15%;width:600px;height:600px;
|
||||
background:radial-gradient(circle,rgba(199,70,52,.06) 0%,transparent 70%);border-radius:50%;pointer-events:none}
|
||||
background:radial-gradient(circle,rgba(199,70,52,.12) 0%,transparent 70%);border-radius:50%;pointer-events:none}
|
||||
.lp::after{content:'';position:absolute;bottom:-20%;left:-10%;width:500px;height:500px;
|
||||
background:radial-gradient(circle,rgba(199,70,52,.04) 0%,transparent 70%);border-radius:50%;pointer-events:none}
|
||||
background:radial-gradient(circle,rgba(199,70,52,.08) 0%,transparent 70%);border-radius:50%;pointer-events:none}
|
||||
.lc{background:var(--bg1);border:1px solid var(--bd);border-radius:var(--rr);padding:2.5rem;width:100%;max-width:380px;
|
||||
box-shadow:var(--sh3);position:relative;z-index:1;animation:lcIn .5s var(--trans)}
|
||||
@keyframes lcIn{from{opacity:0;transform:translateY(16px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}
|
||||
@@ -269,44 +287,44 @@ tbody tr:last-child td{border-bottom:none}
|
||||
.tf-input{display:flex;gap:.5rem;padding:.5rem .7rem;border-top:1px solid var(--bd)}
|
||||
.tf-input textarea,.tf-input input{flex:1;font-family:inherit;font-size:inherit;line-height:1.4;padding:.45rem .65rem;border:1.5px solid var(--bd);border-radius:10px;background:var(--bg2);min-height:36px;max-height:200px}
|
||||
.tf-resize{height:5px;cursor:row-resize;background:var(--bd);transition:background .15s;position:relative;flex-shrink:0}
|
||||
.tf-resize:hover,.tf-resize.dragging{background:#7b42bc;opacity:.7}
|
||||
.tf-resize:hover,.tf-resize.dragging{background:var(--pp);opacity:.7}
|
||||
.tf-resize::after{content:'';position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:28px;height:3px;border-top:1px solid var(--t4);border-bottom:1px solid var(--t4);opacity:.4}
|
||||
.tf-resize:hover::after{border-color:#7b42bc;opacity:.8}
|
||||
.tf-resize:hover::after{border-color:var(--pp);opacity:.8}
|
||||
.tf-bottom{flex:1;display:flex;flex-direction:column;overflow:hidden;border-top:1px solid var(--bd);background:var(--bg1);min-height:0}
|
||||
.tf-bottom-tabs{display:flex;align-items:center;gap:0;border-bottom:1px solid var(--bd);background:var(--bg);padding:0 .5rem}
|
||||
.tf-btab{padding:.4rem .75rem;font-size:.72rem;font-weight:600;cursor:pointer;border-bottom:2px solid transparent;color:var(--t3);display:flex;align-items:center;gap:.3rem;transition:all .15s}
|
||||
.tf-btab:hover{color:var(--t1)}
|
||||
.tf-btab.active{color:#7b42bc;border-bottom-color:#7b42bc}
|
||||
.tf-btab.active{color:var(--pp);border-bottom-color:var(--pp)}
|
||||
.tf-btab svg{width:14px;height:14px}
|
||||
.tf-bottom-actions{margin-left:auto;display:flex;align-items:center;gap:.4rem;padding-right:.3rem}
|
||||
.tf-bottom-content{flex:1;overflow:hidden;display:flex;flex-direction:row}
|
||||
.tf-bc-left{flex:1;overflow:auto;padding:.5rem .7rem;min-width:0}
|
||||
.tf-bc-right{width:50%;overflow:auto;border-left:1px solid var(--bd);flex-shrink:0;display:flex;flex-direction:column}
|
||||
.tf-bc-right .tf-term-hdr{padding:.3rem .6rem;font-size:.68rem;font-weight:700;color:#cdd6f4;background:#12122a;border-bottom:1px solid #2a2a4a;display:flex;align-items:center;gap:.4rem}
|
||||
.tf-bc-right .tf-term-hdr svg{width:12px;height:12px;fill:#cdd6f4}
|
||||
.tf-bc-right .tf-term-body{flex:1;overflow:auto;background:#1a1a2e;padding:.5rem;font-family:var(--fm);font-size:.68rem;line-height:1.5;color:#cdd6f4;white-space:pre-wrap;word-break:break-word}
|
||||
.tf-bc-right .tf-term-hdr{padding:.3rem .6rem;font-size:.68rem;font-weight:700;color:var(--t2);background:var(--bg);border-bottom:1px solid var(--bd);display:flex;align-items:center;gap:.4rem}
|
||||
.tf-bc-right .tf-term-hdr svg{width:12px;height:12px;fill:var(--t2)}
|
||||
.tf-bc-right .tf-term-body{flex:1;overflow:auto;background:var(--bg);padding:.5rem;font-family:var(--fm);font-size:.68rem;line-height:1.5;color:var(--t2);white-space:pre-wrap;word-break:break-word}
|
||||
.tf-file{display:flex;align-items:center;gap:.5rem;padding:.45rem .6rem;border-radius:8px;border:1px solid var(--bd);margin-bottom:.4rem;background:var(--bg);transition:border-color .15s;cursor:pointer}
|
||||
.tf-file:hover{border-color:#7b42bc}
|
||||
.tf-file.editing{border-color:#7b42bc;background:#7b42bc08}
|
||||
.tf-editor{border:1px solid #e2ddf5;border-radius:var(--r);overflow:hidden;margin-bottom:.5rem;background:#f8f6ff}
|
||||
.tf-editor-hdr{display:flex;align-items:center;gap:.4rem;padding:.35rem .6rem;background:#efe9fc;border-bottom:1px solid #e2ddf5;font-size:.7rem;font-weight:600;color:#4a3875}
|
||||
.tf-file:hover{border-color:var(--pp)}
|
||||
.tf-file.editing{border-color:var(--pp);background:rgba(191,90,242,.06)}
|
||||
.tf-editor{border:1px solid var(--bd);border-radius:var(--r);overflow:hidden;margin-bottom:.5rem;background:var(--bg2)}
|
||||
.tf-editor-hdr{display:flex;align-items:center;gap:.4rem;padding:.35rem .6rem;background:var(--bg3);border-bottom:1px solid var(--bd);font-size:.7rem;font-weight:600;color:var(--pp)}
|
||||
.tf-editor-hdr .tf-ed-name{flex:1;font-family:var(--fm)}
|
||||
.tf-editor-hdr .btn{font-size:.62rem;padding:2px 8px}
|
||||
.tf-editor-ta{width:100%;min-height:120px;max-height:400px;border:none;outline:none;resize:vertical;font-family:var(--fm);font-size:.72rem;line-height:1.6;color:#3b2e58;background:#f8f6ff;padding:.6rem .7rem;box-sizing:border-box;tab-size:2}
|
||||
.tf-file-icon{width:32px;height:32px;border-radius:6px;background:linear-gradient(135deg,#7b42bc22,#5c4ee522);display:flex;align-items:center;justify-content:center;flex-shrink:0}
|
||||
.tf-file-icon svg{width:16px;height:16px;fill:#7b42bc}
|
||||
.tf-editor-ta{width:100%;min-height:120px;max-height:400px;border:none;outline:none;resize:vertical;font-family:var(--fm);font-size:.72rem;line-height:1.6;color:var(--t1);background:var(--bg2);padding:.6rem .7rem;box-sizing:border-box;tab-size:2}
|
||||
.tf-file-icon{width:32px;height:32px;border-radius:6px;background:linear-gradient(135deg,rgba(191,90,242,.15),rgba(191,90,242,.08));display:flex;align-items:center;justify-content:center;flex-shrink:0}
|
||||
.tf-file-icon svg{width:16px;height:16px;fill:var(--pp)}
|
||||
.tf-file-info{flex:1;min-width:0}
|
||||
.tf-file-name{font-size:.76rem;font-weight:600;font-family:var(--fm);color:var(--t1)}
|
||||
.tf-file-meta{font-size:.64rem;color:var(--t3)}
|
||||
.tf-file-actions{display:flex;gap:.3rem}
|
||||
.tf-file-btn{width:26px;height:26px;border-radius:6px;border:1px solid var(--bd);background:var(--bg);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:.7rem;transition:all .15s}
|
||||
.tf-file-btn:hover{border-color:#7b42bc;background:#7b42bc11}
|
||||
.tf-code-block{background:#f8f6ff;border:1px solid #e2ddf5;border-radius:var(--r);overflow:hidden;margin:.6rem 0}
|
||||
.tf-code-header{display:flex;align-items:center;gap:.4rem;padding:.4rem .7rem;background:#efe9fc;font-size:.72rem;color:#4a3875;border-bottom:1px solid #e2ddf5}
|
||||
.tf-file-btn:hover{border-color:var(--pp);background:rgba(191,90,242,.07)}
|
||||
.tf-code-block{background:var(--bg2);border:1px solid var(--bd);border-radius:var(--r);overflow:hidden;margin:.6rem 0}
|
||||
.tf-code-header{display:flex;align-items:center;gap:.4rem;padding:.4rem .7rem;background:var(--bg3);font-size:.72rem;color:var(--pp);border-bottom:1px solid var(--bd)}
|
||||
.tf-code-header span{flex:1;font-weight:600}
|
||||
.tf-code-header .btn{color:#7b42bc;border-color:#d4c8ef;background:transparent;font-size:.66rem;padding:2px 8px}
|
||||
.tf-code-header .btn:hover{background:#e2ddf5}
|
||||
.tf-pre{padding:.85rem;overflow-x:auto;font-size:.74rem;line-height:1.6;color:#3b2e58;font-family:var(--fm);margin:0;white-space:pre}
|
||||
.tf-code-header .btn{color:var(--pp);border-color:var(--bd);background:transparent;font-size:.66rem;padding:2px 8px}
|
||||
.tf-code-header .btn:hover{background:var(--bg4)}
|
||||
.tf-pre{padding:.85rem;overflow-x:auto;font-size:.74rem;line-height:1.6;color:var(--t2);font-family:var(--fm);margin:0;white-space:pre}
|
||||
.tf-plan-block{background:var(--gnl);border:1px solid rgba(22,163,74,.15);border-radius:var(--r);margin:.6rem 0;overflow:hidden}
|
||||
.tf-plan-header{padding:.45rem .7rem;font-weight:700;font-size:.76rem;color:var(--gn);border-bottom:1px solid rgba(22,163,74,.12)}
|
||||
.tf-plan-list{padding:.4rem .7rem}
|
||||
@@ -315,7 +333,7 @@ tbody tr:last-child td{border-bottom:none}
|
||||
.tf-plan-type{font-family:var(--fm);font-weight:600;color:var(--t1)}
|
||||
.tf-plan-desc{color:var(--t3);font-size:.68rem}
|
||||
.tf-badge{font-size:.58rem;padding:1px 6px;border-radius:10px;font-weight:700;display:inline-flex;align-items:center;gap:3px}
|
||||
.tf-badge-draft{background:#7b42bc18;color:#7b42bc}
|
||||
.tf-badge-draft{background:rgba(191,90,242,.15);color:var(--pp)}
|
||||
.tf-badge-ok{background:var(--gnl);color:var(--gn)}
|
||||
.tf-badge-run{background:var(--bll);color:var(--bl)}
|
||||
.tf-badge-err{background:var(--rdl);color:var(--rd)}
|
||||
@@ -346,6 +364,9 @@ tbody tr:last-child td{border-bottom:none}
|
||||
<div id="app"></div>
|
||||
<script>
|
||||
const V='1.1';
|
||||
// Theme: restore from localStorage, default to light
|
||||
(function(){const t=localStorage.getItem('theme')||'light';document.documentElement.className=t})();
|
||||
function toggleTheme(){const h=document.documentElement;const isDark=h.classList.contains('dark');h.className=isDark?'light':'dark';localStorage.setItem('theme',isDark?'light':'dark');R()}
|
||||
const LOGO_W=`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36" width="26" height="26" style="flex-shrink:0"><rect x="2" y="5" width="32" height="26" rx="13" ry="13" fill="rgba(255,255,255,0.12)" stroke="#fff" stroke-width="2"/><rect x="11" y="11" width="14" height="14" rx="4" fill="#fff" opacity="0.95"/><circle cx="15" cy="17" r="2" fill="#C74634"/><circle cx="21" cy="17" r="2" fill="#C74634"/><circle cx="15" cy="16.7" r="0.7" fill="#fff"/><circle cx="21" cy="16.7" r="0.7" fill="#fff"/><rect x="14" y="21" width="8" height="1.5" rx="0.75" fill="#C74634" opacity="0.6"/><line x1="18" y1="11" x2="18" y2="6" stroke="#fff" stroke-width="1.2" stroke-linecap="round"/><circle cx="18" cy="5.5" r="1.5" fill="#fff" opacity="0.9"/><line x1="11" y1="18" x2="6" y2="18" stroke="#fff" stroke-width="1" stroke-linecap="round" opacity="0.7"/><line x1="25" y1="18" x2="30" y2="18" stroke="#fff" stroke-width="1" stroke-linecap="round" opacity="0.7"/><circle cx="5.5" cy="18" r="1" fill="#fff" opacity="0.7"/><circle cx="30.5" cy="18" r="1" fill="#fff" opacity="0.7"/></svg>`;
|
||||
const LOGO_R=`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36" width="52" height="52"><rect x="2" y="5" width="32" height="26" rx="13" ry="13" fill="rgba(199,70,52,0.08)" stroke="#C74634" stroke-width="1.8"/><rect x="11" y="11" width="14" height="14" rx="4" fill="#fff" stroke="#C74634" stroke-width="0.4"/><circle cx="15" cy="17" r="2" fill="#C74634"/><circle cx="21" cy="17" r="2" fill="#C74634"/><circle cx="15" cy="16.7" r="0.7" fill="#fff"/><circle cx="21" cy="16.7" r="0.7" fill="#fff"/><rect x="14" y="21" width="8" height="1.5" rx="0.75" fill="#C74634" opacity="0.6"/><line x1="18" y1="11" x2="18" y2="6" stroke="#C74634" stroke-width="1.2" stroke-linecap="round"/><circle cx="18" cy="5.5" r="1.5" fill="#C74634" opacity="0.25" stroke="#C74634" stroke-width="0.7"/><line x1="11" y1="18" x2="6" y2="18" stroke="#C74634" stroke-width="1" stroke-linecap="round" opacity="0.4"/><line x1="25" y1="18" x2="30" y2="18" stroke="#C74634" stroke-width="1" stroke-linecap="round" opacity="0.4"/><circle cx="5.5" cy="18" r="1" fill="#C74634" opacity="0.35"/><circle cx="30.5" cy="18" r="1" fill="#C74634" opacity="0.35"/></svg>`;
|
||||
|
||||
@@ -449,6 +470,7 @@ ${ctabs.map(t=>`<div class="ni ${S.tab===t[0]?'on':''}" onclick="switchTab('${t[
|
||||
${S.user?.role==='admin'?`<div class="nl">Administração</div>
|
||||
${atabs.map(t=>`<div class="ni ${S.tab===t[0]?'on':''}" onclick="switchTab('${t[0]}')"><span class="ic">${t[1]}</span>${t[2]}</div>`).join('')}`:''}</div>
|
||||
<div class="sb-f"><div class="ui"><div class="ua">${i}</div><div><div class="un">${S.user?.first_name?S.user.first_name+' '+S.user.last_name:S.user?.username}</div><div class="ur">${S.user?.role}</div></div>
|
||||
<div class="lo-btn" onclick="toggleTheme()" title="Alternar tema">${document.documentElement.classList.contains('dark')?'☀️':'🌙'}</div>
|
||||
<div class="lo-btn" onclick="doLogout()" title="Sair">⏻</div></div></div></div>`}
|
||||
|
||||
function rTb(){const t={'chat':'💬 AI Agent Chat','terraform':TF_IC+' Terraform Agent','explorer':'🔍 OCI Account Explorer','report':'📊 Compliance Reports','downloads':'📁 Downloads','oci-config':'☁️ Credenciais OCI','genai':'🧠 OCI Generative AI','mcp':'🔌 MCP Servers','adb':'🗄️ Autonomous DB Vector','embeddings':'🧬 Embeddings','users':'👥 Gerenciar Usuários','mfa':'🔐 Autenticação MFA','audit':'📋 Audit Log'};
|
||||
@@ -1091,10 +1113,10 @@ function _tfBadge(st){
|
||||
function rTfActions(){
|
||||
if(S.tfRunning)return'<button class="btn bsm" style="background:var(--rd);color:#fff;border-color:var(--rd);font-size:.72rem;padding:4px 12px" onclick="tfCancel()">Cancel</button>';
|
||||
const st=S.tfStatus;let btns='';
|
||||
if(S.tfCode&&(st==='draft'||st==='failed'))btns+=`<button class="btn bsm" style="background:#7b42bc;color:#fff;border-color:#7b42bc;font-size:.72rem;padding:4px 12px;gap:4px;display:inline-flex;align-items:center" onclick="tfSaveAndPlan()">${TF_ICON} Plan</button>`;
|
||||
if(st==='planned'||st==='failed')btns+=`<button class="btn bsm" style="background:#7b42bc;color:#fff;border-color:#7b42bc;font-size:.72rem;padding:4px 12px;gap:4px;display:inline-flex;align-items:center" onclick="tfSaveAndPlan()">${TF_ICON} Re-plan</button>`;
|
||||
if(S.tfCode&&(st==='draft'||st==='failed'))btns+=`<button class="btn bsm" style="background:var(--pp);color:#fff;border-color:var(--pp);font-size:.72rem;padding:4px 12px;gap:4px;display:inline-flex;align-items:center" onclick="tfSaveAndPlan()">${TF_ICON} Plan</button>`;
|
||||
if(st==='planned'||st==='failed')btns+=`<button class="btn bsm" style="background:var(--pp);color:#fff;border-color:var(--pp);font-size:.72rem;padding:4px 12px;gap:4px;display:inline-flex;align-items:center" onclick="tfSaveAndPlan()">${TF_ICON} Re-plan</button>`;
|
||||
if(st==='planned')btns+='<button class="btn bsm" style="background:var(--gn);color:#fff;border-color:var(--gn);font-size:.72rem;padding:4px 12px" onclick="tfApply()">✓ Apply</button>';
|
||||
if(st==='applied')btns+=`<button class="btn bsm" style="background:#7b42bc;color:#fff;border-color:#7b42bc;font-size:.72rem;padding:4px 12px;gap:4px;display:inline-flex;align-items:center" onclick="tfSaveAndPlan()">${TF_ICON} Re-plan</button>`;
|
||||
if(st==='applied')btns+=`<button class="btn bsm" style="background:var(--pp);color:#fff;border-color:var(--pp);font-size:.72rem;padding:4px 12px;gap:4px;display:inline-flex;align-items:center" onclick="tfSaveAndPlan()">${TF_ICON} Re-plan</button>`;
|
||||
if(st==='applied'||st==='planned')btns+='<button class="btn bsm" style="background:var(--rd);color:#fff;border-color:var(--rd);font-size:.72rem;padding:4px 12px" onclick="S.tfConfirmDest=true;R()">✕ Destroy</button>';
|
||||
return btns;
|
||||
}
|
||||
@@ -1149,7 +1171,7 @@ function rTfFiles(){
|
||||
</div>`;
|
||||
if(isEdit){
|
||||
html+=`<div class="tf-editor">
|
||||
<div class="tf-editor-hdr"><svg viewBox="0 0 16 16" width="12" height="12" fill="#7b42bc"><path d="M12.146.854a.5.5 0 01.708 0l2.292 2.292a.5.5 0 010 .708L5.854 13.146a.5.5 0 01-.22.128l-3.5 1.166a.5.5 0 01-.632-.632l1.166-3.5a.5.5 0 01.128-.22z"/></svg><span class="tf-ed-name">${f.name}</span>${f.auto?'<span style="font-size:.58rem;color:var(--t3);font-weight:400">somente leitura</span>':'<button class="btn bs" onclick="tfSaveFile(${i})" style="background:#7b42bc;color:#fff;border-color:#7b42bc;font-size:.6rem;padding:1px 8px">Salvar</button>'}<button class="btn bs" onclick="S.tfEditIdx=-1;R()" style="font-size:.6rem;padding:1px 8px">Fechar</button></div>
|
||||
<div class="tf-editor-hdr"><svg viewBox="0 0 16 16" width="12" height="12" fill="#7b42bc"><path d="M12.146.854a.5.5 0 01.708 0l2.292 2.292a.5.5 0 010 .708L5.854 13.146a.5.5 0 01-.22.128l-3.5 1.166a.5.5 0 01-.632-.632l1.166-3.5a.5.5 0 01.128-.22z"/></svg><span class="tf-ed-name">${f.name}</span>${f.auto?'<span style="font-size:.58rem;color:var(--t3);font-weight:400">somente leitura</span>':'<button class="btn bs" onclick="tfSaveFile(${i})" style="background:var(--pp);color:#fff;border-color:var(--pp);font-size:.6rem;padding:1px 8px">Salvar</button>'}<button class="btn bs" onclick="S.tfEditIdx=-1;R()" style="font-size:.6rem;padding:1px 8px">Fechar</button></div>
|
||||
<textarea class="tf-editor-ta" id="tfEdTa" ${f.auto?'readonly':''}onkeydown="if(event.key==='Tab'){event.preventDefault();const s=this.selectionStart,e=this.selectionEnd;this.value=this.value.substring(0,s)+' '+this.value.substring(e);this.selectionStart=this.selectionEnd=s+2}">${escHtml(f.content||'')}</textarea>
|
||||
</div>`;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user