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();