ZIP-lataus korjattu: tiedostot globaaliin muuttujaan data-attribuutin sijaan

JSON data-attribuutissa heittomerkit katkaisivat HTML:n.
Nyt projectFiles[cardId] tallentaa tiedostot muistiin.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-07 06:00:17 +03:00
parent 959dc532bb
commit ed02e47158

View File

@@ -1905,11 +1905,15 @@
} }
// Projektikortti: tiedostovälilehdet + kopioi + lataa ZIP // Projektikortti: tiedostovälilehdet + kopioi + lataa ZIP
// Globaali storage projektikorttien tiedostoille (välttää JSON data-attribuuttien ongelmat)
const projectFiles = {};
function renderProjectCard(files, projectName) { function renderProjectCard(files, projectName) {
const fileEntries = Object.entries(files); const fileEntries = Object.entries(files);
if (fileEntries.length === 0) return; if (fileEntries.length === 0) return;
const cardId = 'proj-' + Date.now(); const cardId = 'proj-' + Date.now();
projectFiles[cardId] = files;
const tabsHtml = fileEntries.map(([name], i) => const tabsHtml = fileEntries.map(([name], i) =>
`<span class="proj-tab" data-card="${cardId}" data-idx="${i}" style="padding:4px 10px;cursor:pointer;border-radius:4px 4px 0 0;font-size:12px;${i === 0 ? 'background:#161b22;color:#58a6ff;border:1px solid #30363d;border-bottom:none' : 'color:#8b949e'}" onclick="switchProjectTab('${cardId}',${i})">${esc(name)}</span>` `<span class="proj-tab" data-card="${cardId}" data-idx="${i}" style="padding:4px 10px;cursor:pointer;border-radius:4px 4px 0 0;font-size:12px;${i === 0 ? 'background:#161b22;color:#58a6ff;border:1px solid #30363d;border-bottom:none' : 'color:#8b949e'}" onclick="switchProjectTab('${cardId}',${i})">${esc(name)}</span>`
).join(''); ).join('');
@@ -1926,7 +1930,7 @@
const allText = fileEntries.map(([name, code]) => `# --- ${name} ---\n${code}`).join('\n\n'); const allText = fileEntries.map(([name, code]) => `# --- ${name} ---\n${code}`).join('\n\n');
const cardHtml = ` const cardHtml = `
<div id="${cardId}" style="margin:8px 0;border:1px solid #30363d;border-radius:6px;background:#161b22;overflow:hidden" data-files='${esc(JSON.stringify(files))}'> <div id="${cardId}" style="margin:8px 0;border:1px solid #30363d;border-radius:6px;background:#161b22;overflow:hidden">
<div style="display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:#0d1117;border-bottom:1px solid #30363d"> <div style="display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:#0d1117;border-bottom:1px solid #30363d">
<span style="color:#a371f7;font-weight:600;font-size:13px">${esc(projectName || 'Projekti')} <span style="color:#8b949e;font-weight:normal">(${fileEntries.length} tiedostoa)</span></span> <span style="color:#a371f7;font-weight:600;font-size:13px">${esc(projectName || 'Projekti')} <span style="color:#8b949e;font-weight:normal">(${fileEntries.length} tiedostoa)</span></span>
<span style="display:flex;gap:6px"> <span style="display:flex;gap:6px">
@@ -1960,7 +1964,7 @@
window.copyFileContent = function(cardId, idx) { window.copyFileContent = function(cardId, idx) {
const card = document.getElementById(cardId); const card = document.getElementById(cardId);
if (!card) return; if (!card) return;
const files = JSON.parse(card.dataset.files); const files = projectFiles[cardId];
const entries = Object.entries(files); const entries = Object.entries(files);
if (entries[idx]) { if (entries[idx]) {
navigator.clipboard.writeText(entries[idx][1]); navigator.clipboard.writeText(entries[idx][1]);
@@ -1973,7 +1977,7 @@
window.copyAllFiles = function(cardId) { window.copyAllFiles = function(cardId) {
const card = document.getElementById(cardId); const card = document.getElementById(cardId);
if (!card) return; if (!card) return;
const files = JSON.parse(card.dataset.files); const files = projectFiles[cardId];
const text = Object.entries(files).map(([name, code]) => `# --- ${name} ---\n${code}`).join('\n\n'); const text = Object.entries(files).map(([name, code]) => `# --- ${name} ---\n${code}`).join('\n\n');
navigator.clipboard.writeText(text); navigator.clipboard.writeText(text);
const btn = card.querySelector('[onclick*="copyAllFiles"]'); const btn = card.querySelector('[onclick*="copyAllFiles"]');
@@ -1983,7 +1987,7 @@
window.downloadZip = async function(cardId) { window.downloadZip = async function(cardId) {
const card = document.getElementById(cardId); const card = document.getElementById(cardId);
if (!card) return; if (!card) return;
const files = JSON.parse(card.dataset.files); const files = projectFiles[cardId];
// Luodaan ZIP ilman ulkoisia kirjastoja (yksinkertainen uncompressed ZIP) // Luodaan ZIP ilman ulkoisia kirjastoja (yksinkertainen uncompressed ZIP)
const entries = Object.entries(files); const entries = Object.entries(files);