Include plate templates metadata to the protocol import/export [SCI-8354] (#5348)

This commit is contained in:
ajugo 2023-05-03 16:38:07 +02:00 committed by GitHub
parent 5eacd41ca5
commit 2b82b6a74e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 83 additions and 60 deletions

View file

@ -1,76 +1,69 @@
/* eslint-disable no-unused-vars */
function hex2a(hexx) { function hex2a(hexx) {
var hex = hexx.toString(); // Force conversion const hexString = hexx.toString(); // Force conversion
var str = ""; let asciiString = '';
for (var i = 0; i < hex.length; i += 2) { for (let i = 0; i < hexString.length; i += 2) {
str += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); asciiString += String.fromCharCode(parseInt(hexString.substr(i, 2), 16));
} }
return str; return asciiString;
} }
function generateElnTable(id, content) { function getMetadataCellValue(jsonData, row, col) {
/*********************************************/ if (jsonData == null) return '';
/* INNER FUNCTIONS */
/*********************************************/
function colName(n) {
var ordA = "A".charCodeAt(0);
var ordZ = "Z".charCodeAt(0);
var len = ordZ - ordA + 1;
var s = ""; const key = `${row}:${col}`;
while(n >= 0) { for (let i = 0; i < jsonData.length; i += 1) {
s = String.fromCharCode(n % len + ordA) + s; const item = jsonData[i];
const itemKey = `${item.row}:${item.col}`;
if (itemKey === key) {
return item.className;
}
}
return null;
}
function generateElnTable(content, tableMetadata) {
function colName(n) {
const asciiA = 'A'.charCodeAt(0);
const asciiZ = 'Z'.charCodeAt(0);
const len = (asciiZ - asciiA) + 1;
let name = '';
while (n >= 0) {
name = String.fromCharCode((n % len) + asciiA) + name;
n = Math.floor(n / len) - 1; n = Math.floor(n / len) - 1;
} }
return s; return name;
} }
/*********************************************/ const decodedContent = hex2a(content);
/* ACTUAL FUNCTION CODE */ const isPlateTemplate = tableMetadata.plateTemplate === 'true';
/*********************************************/ const tableData = JSON.parse(decodedContent);
var txt = hex2a(content); const numRows = tableData.data.length + 1;
var jstr = JSON.parse(txt); const numCols = tableData.data[0].length + 1;
var rows = jstr.data.length + 1; let tableRows = '';
var cols = jstr.data[0].length + 1;
var str = rows + "|" + cols; for (let i = 0; i < numRows; i += 1) {
let tableCells = '';
var html_s = "<table class='table table-bordered eln-table'><tbody>"; for (let j = 0; j < numCols; j += 1) {
var html_e = "</tbody></table>"; let cellData = '';
let cellClass = getMetadataCellValue(tableMetadata.cells, i - 1, j - 1);
var tr = ""; if (i > 0 && j > 0 && tableData.data[i - 1][j - 1] !== null) {
for (var i = 0; i < rows; i++) { cellData = tableData.data[i - 1][j - 1];
var tr_s = "<tr>"; } else if (i === 0 && j !== 0) {
var th = ""; cellData = isPlateTemplate ? j.toString() : colName(j - 1);
var d = ""; } else if (j === 0 && i !== 0) {
var d_str = ""; cellData = isPlateTemplate ? colName(i - 1) : i.toString();
for (var j = 0; j < cols; j++) {
if ((i > 0) && (j > 0)) {
if (jstr.data[i - 1][j - 1] !== null) {
d = jstr.data[i - 1][j - 1];
d_str = "<td>" + d;
} else {
d = "";
d_str = "<td>" + d;
}
} else {
if ((i == 0) && (j == 0)) {
d = "";
d_str = "<td>" + d;
} else if (i == 0) {
d = colName(j - 1);
d_str = "<td>" + d;
} else {
d = i.toString();
d_str = "<td style='width: 60px;'>" + d;
}
} }
th = th + d_str + "</td>"; tableCells = `${tableCells}<td ${cellClass ? `class="${cellClass}"` : ''}>${cellData}</td>`;
} }
var tr_e = "</tr>";
tr = tr + tr_s + th + tr_e; tableRows = `${tableRows}<tr>${tableCells}</tr>`;
} }
var html = html_s + tr + html_e;
return $.parseHTML(html); return $.parseHTML(`<table class="table table-bordered eln-table"><tbody>${tableRows}</tbody></table>`);
} }

View file

@ -260,13 +260,14 @@ function importProtocolFromFile(
var tableId = $(tableNode).attr('id'); var tableId = $(tableNode).attr('id');
var tableName = $(tableNode).children('name').text(); var tableName = $(tableNode).children('name').text();
var tableContent = $(tableNode).children('contents').text(); var tableContent = $(tableNode).children('contents').text();
var tableMetadata = JSON.parse($(tableNode).children('metadata').text()) || {};
// Generate table element // Generate table element
var tableEl = newPreviewElement( var tableEl = newPreviewElement(
'table', 'table',
{ name: tableName } { name: tableName }
); );
var elnTableEl = generateElnTable(tableId, tableContent); var elnTableEl = generateElnTable(tableContent, tableMetadata);
tableEl.append(elnTableEl); tableEl.append(elnTableEl);
// Now, append table element to step // Now, append table element to step

View file

@ -1,3 +1,6 @@
// scss-lint:disable SelectorDepth
// scss-lint:disable NestingDepth
@import "constants"; @import "constants";
@import "mixins"; @import "mixins";
@import "main_navigation"; @import "main_navigation";
@ -863,8 +866,34 @@ ul.content-activities {
width: 100%; width: 100%;
.eln-table { .eln-table {
text-align: center;
height: 21px; height: 21px;
tr:first-child {
text-align: center;
}
td {
&.htCenter,
&:first-child {
text-align: center;
}
&.htRight {
text-align: right;
}
&.htJustify {
text-align: justify;
}
&.htMiddle {
vertical-align: middle;
}
&.htBottom {
vertical-align: bottom;
}
}
} }
.badge-preview { .badge-preview {