aboutsummaryrefslogtreecommitdiff
/*
 * Read the file content and set the `data-preview-content` attribute on the
 * file element
 */
function read_first_n_lines(event,
			    fileelement,
			    numlines,
			    firstlineheading = true) {
    var thefile = fileelement.files[0];
    var reader = new FileReader();
    reader.addEventListener("load", (event) => {
	var filecontent = event.target.result.split(
	    "\n").slice(
		0, (numlines + (firstlineheading ? 1 : 0))).map(
		    (line) => {return line.trim("\r");});
	fileelement.setAttribute(
	    "data-preview-content", JSON.stringify(filecontent));
	display_preview(event);
    })
    reader.readAsText(thefile);
}

function remove_rows(preview_table) {
    var table_body = preview_table.getElementsByTagName("tbody")[0];
    while(table_body.children.length > 0) {
	table_body.removeChild(table_body.children.item(0));
    }
}

/*
 * Display error row
 */
function display_error_row(preview_table, error_message) {
    remove_rows(preview_table);
    row = document.createElement("tr");
    cell = document.createElement("td");
    cell.setAttribute("colspan", 4);
    cell.innerHTML = error_message;
    row.appendChild(cell);
    preview_table.getElementsByTagName("tbody")[0].appendChild(row);
}

function strip(str, chars) {
    var end = str.length;
    var start = 0
    for(var j = str.length; j > 0; j--) {
	if(!chars.includes(str[j - 1])) {
	    break;
	}
	end = end - 1;
    }
    for(var i = 0; i < end; i++) {
	if(!chars.includes(str[i])) {
	    break;
	}
	start = start + 1;
    }
    return str.slice(start, end);
}

function process_preview_data(preview_data, separator, delimiter) {
    return preview_data.map((line) => {
	return line.split(separator).map((field) => {
	    return strip(field, delimiter);
	});
    });
}

function render_preview(preview_table, preview_data) {
    remove_rows(preview_table);
    var table_body = preview_table.getElementsByTagName("tbody")[0];
    preview_data.forEach((line) => {
	var row = document.createElement("tr");
	line.forEach((field) => {
	    var cell = document.createElement("td");
	    cell.innerHTML = field;
	    row.appendChild(cell);
	});
	table_body.appendChild(row);
    });
}

/*
 * Display a preview of the data, relying on the user's selection.
 */
function display_preview(event) {
    var data_preview_table = document.getElementById("tbl:samples-preview");
    remove_rows(data_preview_table);

    var separator = document.getElementById("select:separator").value;
    if(separator === "other") {
	separator = document.getElementById("txt:separator").value;
    }
    if(separator == "") {
	display_error_row(data_preview_table, "Please provide a separator.");
	return false;
    }

    var delimiter = document.getElementById("txt:delimiter").value;

    var firstlineheading = document.getElementById("chk:heading").checked;

    var fileelement = document.getElementById("file:samples");
    var preview_data = JSON.parse(
	fileelement.getAttribute("data-preview-content") || "[]");
    if(preview_data.length == 0) {
	display_error_row(
	    data_preview_table,
	    "No file data to preview. Check that file is provided.");
    }

    render_preview(data_preview_table, process_preview_data(
	preview_data.slice(0 + (firstlineheading ? 1 : 0)),
	separator,
	delimiter));
}

document.getElementById("chk:heading").addEventListener(
    "change", display_preview);
document.getElementById("select:separator").addEventListener(
    "change", display_preview);
document.getElementById("txt:separator").addEventListener(
    "keyup", display_preview);
document.getElementById("txt:delimiter").addEventListener(
    "keyup", display_preview);
document.getElementById("file:samples").addEventListener(
    "change", (event) => {
	read_first_n_lines(event,
			   document.getElementById("file:samples"),
			   30,
			   document.getElementById("chk:heading").checked);
    });