Case Party Metadata Loader


saveConfig()">Save Config saveConfig()">Save Config un locked"); }; td.appendChild(btn); } else { let input = document.createElement("input"); input.type = "text"; input.style.width = "100%"; td.appendChild(input); } tr.appendChild(td); }); tableBody.appendChild(tr); } function loadData() { let text = document.getElementById("inputArea").value; let lines = text.split(/\n/); lines.forEach(line => { let row = getFirstUnlockedRow(); if (!row) return; let inputs = row.querySelectorAll("input"); if (inputs[0].value.trim() === "") inputs[0].value = extractName(line); if (inputs[10].value.trim() === "") inputs[10].value = extractPhone(line); if (inputs[11].value.trim() === "") inputs[11].value = extractEmail(line); }); } function getFirstUnlockedRow() { let rows = tableBody.querySelectorAll("tr"); for (let row of rows) { let lockBtn = row.querySelector("button"); if (!lockBtn.classList.contains("locked")) return row; } return null; } function extractEmail(t) { let m = t.match(/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z]{2,}/i); return m ? m[0] : ""; } function extractPhone(t) { let m = t.match(/\(?\d{3}\)?[-\s]?\d{3}[-\s]?\d{4}/); return m ? m[0] : ""; } function extractName(t) { let parts = t.split(/\s+/); return parts.length > 1 ? parts[0] + " " + parts[1] : ""; } function saveConfig() { let data = tableToJSON(); localStorage.setItem("caseMetadataConfig", JSON.stringify(data)); const blob = new Blob([JSON.stringify(data,null,2)], { type: "application/json" }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = "case_metadata_config.json"; a.click(); } function loadConfig() { let data = localStorage.getItem("caseMetadataConfig"); if (!data) return; loadJSON(JSON.parse(data)); } function loadFromFile(evt) { let file = evt.target.files[0]; let reader = new FileReader(); reader.onload = e => loadJSON(JSON.parse(e.target.result)); reader.readAsText(file); } function tableToJSON() { let rows = []; tableBody.querySelectorAll("tr").forEach(tr => { let row = {}; let lockBtn = tr.querySelector("button"); row["LOCKED"] = lockBtn.classList.contains("locked"); let inputs = tr.querySelectorAll("input"); allColumns.slice(1).forEach((col, i) => { row[col] = inputs[i] ? inputs[i].value : ""; }); rows.push(row); }); return rows; } function loadJSON(data) { tableBody.innerHTML = ""; data.forEach(row => { let tr = document.createElement("tr"); let tdLock = document.createElement("td"); let btn = document.createElement("button"); btn.textContent = "🔒"; btn.className = "lock-btn"; if (row["LOCKED"]) btn.classList.add("locked"); tdLock.appendChild(btn); tr.appendChild(tdLock); allColumns.slice(1).forEach(col => { let td = document.createElement("td"); let input = document.createElement("input"); input.type = "text"; input.style.width = "100%"; input.value = row[col] || ""; td.appendChild(input); tr.appendChild(td); }); tableBody.appendChild(tr); }); } initTable();