Korjattu projektikortin JSON-parsintavirhe: tiedostot globaaliin muuttujaan
Koodin sisältämät lainausmerkit ja erikoismerkit rikkoivat data-files HTML-attribuutin. Nyt tiedostot tallennetaan window._projectFiles[id]:hen ja onclick-handlerit viittaavat siihen suoraan. Ei JSON DOM:ssa. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -491,18 +491,49 @@ import AgentBar from "../components/AgentBar.astro";
|
|||||||
}
|
}
|
||||||
|
|
||||||
// === Project card ===
|
// === Project card ===
|
||||||
|
window._projectFiles = {}; // id → files
|
||||||
|
|
||||||
function renderProjectCard(files, name) {
|
function renderProjectCard(files, name) {
|
||||||
const entries = Object.entries(files);
|
const entries = Object.entries(files);
|
||||||
if (!entries.length) return;
|
if (!entries.length) return;
|
||||||
const id = 'proj-' + Date.now();
|
const id = 'proj-' + Date.now();
|
||||||
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('');
|
window._projectFiles[id] = files;
|
||||||
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="navigator.clipboard.writeText(JSON.parse(document.getElementById('${id}').dataset.files)['${n}'])">Kopioi</button></div><pre class="code-block">${highlightCode(c)}</pre></div>`).join('');
|
|
||||||
const html = `<div id="${id}" class="project-card" data-files='${esc(JSON.stringify(files))}'><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="navigator.clipboard.writeText(Object.entries(JSON.parse(document.getElementById('${id}').dataset.files)).map(([n,c])=>'# --- '+n+' ---\\n'+c).join('\\n\\n'))">Kopioi kaikki</button><button class="btn btn-green" onclick="openInEditor(JSON.parse(document.getElementById('${id}').dataset.files))">Avaa editorissa</button></span></div><div class="project-tabs">${tabs}</div>${panels}</div>`;
|
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-green" onclick="openInEditor(window._projectFiles['${id}'])">Avaa editorissa</button>` +
|
||||||
|
`</span></div>` +
|
||||||
|
`<div class="project-tabs">${tabs}</div>${panels}</div>`;
|
||||||
|
|
||||||
const div = document.createElement('div');
|
const div = document.createElement('div');
|
||||||
div.innerHTML = html;
|
div.innerHTML = html;
|
||||||
termPanel.appendChild(div.firstElementChild);
|
termPanel.appendChild(div.firstElementChild);
|
||||||
termPanel.scrollTop = termPanel.scrollHeight;
|
termPanel.scrollTop = termPanel.scrollHeight;
|
||||||
}
|
}
|
||||||
|
window.copyProjectFile = function(id, name) {
|
||||||
|
const files = window._projectFiles[id];
|
||||||
|
if (files && files[name]) navigator.clipboard.writeText(files[name]);
|
||||||
|
};
|
||||||
|
window.copyAllProjectFiles = function(id) {
|
||||||
|
const files = window._projectFiles[id];
|
||||||
|
if (!files) return;
|
||||||
|
const text = Object.entries(files).map(([n,c]) => '# --- ' + n + ' ---\n' + c).join('\n\n');
|
||||||
|
navigator.clipboard.writeText(text);
|
||||||
|
};
|
||||||
window.switchProjTab = function(id,i) {
|
window.switchProjTab = function(id,i) {
|
||||||
document.querySelectorAll(`.project-tab[data-card="${id}"]`).forEach((t,j) => t.classList.toggle('active', j===i));
|
document.querySelectorAll(`.project-tab[data-card="${id}"]`).forEach((t,j) => t.classList.toggle('active', j===i));
|
||||||
document.querySelectorAll(`.proj-panel[data-card="${id}"]`).forEach((p,j) => p.style.display = j===i ? '' : 'none');
|
document.querySelectorAll(`.proj-panel[data-card="${id}"]`).forEach((p,j) => p.style.display = j===i ? '' : 'none');
|
||||||
|
|||||||
Reference in New Issue
Block a user