UI-korjaus korjattu (GTFO gemini)

This commit is contained in:
Jaakko Vanhala
2026-04-12 20:18:39 +03:00
parent 8468724a4c
commit d27068b11a
2 changed files with 12 additions and 39 deletions

View File

@@ -2,7 +2,10 @@
<div id="panel-editor" class="panel"> <div id="panel-editor" class="panel">
<div style="display:flex;flex:1;min-height:0;gap:0;border:1px solid var(--border);border-radius:6px;overflow:hidden"> <div style="display:flex;flex:1;min-height:0;gap:0;border:1px solid var(--border);border-radius:6px;overflow:hidden">
<div id="editor-filetree" style="width:200px;min-width:150px;background:var(--bg);border-right:1px solid var(--border);overflow:auto;resize:horizontal;font-family:'Courier New',monospace;font-size:13px"> <div id="editor-filetree" style="width:200px;min-width:150px;background:var(--bg);border-right:1px solid var(--border);overflow:auto;resize:horizontal;font-family:'Courier New',monospace;font-size:13px">
<div style="padding:10px 12px;color:#8b949e;font-size:11px;text-transform:uppercase;letter-spacing:0.5px;border-bottom:1px solid var(--border)">Tiedostot</div> <div style="padding:10px 12px;color:#8b949e;font-size:11px;display:flex;justify-content:space-between;align-items:center;text-transform:uppercase;letter-spacing:0.5px;border-bottom:1px solid var(--border)">
<span>Tiedostot</span>
<button class="btn btn-green" style="padding:2px 6px;font-size:10px" onclick="downloadProjectZip()">.ZIP</button>
</div>
<div id="editor-file-list" style="padding:4px 0"> <div id="editor-file-list" style="padding:4px 0">
<div style="padding:8px 16px;color:#8b949e;font-size:12px">Generoi projekti:<br><code style="color:var(--accent)">kpn project "..."</code></div> <div style="padding:8px 16px;color:#8b949e;font-size:12px">Generoi projekti:<br><code style="color:var(--accent)">kpn project "..."</code></div>
</div> </div>

View File

@@ -1430,7 +1430,9 @@ Blog → Author: name,email,bio(Text|None) / Post: title, content(Text), author_
// Oppimispolku // Oppimispolku
renderLearnView(promptLog); renderLearnView(promptLog);
renderProjectCard(files, task); termLog(`\n<span style="color:#8b949e">Siirretään tiedostot Editoriin...</span>`);
window._currentProjectName = task;
setTimeout(() => window.openInEditor(files), 1000);
} }
async function kpnPipelineSimple(task) { async function kpnPipelineSimple(task) {
@@ -1456,41 +1458,7 @@ Blog → Author: name,email,bio(Text|None) / Post: title, content(Text), author_
termLog(`\n<span style="color:var(--purple);font-weight:bold">━━━ Done ━━━</span>`); termLog(`\n<span style="color:var(--purple);font-weight:bold">━━━ Done ━━━</span>`);
} }
// === Project card === // === Poistettiin renderProjectCard ja siirryttiin suoraan Editorin käyttöön ===
window._projectFiles = {}; // id → files
function renderProjectCard(files, name) {
const entries = Object.entries(files);
if (!entries.length) return;
const id = 'proj-' + Date.now();
window._projectFiles[id] = files;
const tabs = entries.map(([n],i) =>
`<div class="project-tab${i===0?' active':''}" data-card="${id}" data-i="${i}" onclick="switchProjTab('${id}',${i})">${esc(n)}</div>`
).join('');
const panels = entries.map(([n,c],i) =>
`<div class="proj-panel" data-card="${id}" data-i="${i}" style="${i>0?'display:none':''}">` +
`<div style="text-align:right;padding:4px 8px;background:var(--bg);border-bottom:1px solid #21262d">` +
`<button class="btn btn-muted" onclick="copyProjectFile('${id}','${esc(n)}')">Kopioi</button></div>` +
`<pre class="code-block">${highlightCode(c)}</pre></div>`
).join('');
const html = `<div id="${id}" class="project-card">` +
`<div class="project-header">` +
`<span style="color:var(--purple);font-weight:600">${esc(name||'Projekti')} <span style="color:#8b949e;font-weight:normal">(${entries.length})</span></span>` +
`<span style="display:flex;gap:6px">` +
`<button class="btn btn-muted" onclick="copyAllProjectFiles('${id}')">Kopioi kaikki</button>` +
`<button class="btn btn-muted" onclick="downloadProjectZip('${id}','${esc(name||'projekti')}')">Lataa .zip</button>` +
`<button class="btn btn-green" onclick="openInEditor(window._projectFiles['${id}'])">Avaa editorissa</button>` +
`</span></div>` +
`<div class="project-tabs">${tabs}</div>${panels}</div>`;
const div = document.createElement('div');
div.innerHTML = html;
termPanel.appendChild(div.firstElementChild);
termPanel.scrollTop = termPanel.scrollHeight;
}
window.copyProjectFile = function(id, name) { window.copyProjectFile = function(id, name) {
const files = window._projectFiles[id]; const files = window._projectFiles[id];
if (files && files[name]) navigator.clipboard.writeText(files[name]); if (files && files[name]) navigator.clipboard.writeText(files[name]);
@@ -1501,8 +1469,9 @@ Blog → Author: name,email,bio(Text|None) / Post: title, content(Text), author_
const text = Object.entries(files).map(([n,c]) => '# --- ' + n + ' ---\n' + c).join('\n\n'); const text = Object.entries(files).map(([n,c]) => '# --- ' + n + ' ---\n' + c).join('\n\n');
navigator.clipboard.writeText(text); navigator.clipboard.writeText(text);
}; };
window.downloadProjectZip = function(id, name) { window.downloadProjectZip = function() {
const files = window._projectFiles[id]; const files = window._currentEditorFiles;
const name = window._currentProjectName || 'projekti';
if (!files) return; if (!files) return;
const enc = new TextEncoder(); const enc = new TextEncoder();
const entries = Object.entries(files); const entries = Object.entries(files);
@@ -1618,6 +1587,7 @@ Blog → Author: name,email,bio(Text|None) / Post: title, content(Text), author_
const langMap = {py:'python',rs:'rust',js:'javascript',ts:'typescript',toml:'toml',json:'json',html:'html',css:'css',md:'markdown',txt:'plaintext'}; const langMap = {py:'python',rs:'rust',js:'javascript',ts:'typescript',toml:'toml',json:'json',html:'html',css:'css',md:'markdown',txt:'plaintext'};
window.openInEditor = async function(files) { window.openInEditor = async function(files) {
window._currentEditorFiles = files;
switchTab('editor'); switchTab('editor');
try { await initMonaco(); } catch(e) { console.error('Monaco-virhe:', e); return; } try { await initMonaco(); } catch(e) { console.error('Monaco-virhe:', e); return; }
const m = window.monaco; const m = window.monaco;